Pages

Monday, April 17, 2017

“List 'User Information List' does not exist at site with URL” exception for users with member permission

Introduction

I was using SharePoint rest api in order to retrieve all the departments through user information list.

Problem

I was using

_spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('User Information List')/Items?$select=Department";

for the rest query. When I logged in as a site collection administrator, I got expected results.

But when I logged in as a site member I got the below exception.

List 'User Information List' does not exist at site with URL '<site url>'. 

List 'User Information List' does not exist at site with URL

Solution

Instead of using the above I used the below url and I got the expected results for users with the member permission as well.

_spPageContextInfo.webAbsoluteUrl + "_api/web/SiteUserInfoList/items?select=Department"

Wednesday, April 12, 2017

Convert SharePoint Online based SharePoint Hosted Add-in to SharePoint 2013 On premises based one

Introduction

We used SharePoint Online based template in Visual Studio 2015 in order to develop SharePoint hosted add-in.

Problem

Our client’s requirement is to deploy it in the SharePoint 2013 On premise. So we had to convert the solution.

Solution

Step 01:

  • Right click on AppManifest.xml and click on View Code.
  • Then change the SharePointMinVersion to 15.0.0.0

image

Step 02:

  • Double click on on Package.package under Package folder.
  • There you will find SharePoint Product Version. Change it to 15.0.

image

 

Conclusion

Now you can publish the solution and deploy to SharePoint 2013 On premise.

 

Thursday, March 16, 2017

Add Web Application property bag using Power Shell and use them in SharePoint timer job

Introduction

SharePoint Web Application level property bag is used to store configuration setting data and information. I make use of the property bag when I write a timer job.

I store value in property bag as key, value using power shell and using C# server object model I retrieve and make use of it.

Set Web Application Level Property Bag

You can create a function in Power shell

 function SetWebApplicationPropertyBag ($webAppUrl, $key, $value) {

	$Web = Get-SPWebApplication -Identity $webAppUrl
	$Web.Properties.Add($key,$value) #add property bag
	$Web.Update()

	Write-host "Created new Property:" $Web.Properties[$key]
 
 }

And you can call the function like this.

$webAppUrl ="Web Application url goes here"
$PropertyName1 ="Key"
$PropertyValue1 ="Value"

SetWebApplicationPropertyBag $webAppUrl $PropertyName1 $PropertyValue1

You have to change the values of $webAppUrl, $PropertyName1 and #PropertyValue1.

Copy paste code in SharePoint Management shell and your web application property will be created.

Retrieve property bag value in SharePoint Timer Job

Since SharePoint Timer Jobs are created with the feature, in Web Application level scope, we can use the below code to retrieve the data.

var value = WebApplication.Properties["Key"].ToString();

You can make use of value and do operations.

Remove Property Bag

You can use below code to remove a value from property bag.

$Web = Get-SPWebApplication -Identity "Web Application Url"

$Web.Properties.Remove("Key")

$Web.Update()

Thursday, March 9, 2017

Change the Language of SharePoint List Template

Problem Background

Recently I had to save a list as “List Template” from my client’s SharePoint Online site (which the language is configured to French) and upload to my SharePoint site (the language is English) and create a list using that particular List Template.

However, the list template was not displayed when I try to create a new list by navigating to “Add an App”. This is because of the language is not the same.

Solution

So, what I did was to change the language of the list template.

Step 1

Download the List Template from SharePoint List Template Gallery. The extension of the list template file would be “.stp”.

Step 2

Change the extension from “.stp” to “.cab” as given blow.

image 

Step 3

Extract the file and you will be getting a “manifest.xml” file

image

Step 4

Open the .xml file a note page and change the language to your desired language number and save it.

image

You can get the language ID list from the below url.

https://technet.microsoft.com/en-us/library/ff463597.aspx

Step 5

Open PowerShell and navigate to the folder where your manifest.xml is located and run the below script.

  
 makecab manifest.xml [Name of the list template].stp

My one looks as below.

image

Hit Enter and your List Template will be created.

image

Conclusion

Now your list template is created with new Language. You can upload to List Template Gallery and you can start creating the list.

image

image

Wednesday, March 1, 2017

Basic operations in Host Web from Add-in Web using PnP JavaScript Core Library

Introduction

My my previous blogposts I discussed on

  1. Use sp-pnp-js with SharePoint hosted Add-in
  2. Communicate with Host Web from Add-in Web through PnP JavaScript Core Library

This post will be a continue of the above two posts. In this post we will be addressing the basic operations on SharePoint list items.

Permission

In order to do operations on the list on host web we need to give permission to the List. In our case we have to set the permission “Scope” to “List” and “Permission” as “Manage”. Please refer the image below.

Click on AppManifest.xml –> Permission

Set “Scope” to “List” and “Permission” to “Manage”

image_thumb[1]

The addinWeb will be the Add-in web url and the hostWeb will be the Host Web url. You may download the solution from the link given at the bottom and refer for more.


Add new Item to List

  
    $pnp.sp.crossDomainWeb(addinWeb, hostWeb).lists.getByTitle("List1").items.add({
        Title: "Title"
    }).then(function (result) {
        alert("Item Added");
        //"result" will return couple of properties of newly created item. We can make use of them here
        console.log(result.data);
        console.log(result.data.Id);
    }).catch(function (err) {
        alert(err);
    });


Update existing Item

  
    //Get the item By Id and call the update
    $pnp.sp.crossDomainWeb(addinWeb, hostWeb).lists.getByTitle("List1").items.getById(2).update({
        Title: "Title Update"
    }).then(function (result) {
        alert("Item Updated");
        $("#message").html("Item Updated");
        //"result" will return couple of properties of updated item.
        console.log(result.data);
        console.log(result.data.Id);
    }).catch(function (err) {
        alert(err);
    });


Delete a exiting Item

  
 //Get the item By Id and call delete
    $pnp.sp.crossDomainWeb(addinWeb, hostWeb).lists.getByTitle("List1").items.getById(2).delete().then(function (result) {
        alert("Item Deleted");
        $("#message").html("Item Updated");
    }).catch(function (err) {
        alert(err);
    });

Using the above code snippet you can do the basic operations.

Conclusion

Hit F5 and you will prompt to Trust and select the List you want  give the permission to.

Select the List name from the dropdown and Click on “Trust”.


image_thumb[3]

You can download the code from the below.

https://drive.google.com/file/d/0ByEnOE8DAdvhSUhHWEJuTzBTUm8/view?usp=sharing

Reference

https://github.com/SharePoint/PnP-JS-Core/wiki/Working-With:-Items


Thursday, February 23, 2017

Communicate with Host Web from App Web through PnP JavaScript Core Library

Introduction

Yesterday I had blogged on “How to use PnP JavaScript Core Library with SharePoint Hosted Add-in”, as a continue for the above post; today we will discuss on “How to communicate with Host Web from App Web through PnP JavaScript Core Library”.

Solution

As a example for this blogpost we will list down all the lists which are available in Host web.

Download the sample from my previous post and replace the below code in App.js file.

  

'use strict';

//Get the QueryString data from the url
function getUrlParamByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
    var results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

function myPnP() {
    var addinWeb = getUrlParamByName("SPAppWebUrl");
    var hostWeb = getUrlParamByName("SPHostUrl");

    //This will read Lists from the host web
    $pnp.sp.crossDomainWeb(addinWeb, hostWeb).expand("Lists").get().then(function (result) {
        var resulttring = "";
        for (var i = 0; i < result.Lists.length; i++) {
            resulttring += "List Name: " + result.Lists[i].Title + "
List ID:" + result.Lists[i].Id + "
List Description:" + result.Lists[i].Description + "

"; } document.getElementById("message").innerHTML = resulttring; }).catch(function (err) { alert(err); }); } //Call the above function after the page load document.addEventListener('DOMContentLoaded', function () { myPnP(); });

Conclusion

When you run the project by hitting F5, the list name, list id and the list description will be displayed as below.

image

You can expect more blogposts since myself and my team is working on a large SharePoint hosted Add-in using PnP JavaScript Core Library.

You may download this sample from the below url.

https://drive.google.com/file/d/0ByEnOE8DAdvhZ3pveFRtSWFzUEk/view?usp=sharing

Wednesday, February 22, 2017

Use sp-pnp-js with SharePoint hosted Add-in

Introduction

My team is assigned to deliver couple of SharePoint hosted add-ins using Patterns and Practices JavaScript core library.

This blog post will be the starting and hopefully some more will follow.

PnP JavaScript Core Library

The Patterns and Practices JavaScript Core Library is a JavaScript Library which was created to help developers by simplifying common operations within SharePoint and the SharePoint Framework.

This library provides a fluent API to make building your REST queries intuitive and supports batching and caching. You can learn more on the project's homepage which has links to documentation, samples, and other resources to help you get started.

(http://dev.office.com)

Create a solution with SharePoint Hosted Add-in template in Visual Studio

image

Remove unwanted files and references

Remove sp.js

The sp.js is the library used for JavaScript Object model. This file contains the extension methods to communicate with SharePoint. Since we are going to communicate with SharePoint using pnp.js we will remove it from the Page.

Go to Default.aspx page and just delete the line which is shown below.

image

Add needed JavaScript Libraries

You have to add the below JavaScript libraries into Scripts Module.

image 

es6-promise.js  and fetch.js libraries are needed in order to the add-in work in Internet Explorer. It is because, PnP core library implements fetch and promises, which are not supported on Internet Explorer Browser. To overcome this issue, we need to add these libraries.

The libraries should be referred in the page as in the above order.

image

<script type="text/javascript"  src="../Scripts/es6-promise.min.js"></script>
     <script type="text/javascript" src="../Scripts/fetch.js"></script>
     <script type="text/javascript" src="../Scripts/pnp.js"></script>
     <script type="text/javascript" src="../Scripts/App.js"></script>

Now you are ready to query SharePoint environment using PnP Library.

Remove all the code from App.js file and the below sample code which will display the App Web Title and the url.


  
'use strict';

function myPnP() {
    //Retrieve Web Title and other details the current web
   

    $pnp.sp.web.select("Title", "Url", "Description").get().then(function (data) {
        var details = "";
        
        details += "Web Title : " + data.Title;
        details += "
Web URL : " + data.Url; details += "
Description : " + data.Description; document.getElementById("message").innerHTML = details; }).catch(function (err) { alert(err); }); } //Call the PnP method after the page load document.addEventListener('DOMContentLoaded', function () { myPnP(); });

Hit F5 and your solution will be deployed.

Conclusion

You can start working on SharePoint hosted add-in using PnP JavaScript Core Library.

Please download the solution from the link below.

https://drive.google.com/open?id=0ByEnOE8DAdvhbDRGcWdGS2hsQk0