Showing posts with label SharePoint 2013. Show all posts
Showing posts with label SharePoint 2013. 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

Get app web and host web title using jQuery promises in SharePoint hosted app

In my previous post, I talked about getting the app web title using jQuery promises. In this post we will talk about how to get the app web as well as host web title using jQuery promises in SharePoint hosted app.

Below is the simple code to get the title of both the web.

 var def = $.Deferred();  
 $(document).ready(function () {  
   var promise = GetHostWebTitle();  
   promise.then(  
     function (hostTitle, appTitle) { $('#message').text("Host web title : " + hostTitle+ ". App web Title : "+ appTitle) },  
     function (result) { $('#message').text("Error :" + result) }  
     );  
 });  
 var appContext;  
 var hostContext;  
 var hostWeb;  
 var appWeb;  
 function GetHostWebTitle() {  
   //Get the host web url from query string  
   var hostUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));  
   //Get context fro host web and app web  
   appContext = SP.ClientContext.get_current();  
   hostContext = new SP.AppContextSite(appContext, hostUrl);  
   //Get the abb web and host web  
   appWeb = appContext.get_web();  
   hostWeb = hostContext.get_web();  
   appContext.load(appWeb, "Title");  
   appContext.load(hostWeb, "Title");  
   appContext.executeQueryAsync(onHostWebSuccess, onHostWebFailed);  
   return def.promise();  
 }  
 function onHostWebSuccess(sender, args) {  
   var hostWebTitle = hostWeb.get_title();  
   var appWebTitle = appWeb.get_title();  
   def.resolve(hostWebTitle, appWebTitle);  
 }  
 function onHostWebFailed(sender, args) {  
   def.reject(args.get_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];  
   }  
 }  

Once you run the above code, you will get the error as Access Denied on host web.












To resolve this issue, make sure you grant read access to the host web using AppManifest file.












Once you granted the access, the output result will show you the host web and app web title.














In the above example we are getting the host web context by using the below line.

 hostContext = new SP.AppContextSite(appContext, hostUrl); 

Also, you can pass multiple parameters when your deferred is resolved. In the above example, I am passing two parameters to the call back function.

 def.resolve(hostWebTitle, appWebTitle);  

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


Wednesday, July 15, 2015

Setup a development environment for Apps in SharePoint 2013

As Apps require a DNS entry, it is difficult to create a DNS entry for development environment. Below is the post which will guide you to setup a development environment for apps without DNS entry(using hosts file).

1. Add entry in hosts file.

Add a below entry in hosts file (C:\Windows\Systems32\drivers\etc)

127.0.0.1    apps.servername.com

where servername.com is Full Computer Name(which we can get by using Computer Properties)
















2. Modify Registry entry

Open the registry editor by typing regedit in the command prompt.
Navigate to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
Add a new DWORD with Key  DisableLoopbackCheck
Edit and set its value to 1 (Decimal)
Re-Start your machine

3. Start the service

Run the below command in SharePoint powershell to start Admin, Timer , Apps and Subscription service

 net start spadminv4  
 net start sptimerv4  
 Get-SPServiceInstance | where{$_.GetType().Name -eq "AppManagementServiceInstance" -or $_.GetType().Name -eq "SPSubscriptionSettingsServiceInstance"} | Start-SPServiceInstance  


4. Create a app management and substription service application

 $account = Get-SPManagedAccount "domain\user"   
 $appPoolSubSvc = New-SPServiceApplicationPool -Name SettingsServiceAppPool -Account $account  
 $appPoolAppSvc = New-SPServiceApplicationPool -Name AppServiceAppPool -Account $account  
 $appSubSvc = New-SPSubscriptionSettingsServiceApplication -ApplicationPool $appPoolSubSvc -Name SettingsServiceApp -DatabaseName SettingsServiceDB   
 $proxySubSvc = New-SPSubscriptionSettingsServiceApplicationProxy -ServiceApplication $appSubSvc  
 $appAppSvc = New-SPAppManagementServiceApplication -ApplicationPool $appPoolAppSvc -Name AppServiceApp -DatabaseName AppServiceDB  
 $proxyAppSvc = New-SPAppManagementServiceApplicationProxy -ServiceApplication $appAppSvc  

where domain\user is the managed account name

5. Setup app domain 

Go to central administration site. On left navigation click "Apps".
Click on Configure App URLs in App Management.
Setup the app domain














You can also use below command to setup using powershell.

 Set-SPAppDomain "app.servername.com"  
 Set-SPAppSiteSubscriptionName -Name "app" -Confirm:$false  

6. Create an App

Open visual studio and create a new project, give a name as HelloWorldApp

















Provide the name of app.
Provide the development site SharePoint url
Select SharePoint-hosted as a hosts

















Click Finish.

Run the solution by clicking F5. The solution will run and you can see the app.




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'",

    An Introduction : REST in SharePoint 2013

    SharePoint 2013 introduces a Representational State Transfer (REST) service.  You can interact remotely with SharePoint data by using any technology that supports REST web requests. You can now perform Create, Read, Update, and Delete (CRUD) operations for SharePointfrom remote application using REST web technologies and standard Open Data Protocol (OData) syntax. The remote application must be obtain autorized access. Check this MSDN article that covers Authorization and Authentication using ODATA. REST also used Client.svc to perform SharePoint Operations.

    To use REST capabilities, you need contruct the HTTP request using OData standard.

    If you want to do this to an endpoint
    Use this HTTP request
    Read a resource
    GET
    Create or update a resource
    POST
    Use POST to create entities such as lists and sites. The SharePoint 2013 REST service supports sending POSTcommands that include object definitions to endpoints that represent collections.
    For POST operations, any properties that are not required are set to their default values. If you attempt to set a read-only property as part of a POST operation, the service returns an exception.
    Update or insert a resource
    PUT
    Use PUT and MERGE operations to update existing SharePoint objects.
    Any service endpoint that represents an object property set operation supports both PUT requests andMERGE requests.
    ·         For MERGE requests, setting properties is optional; any properties that you do not explicitly set retain their current property.
    ·         For PUT requests, if you do not specify all required properties in object updates, the REST service returns an exception. In addition, any optional properties you do not explicitly set are set to their default properties.
    Delete a resource
    DELETE
    Use the HTTP DELETE command against the specific endpoint URL to delete the SharePoint object represented by that endpoint.
    In the case of recyclable objects, such as lists, files, and list items, this results in a Recycle operation.

    URI structure:


    To access SharePoint resource, you must build the URI endpoint. Check the image for URI syntax





    OData Query operators supported in SharePoint 2013:

    Supported
    Not supported
    Numeric comparisons
       Lt
       Le
       Gt
       Ge
       Eq
       Ne
    Arithmetic operators
    (Add, Sub, Mul, Div, Mod)
    Basic math functions
    (round, floor, ceiling)
    String comparisons
      startsWith
      substringof
      Eq
      Ne
    endsWith
    replace
    substring
    tolower
    toupper
    trim
    concat
    Date and time functions
      day()
      month()
      year()
      hour()
      minute()
      second()
    DateTimeRangesOverlap operator
    Querying as to whether a date time falls inside a recurrent date time pattern

    The figure below shows the supported OData query options.

    In The next few posts, I will perform some basic operation using REST api.

    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.

    Tuesday, June 3, 2014

    Quick Launch Accordion with arrow in SharePoint 2013

    Modifying the master page

    • On the head tag of master page html add below lines
    <!--SPM:<SharePoint:ScriptLink Name="~sitecollection/Style Library/jquery.js" runat="server"/>-->
    <!--SPM:<SharePoint:ScriptLink Name="~sitecollection/Style Library/master.js" runat="server"/>-->

    • Add a link to Custom Css in master page.
    • On the head tag of master page html add below highlight lines
    <!--SPM:<SharePoint:CssRegistration Name="Themable/corev15.css" runat="server"/>-->

    <!--SPM:<SharePoint:CssRegistration Name="https://portal.sharepoint.com/Style Library/Master.css" runat="server" After="corev15.css" />-->

    • In your Custom master.css file, add the below CSS classes
    .imgAlign
     {
     padding-right:5px;
     padding-top:5px;
     padding-bottom:3px;

     }

    Modify the javascript file

    • On the master.js file add the below code.

    jQuery(function($){  
      jQuery('.ms-core-listMenu-verticalBox ul.root > li > a').each(function ()  
      {  
         jChildren = jQuery(this).next('ul');  
         if(jChildren.length!=0)  
         {  
            $(this).find("span.menu-item-text").prepend("<img src='/Style Library/PMO/plusArrow.png' border='0' class='imgAlign' />");  
         }  
      });  
      var jChildrens = jQuery('.ms-core-listMenu-verticalBox ul.root ul');  
       //Expand Active Parent node  
       var selectedIndex = -1;  
       for(var i=0; i < jChildrens.length; i++) {  
         jChidlren = jQuery(jChildrens[i]);  
         if(jChidlren.find('li.selected').length > 0) {  
           selectedIndex = i;  
           break;  
         }  
       }  
       jChildrens.hide();  
       if(selectedIndex!=-1)  
       {  
        jChildrens.eq(selectedIndex).parent("li").find("img.imgAlign").attr("src","/Style Library/PMO/minusArrow.png");  
        jChildrens.eq(selectedIndex).slideDown();  
       }  
       //Parents  
       jQuery('.ms-core-listMenu-verticalBox ul.root > li > a').click(function (e) {  
         jChildren = jQuery(this).next('ul');  
         if(jChildren.length!=0)  
         {  
          e.preventDefault();  
          $(this).find("img.imgAlign").attr("src","/Style Library/PMO/plusArrow.png");  
          jChildrens.slideUp();  
          if (jChildren.is(':visible') == false)  
          {  
          $(this).find("img.imgAlign").attr("src","/Style Library/PMO/minusArrow.png");  
            jChildren.slideDown();  
          }  
         }  
       });  
     });  
    

    Arrow Images



    Expanded




    Collapsed: