Friday, August 2, 2019

SharePoint Hosted Apps REST API CRUD operations

CRUD operations using the REST API - SharePoint Hosted Apps 


'use strict';
var listName = "MyList";
var UpdateItemID = 0;
var createGo = true;
$(document).ready(function () {
    Read();
});

   

$(document).on("click", ".renameDeleteAnItem", function () {

    var btnType = $(this).attr("value");
    if (btnType == "Edit") {
        UpdateItemID = $(this).attr("Id");
        $("#txtTitle").val($(this).closest('tr').find('.itemTitle').text());
        // $("#txtName").val($(this).closest('tr').find('.itemName').text());

    }
    else if (btnType == "Delete") {      
        var url = _spPageContextInfo.webAbsoluteUrl;
        var itemId = $(this).attr("Id");
        Delete(itemId);
    }

});


function Create() {    
    var url = _spPageContextInfo.siteAbsoluteUrl;
    var title = $('#txtTitle').val();

    createListItemWithDetails(listName, url, title, function () {
       //Updating available items
        Read();
    }, function () {
        // alert("Ooops, an error occured. Please try again");
    });
}


function Read() {         
    var url = _spPageContextInfo.siteAbsoluteUrl;

    getListItems(listName, url, function (data) {
        var items = data.d.results;
        // Add all the new items
        var listItemsdata = '<div> <table border="1">';
        listItemsdata += '<tr style="background-color: #87b586">  <th>Title </th> <th>Actions</th> </tr>'
        for (var i = 0; i < items.length; i++) {
            listItemsdata += '<tr><td> <lable class="itemTitle">' + items[i].Title +
                '</label></td><td>'
                + '<input type="button" Id="' + items[i].ID + '" value="Edit" class="renameDeleteAnItem" /> <input type="button" Id="' + items[i].ID + '" value="Delete" class="renameDeleteAnItem" /> </td> </tr>';
        }
        listItemsdata += '</table></div>';

        $("#divShowItems").empty()
        $("#divShowItems").append(listItemsdata);
    }, function (data) {
        alert("Ooops, an error occured. Please try again");
    });
}

// occurs when a user clicks the update button
function Update() { 
    var url = _spPageContextInfo.siteAbsoluteUrl;
    var itemId = UpdateItemID; 
    var title = $('#txtTitle').val();
    updateListItem(itemId, listName, url, title, function () {
        alert("Item updated, refreshing avilable items");
        $('#txtTitle').val('');
        Read();
    }, function () {
        alert("Ooops, an error occured. Please try again");
    }); 
}

// occurs when a user clicks the delete button
function Delete(itemId) {
    var url = _spPageContextInfo.siteAbsoluteUrl;
    //var itemId = $('#DeleteItems').val();
    deleteListItem(itemId, listName, url, function () {
        alert("Item deleted, refreshing avilable items");
        Read();
    }, function () {
        alert("Ooops, an error occured. Please try again");
    });
}

// Delete Operation
function deleteListItem(itemId, listName, siteUrl, success, failure) {
    getListItemWithId(itemId, listName, siteUrl, function (data) {
        $.ajax({
            url: data.__metadata.uri,
            type: "POST",
            headers: {
                "Accept": "application/json;odata=verbose",
                "X-Http-Method": "DELETE",
                "X-RequestDigest": $("#__REQUESTDIGEST").val(),
                "If-Match": data.__metadata.etag
            },
            success: function (data) {
                success(data);
            },
            error: function (data) {
                failure(data);
            }
        });
    },
   function (data) {
       failure(data);
   });
}


// Update Operation
function updateListItem(itemId, listName, siteUrl, title, success, failure) {
    var itemType = GetItemTypeForListName(listName);

    var item = {
        "__metadata": { "type": itemType },
        "Title": title
    };

    getListItemWithId(itemId, listName, siteUrl, function (data) {
        $.ajax({
            url: data.__metadata.uri,
            type: "POST",
            contentType: "application/json;odata=verbose",
            data: JSON.stringify(item),
            headers: {
                "Accept": "application/json;odata=verbose",
                "X-RequestDigest": $("#__REQUESTDIGEST").val(),
                "X-HTTP-Method": "MERGE",
                "If-Match": data.__metadata.etag
            },
            success: function (data) {
                success(data);
            },
            error: function (data) {
                failure(data);
            }
        });
    }, function (data) {
        failure(data);
    });
}

// READ SPECIFIC ITEM operation
// itemId: The id of the item to get
function getListItemWithId(itemId, listName, siteurl, success, failure) {
    var url = siteurl + "/_api/web/lists/getbytitle('" + listName + "')/items?$filter=Id eq " + itemId;
    $.ajax({
        url: url,
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: function (data) {
            if (data.d.results.length == 1) {
                success(data.d.results[0]);
            }
            else {
                failure("Multiple results obtained for the specified Id value");
            }
        },
        error: function (data) {
            failure(data);
        }
    });
}

// READ operation
function getListItems(listName, siteurl, success, failure) {
    $.ajax({
        url: siteurl + "/_api/web/lists/getbytitle('" + listName + "')/items",
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: function (data) {
            success(data);
        },
        error: function (data) {
            failure(data);
        }
    });
}

// CREATE Operation
function createListItemWithDetails(listName, siteUrl, title, success, failure) {

    var itemType = GetItemTypeForListName(listName);
    var item = {
        "__metadata": { "type": itemType },
        "Title": title
    };

    $.ajax({
        url: siteUrl + "/_api/web/lists/getbytitle('" + listName + "')/items",
        type: "POST",
        contentType: "application/json;odata=verbose",
        data: JSON.stringify(item),
        headers: {
            "Accept": "application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val()
        },
        success: function (data) {
            success(data);
        },
        error: function (data) {
            debugger;
            alert("Error creating: "+ data.responseText);
            failure(data);
        }
    });
}

function GetItemTypeForListName(name) {
    return "SP.Data." + name.charAt(0).toUpperCase() + name.slice(1) + "ListItem";
}

<div>
        <table>
            <tr>
                <td>
                    <label>Title:</label>
                </td>
                <td>
                    <input type="text" id="txtTitle" />
                </td>
            </tr>
           
            <tr>
                <td></td>
                <td>

                    <input type="button" id="Create_Submit" value="Create" onclick="Create();" />                  
                    <input type="button" id="UpdateSubmit" value="Update" onclick="Update();" />
                    <input type="button" id="DeleteSubmit" value="Delete" onclick="Delete();" />

                </td>
            </tr>
        </table>


        <div id="divShowItems"></div>


    </div>

SharePoint Online Add-in SharePoint-Host with Rest API


SharePoint Online Add-in SharePoint-Host with Rest API


App.JS

'use strict';

$(document).ready(function () {

    var hostweburl;
    var appweburl;
    var listTitle = "MyTestList";
    //The SharePoint site where an App is installed
    hostweburl = decodeURIComponent(getQueryStringParameter('SPHostUrl'));
    //The location within the site where an App will be deployed
    appweburl = decodeURIComponent(getQueryStringParameter('SPAppWebUrl'));

    // resource URLs in the form: web_url/_layouts/15/resource
    var scriptbase = hostweburl + "/_layouts/15/";
    $.getScript(scriptbase + "SP.RequestExecutor.js", execCrossDomainRequest);

    // Use cross-domain library to interact with more than one domain
    //Your remote add-in page through a proxy
    function execCrossDomainRequest() {
        var executor = new SP.RequestExecutor(appweburl);
    }

    $("#btnGet").click(function () {

        var executor = new SP.RequestExecutor(appweburl);
        // Url: appweburl + "/_api/SP.AppContextSite(@target)/web/lists/getbytitle('" + listTitle + "')/Items?@target='"+hostweburl + "'"
        //      appweburl: ...rkco-b00770cf5fd946.sharepoint.com/sites/dev/REST/      
       
        executor.executeAsync(
            {
                url: appweburl + "/_api/SP.AppContextSite(@target)/web/lists/getbytitle('" + listTitle + "')/Items?@target='"
                    + hostweburl + "'",
                method: "GET",
                headers: { "Accept": "application/json; odata=verbose" },
                success: successFun,
                error: errorFun
            }
        );

    });

});

function successFun(data) {
    $("#message").hide();
    var jsonObject = JSON.parse(data.body);
    var moviesHTML = "";
    var results = jsonObject.d.results;
    for (var i = 0; i < results.length; i++) {
        moviesHTML = moviesHTML + "<p><h3>" + results[i].Title + "</p><hr>";
    }

    document.getElementById("resultDiv").innerHTML = moviesHTML;
}

function errorFun(error) {
    $("#resultDiv").append(error.statusText)
}

//function to get a Host and App Url
function getQueryStringParameter(urlParameterKey) {
    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] == urlParameterKey)
            return decodeURIComponent(singleParam[1]);
    }
}
Note: Provide permissions to the list is Read at AppManifest.xml (Based on your need)

Default.Aspx:
<asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server">
  

    <div>
        <input id="btnGet" type="button" value="Show MyList Titles" />
    </div>

    <div id="resultDiv">
    </div>

    <div>
        <p id="message">
            <!-- The following content will be replaced with the user name when you run the app - see App.js -->
            initializing...
        </p>
    </div>

</asp:Content>