Showing posts with label Javascript object model. Show all posts
Showing posts with label Javascript object model. Show all posts

Monday, November 9, 2015

Using AngularJS and REST to display list data in SharePoint hosted app

AngularJS is now best way to work on the MVC pattern at client side. In this post, I will walk you through how we can display the data from a SharePoint list in a SharePoint hosted app using AngularJS and SharePoint REST. My assumption is that you have basic understanding of AngularJS and SharePoint REST.
  • Create a SharePoint hosted app.
  • Create a Contacts List in app web.
  • Add a reference of AngularJS to default.aspx
In the default.aspx, add the below code.

  <div ng-app="myApp">  
     <div ng-controller="customersCtrl">  
       <table>  
         <tr>  
           <th>Last Name</th>  
           <th>First Name</th>  
         </tr>  
         <tr ng-repeat="x in Contacts">  
           <td>{{ x.Title }}</td>  
           <td>{{ x.FirstName }}</td>  
         </tr>  
       </table>  
     </div>  
   </div>  

In the above code, ng-app is used to specify that its an AngularJS app and ng-controller is the controller.

Add the below code in the App.JS file.


 'use strict';  
 var myapp = angular.module('myApp', []);  
 myapp.controller('customersCtrl', function ($scope, $http) {  
   var restUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getByTitle('Contacts')/items?$select=Title,FirstName"; 
   $http({  
     method: "GET",  
     url: restUrl,  
     headers: { "Accept": "application/json;odata=verbose" }  
   }).success(function (data) {  
     $scope.Contacts = data.d.results;  
   }).error(function (sender,args) {  
     alert("Error:" + args.message);  
   });  
 });  
 function getQueryStringParameter(paramToRetrieve) {  
   var params =  
   document.URL.split("?")[1].split("&");  
   var strParams = "";  
   for (var i = 0; i < params.length; i = i + 1) {  
     var singleParam = params[i].split("=");  
     if (singleParam[0] == paramToRetrieve)  
       return singleParam[1];  
   }  
 }  

Change the restUrl to below if you wanted to query Host Web.

   var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));

   var restUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/SP.AppContextSite(@target)" + "/web/lists/getbytitle('Contacts')/items?$select=Title,FirstName,Company" +  "&@target='" + hostUrl + "'";


In the above code, we are getting the results from the contacts lists and assigning it to Contacts collection of $scope.
Add few items in the contacts lists by navigating to Lists/Contacts url






















Run the code, the results of the code is something like below


Wednesday, November 4, 2015

Using jQuery Deferred and Promises in SharePoint Hosted App

jQuery promises are awesome when you wanted to work with aysnc calls in SharePoint hosted app.

Below is the simple example to get the App web title in SharePoint 2013 using jQuery Promises.

 var def = $.Deferred();  
 $(document).ready(function () {  
   var promise = GetAppWeb();  
   promise.then(  
     function (result) { $('#message').text("The app web title is " + result) },  
     function (result) { $('#message').text("Error :" + result) }  
     );  
 });  
 var appContext;  
 var appWeb;  
 function GetAppWeb()  
 {  
   appContext = SP.ClientContext.get_current();  
   appWeb = appContext.get_web();  
   appContext.load(appWeb);  
   appContext.executeQueryAsync(onAppWebSuccess, onAppWebFailed);  
   return def.promise();  
 }  
 function onAppWebSuccess(sender, args)  
 {  
   var title = appWeb.get_title();  
   def.resolve(title);  
 }  
 function onAppWebFailed(sender,args)  
 {  
   def.reject(args.get_message());  
 }  

You can also use .done and .fail instead of .then function. The output of the above solution is as below


Monday, March 16, 2015

Date column showing incorrect value for different timezone using javascript object model in SharePoint 2013

When you have multiple users in different zones, you will see the date value varies based on different timezone. The date which we are getting using javascript object model shows the local computer time and not the server time.

Suppose I have a list with column named "DateCompleted". I have added a new row with DateCompleted as 3/16/2015 12:00 AM.

When you use javascript client object model and display the date in web page. The result for teh below lines varies by differnt timezone.

var dateCompleted = oListItem.get_item('DateCompleted');

EST Timezone = > dateCompleted =  3/16/2015 12:00 AM.   (Server time)
PST Timezone = > dateCompleted =  3/15/2015 09:00 PM. 

To resolve the issue and display always the server time, you need to query the list again and use SP.Utilities.Utility.formatDateTime function. 

Below is the code you can refer to get the server time.

1:    var ctx = new SP.ClientContext(spotTargetSiteUrl);  
2:    var web = ctx.get_web();  
3:    var dateCompleted = oListItem.get_item('DateCompleted');  
4:    var dateStr = SP.Utilities.Utility.formatDateTime(ctx, web, dateCompleted, SP.Utilities.DateTimeFormat.dateOnly);  
5:    ctx.executeQueryAsync(  
6:       function (sender, data) {  
7:            // the below line will give you the server time  
8:           var serverDateCompleted = new Date(dateStr.m_value);  
9:       },  
10:       function (sender, args) {  
11:         ULSOnError(args.get_message(), document.location.href, 0);  
12:       }  
13:       );  

The line 8 above will give you the server time.

Hope this post will help you in resolving the date issue for different timezone.

Happy coding!!!!

Tuesday, June 24, 2014

Create Lookup Site Column using Javascript object model in SharePoint 2013 / 2010

Sometimes we need to create a lookup column as a site column to use it in different list or use it in a content type. Below is a simple code to create a Lookup site column using javascript object model. The code works in both SharePoint 2010 and SharePoint 2013 environment.


 jQuery(function($) {   
        CreateSiteLookupColumn();   
 });   
      var clientContext;  
      var oWebSite;  
      var oList;  
      function CreateSiteLookupColumn()  
      {  
         clientContext= new SP.ClientContext.get_current();   
         oWebSite= clientContext.get_web();  
         //Lookup List  
         oList=oWebSite.get_lists().getByTitle('Countries');  
         clientContext.load(oList);  
         clientContext.load(oWebSite);  
         clientContext.executeQueryAsync(function () {  
                 var fieldXml="<Field Name='Country' DisplayName='Country' Type='Lookup' Required='FALSE' Group='Operations'/>";  
                 var lookupField=oWebSite.get_fields().addFieldAsXml(fieldXml,true,SP.AddFieldOptions.addFieldCheckDisplayName);  
                //Cast to Lookup field to set List Name and lookup column       
                 var fieldLookup = clientContext.castTo(lookupField, SP.FieldLookup);  
                 fieldLookup.set_lookupList(oList.get_id());  
                 fieldLookup.set_lookupField("Title");  
                 fieldLookup.update();              
                 clientContext.executeQueryAsync(function () {   
                         alert('Field Added');   
                      }, function (sender, args) {   
                            alert(args.get_message() + '\n' + args.get_stackTrace());   
                      });   
         },function (sender, args) {   
          alert(args.get_message() + '\n' + args.get_stackTrace());   
      });     
 }  

Friday, June 20, 2014

Get list items using REST in SharePoint 2013

While using REST in SharePoint, the most important thing is to build the URI. The format of URI is discussed in my last post. Now lets work with the URI format to return different results from list.

Lets create a Contacts list with one more additional column DOB of type Date. Add few items in it, the list will look like below.

  • Get all the items from list


 jQuery(function($) {  
       ReadAllItems();  
 });  
 function ReadAllItems()  
 {  
      jQuery.ajax({  
           url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items",  
           type:"GET",  
            headers: { "Accept": "application/json; odata=verbose" },  
        success: function (data) {  
           DisplayItems(data);  
     },  
     error: function (err) {  
       alert(JSON.stringify(err));  
     }  
      });  
 }  
 function DisplayItems(data)  
 {  
   var results = data.d.results;  
   var html="<table width='70%'><tr><td>ID</td><td>FirstName</td><td>LastName(Title)</td><td>Company</td><td>DOB</td>"  
   for(var i=0; i<results.length; i++) {  
           html+="<tr>"      
     html+="<td>"+results[i].ID+ "</td>";  
     html+="<td>"+results[i].FirstName+ "</td>";  
     html+="<td>"+results[i].Title+ "</td>";  
     html+="<td>"+results[i].Company+ "</td>";  
     html+="<td>"+results[i].DOB+ "</td>";  
     html+="</tr>"      
   }  
   html+="</table>";  
   $('#divMain').html(html);  
 }  

The result of above code will look like this 


  •  Get All Items with selected columns
Get the columns which are required by using $select 
Replace the url paramter above with the code below

url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
        +"?$select=Id,FirstName",






  • Order by FirstName ASC
url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
+"?$select=Id,FirstName,Title,Company,DOB"
+"&$orderby=FirstName",
  • Order by FirstName DESC
url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
+"?$select=Id,FirstName,Title,Company,DOB"
+"&$orderby=FirstName desc",
  • Get The Top rows
url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
+"?$select=Id,FirstName,Title,Company,DOB"
+"&$top=2",
  • Filter by Column
url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
+"?$select=Id,FirstName,Title,Company,DOB"
+"&$filter=FirstName eq 'Akash'",
  • Startswith
url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
+"?$select=Id,FirstName,Title,Company,DOB"
+"&$filter=startswith(FirstName,'Ak')",

  • Substringof
url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
+"?$select=Id,FirstName,Title,Company,DOB"
+"&$filter=substringof('k',FirstName)",
  • AND Condition
url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
+"?$select=Id,FirstName,Title,Company,DOB"
+"&$filter=startswith(FirstName,'A') and Title eq 'Karda'",
  • OR Condition
url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
+"?$select=Id,FirstName,Title,Company,DOB"
+"&$filter=startswith(FirstName,'N') or Title eq 'Karda'",
    • Date Time Column Filter 
    url:_spPageContextInfo.siteAbsoluteUrl+"/_api/web/lists/getByTitle('Contacts')/items"
    +"?$select=Id,FirstName,Title,Company,DOB"
    +"&$filter=DOB eq '2012-05-17T07:00:00Z'",

    How to perform operations using Javascript Object Model and SharePoint

    Paging in list items using javascript object model in SharePoint 2013

    Paging can be useful when you want to improve the performance of page. Using javascript object model, you can implement the paging in apps or in any custom page. Below is the example of paging with page size 2 and paging can be perform by Load more button.

    Html code to be added in web page.

     <div id="divMain"></div>  
     <input id="btnMore" type="button" value="Load More" onclick="LoadMore()"></input>  
    

    Javascript code to perform paging using javascipt object model and jQuery


     var context;  
     var oList;  
     var oListItems;  
     var query;  
     jQuery(function($) {  
           var scriptbase = _spPageContextInfo.webServerRelativeUrl + "_layouts/15/";   
          $.getScript(scriptbase + "SP.js", GetListItems);  
     });  
     function GetListItems() {  
       context = SP.ClientContext.get_current();  
       oList = context.get_web().get_lists().getByTitle('Colors');  
       query = new SP.CamlQuery();  
       //Do specify the row limit  
       query.set_viewXml("<View><ViewFields><FieldRef Name='Title'/></ViewFields><RowLimit>2</RowLimit></View>");  
       oListItems = oList.getItems(query);  
       context.load(oListItems);  
       context.executeQueryAsync(onQuerySucceeded,onQueryFailed);  
     }  
     function onQuerySucceeded() {  
       var listEnumerator = oListItems.getEnumerator();  
       var message="";  
       while (listEnumerator.moveNext()) {  
          message+=listEnumerator.get_current().get_item("Title")+"<br/>";  
        }  
        $("#divMain").append(message);  
           var position = oListItems.get_listItemCollectionPosition();  
           if (position == null)  
           {  
                $("#btnMore").hide();  
           }  
     }  
     function onQueryFailed(sender, args) {  
       alert('Error: ' + args.get_message() + '\nStackTrace: ' + args.get_stackTrace());  
     }  
     function LoadMore()  
     {  
           //Get the id of the last item with paging info  
           var position = oListItems.get_listItemCollectionPosition();  
       //If no items present, position will be null  
       if (position != null) {  
         query.set_listItemCollectionPosition(position);  
         oListItems = oList.getItems(query);  
            context.load(oListItems);  
            context.executeQueryAsync(onQuerySucceeded,onQueryFailed);  
       }   
     }  
       
    
    Below is the result of paging with 5 items (page size=2)

    Thursday, June 19, 2014

    Adding Item to list with Managed Metadata Column using Javascript Client Object Model in SharePoint 2013

    On my previous post, I went through how to create term group, term set and terms in SharePoint 2013 using javascript object model. 

    In this post, I will utilize that term set and then will check how to create item which contain Managed metadata Column.

    Create a list will Managed Metadata Column






    To update managed metadata column, you need to get the associate termSet for the column and also get the term Id from that termset.

    Below is the code to add the item with managed metadata column. Read Comments in code for more description.


     jQuery(function($) {  
          var scriptbase = _spPageContextInfo.webServerRelativeUrl + "_layouts/15/";  
          $.getScript(scriptbase + "SP.Runtime.js",  
         function () {  
           $.getScript(scriptbase + "SP.js", function(){  
                $.getScript(scriptbase + "SP.Taxonomy.js", ExecuteTaxonomyFunctions);  
           });  
         }  
       );  
     });  
     function ExecuteTaxonomyFunctions()  
     {  
          var context = SP.ClientContext.get_current();  
          var list = context.get_web().get_lists().getByTitle("Resources");  
        
          var field = list.get_fields().getByInternalNameOrTitle("ResourceType");  
          var txField = context.castTo(field, SP.Taxonomy.TaxonomyField);  
          context.load(field);  
          context.load(txField);  
          //Get the response from server to get the termsetId  
          context.executeQueryAsync(function(){  
            //Get the term set ID  
               var termSetId = txField.get_termSetId().toString();  
               var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(context);  
               var termStore = taxSession.getDefaultSiteCollectionTermStore();  
               var termSet = termStore.getTermSet(termSetId);  
       
               // Get the matching terms based on names  
               var lmi = new SP.Taxonomy.LabelMatchInformation(context);  
               lmi.set_lcid(1033);  
               lmi.set_trimUnavailable(true);  
               lmi.set_termLabel("UI Developer");  
                    
               var termMatches = termSet.getTerms(lmi);  
               context.load(termMatches);  
               //Get the matching term and then add to list item  
               context.executeQueryAsync(function () {  
               if (termMatches && termMatches.get_count() > 0)  
               {  
                   // Get the first matching term. As I know it has only one  
                   // You need to iterate and get the correct term if you have same name terms  
                   var term = termMatches.get_item(0);  
                  
                  // Add Item to list   
                   var itemCreateInfo = new SP.ListItemCreationInformation();  
                   var oListItem = list.addItem(itemCreateInfo);  
                   oListItem.set_item('Title', 'Akash Karda');  
                   var termFieldValue = new SP.Taxonomy.TaxonomyFieldValue();  
                   termFieldValue.set_label(term.get_name());  
                   termFieldValue.set_termGuid(term.get_id().toString());  
                   termFieldValue.set_wssId(-1);  
                   txField.setFieldValueByValue(oListItem, termFieldValue);  
                   oListItem.update();       
       
                   context.executeQueryAsync(function () {  
                     alert('Item Added');  
                    }, function (sender, args) {  
                      alert(args.get_message() + '\n' + args.get_stackTrace());  
                    });  
       
               }  
             }, function (sender, args) {  
                alert(args.get_message() + '\n' + args.get_stackTrace());  
             });  
          },function(sender,args){  
               alert(args.get_message());  
          });  
     }  
       
    
    Item Added to List

    Working with Taxonomy and Javascript object model in SharePoint 2013

    In SharePoint 2010, it was not possible to work with taxonomy types using javascript object model. SharePoint 2013 has introduced a new feature to work with taxonomy by using SP.Taxonomy.js

    Here are some basic operations of taxonomy using javascipt object model.
    1. Create a taxonomy Term Group
    2. Create a taxonomy Term Set
    3. Create taxonomy Terms
    4. Read taxonomy group, termset and terms.


     var groupGuid="cd90a241-2737-48f7-b5a3-43fab9cdc0cb";  
     var termSetGuid="552ae870-07ce-4934-b5c7-c068022a6873";  
     jQuery(function($) {  
          var scriptbase = _spPageContextInfo.webServerRelativeUrl + "_layouts/15/";  
          $.getScript(scriptbase + "SP.Runtime.js",  
         function () {  
           $.getScript(scriptbase + "SP.js", function(){  
                $.getScript(scriptbase + "SP.Taxonomy.js", ExecuteTaxonomyFunctions);  
           });  
         }  
       );  
     });  
     function ExecuteTaxonomyFunctions()  
     {  
          CreateTaxonomyGroup();  
          CreateTermSet();  
          CreateTerms();  
          ReadTerms();  
     }  
     function CreateTaxonomyGroup()  
     {  
          var context = SP.ClientContext.get_current();  
          //Get the taxonomy session object  
       var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(context);  
       //Get the default termstore for the site collection  
       var termStore =taxSession.getDefaultSiteCollectionTermStore();  
          //New group with new guid  
          var newGroup = termStore.createGroup("IT",groupGuid);  
          context.load(newGroup);  
          context.executeQueryAsync(function(){  
                alert("Group Created with Name : "+ newGroup.get_name());  
          },function(sender,args){  
               alert(args.get_message());  
          });  
     }  
     function CreateTermSet()  
     {  
       var context = SP.ClientContext.get_current();  
       //Get the taxonomy session object  
       var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(context);  
       //Get the default termstore for the site collection  
       var termStore =taxSession.getDefaultSiteCollectionTermStore();  
       //Get the term group just created by using GUID  
       var termGroup= termStore.getGroup(groupGuid);  
       //Create a termset with new GUID, 1033 is lcid for US English  
       var termSet= termGroup.createTermSet("Developers", termSetGuid, 1033);  
            context.load(termSet);  
          context.executeQueryAsync(function(){  
                alert("Term Set Created with Name : "+ termSet.get_name());  
          },function(sender,args){  
               alert(args.get_message());  
          });  
     }  
     function CreateTerms()  
     {  
       var context = SP.ClientContext.get_current();  
       //Get the taxonomy session object  
       var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(context);  
       //Get the default termstore for the site collection  
       var termStore =taxSession.getDefaultSiteCollectionTermStore();  
       //Get the term group just created by using GUID  
       var termGroup= termStore.getGroup(groupGuid);  
          //Get the termset by GUID  
          var termSet=termStore.getTermSet(termSetGuid);  
          //Create term with new GUID  
          var term1= termSet.createTerm("Developer", 1033, "1c88007a-b6f0-4175-b91b-ac02f95376d9");  
          var term2= termSet.createTerm("UI Developer", 1033, "676186d9-434e-4998-a050-18043ab66d08");  
           context.load(term1);  
           context.load(term2);  
          context.executeQueryAsync(function(){  
                alert("Term Created with Names : "+ term1.get_name()+ "," + term2.get_name());  
          },function(sender,args){  
               alert(args.get_message());  
          });  
     }  
     function ReadTerms()  
     {  
          var context = SP.ClientContext.get_current();  
          //Get the taxonomy session object  
       var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(context);  
       //Get the default termstore for the site collection  
       var termStore =taxSession.getDefaultSiteCollectionTermStore();  
       //Get the term group just created by using GUID  
       var termGroup= termStore.getGroup(groupGuid);  
          //Get the termset by GUID  
          var termSet=termStore.getTermSet(termSetGuid);  
          var terms= termSet.getAllTerms();  
          context.load(termGroup);  
          context.load(termSet);  
          context.load(terms);  
          context.executeQueryAsync(function(){  
                var result = "Group:"+ termGroup.get_name()+" \n";  
                result+= "Term Set:"+ termSet.get_name()+" \n";  
                var termEnumerator = terms.getEnumerator();  
                result+= "Terms: \n";  
                    while(termEnumerator.moveNext()){  
                         var currentTerm = termEnumerator.get_current();  
                         result+= currentTerm.get_name() + "\n";  
                    }   
           alert(result);  
          },function(sender,args){  
               alert(args.get_message());  
          });  
     }  
    

    Below is the result snapshot of terms created.

    I added a another post which shows you how to add item in list which contain metadata column using javascript object model.