using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Microsoft.SharePoint.Client; using ProviderHostedCloud1Web.Models; namespace ProviderHostedCloud1Web.Controllers { [SharePointContextFilter] public class ProductController : Controller { // GET: Product public ActionResult Index() { var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext); using (ClientContext cc = spContext.CreateUserClientContextForSPHost()) { if (cc != null) { List productList = cc.Web.Lists.GetByTitle("Products"); cc.Load(productList); cc.ExecuteQuery(); if (productList != null) { CamlQuery query = CamlQuery.CreateAllItemsQuery(); ListItemCollection products = productList.GetItems(query); cc.Load(products); cc.ExecuteQuery(); ListretVal = new List (); foreach (var product in products) { retVal.Add(new Product { ID = product.Id, Title = product["Title"].ToString(), UnitPrice = Convert.ToDecimal(product["UnitPrice"]), UnitsOnStock = Convert.ToInt32(product["UnitsOnStock"]) }); } return View(retVal); } return View(); } else { ViewBag.ErrorMessage = "Error: ClientContext is null."; return View(); } } } // GET: Product/Details/5 public ActionResult Details(int id) { try { var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext); using (ClientContext cc = spContext.CreateUserClientContextForSPHost()) { if (cc != null) { ListItem item = cc.Web.Lists.GetByTitle("Products").GetItemById(id); cc.Load(item); cc.ExecuteQuery(); if (item != null) { Product retVal = new Product { ID = item.Id, Title = item["Title"].ToString(), UnitPrice = item["UnitPrice"] == null ? 0.00m : Convert.ToDecimal(item["UnitPrice"]), UnitsOnStock = item["UnitsOnStock"] == null ? 0 : Convert.ToInt32(item["UnitsOnStock"]) }; return View(retVal); } else { return View(); } } else { ViewBag.ErrorMessage = "Error: ClientContext was null. "; return View(); } } } catch (Exception ex) { Exception ie = ex; while (ie.InnerException != null) { ie = ie.InnerException; } ViewBag.ErrorMessage = "Error: " + ie.Message; return View(); } } // GET: Product/Create public ActionResult Create() { return View(); } // POST: Product/Create [HttpPost] public ActionResult Create(System.Web.Mvc.FormCollection collection) { string title = collection["Title"].ToString(); decimal unitPrice = collection["UnitPrice"] == null ? 0.00m : Convert.ToDecimal(collection["UnitPrice"]); int unitsOnStock = collection["UnitsOnStock"] == null ? 0 : Convert.ToInt32(collection["UnitsOnStock"]); try { var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext); using (ClientContext cc = spContext.CreateUserClientContextForSPHost()) { List productList = cc.Web.Lists.GetByTitle("Products"); ListItemCreationInformation creationInfo = new ListItemCreationInformation(); ListItem item = productList.AddItem(creationInfo); item["Title"] = title; item["UnitPrice"] = unitPrice; item["UnitsOnStock"] = unitsOnStock; item.Update(); cc.ExecuteQuery(); return RedirectToAction("Index", new { SPHostUrl = Request.QueryString["SPHostUrl"] }); } } catch (Exception ex) { Exception ie = ex; while (ie.InnerException != null) { ie = ie.InnerException; } ViewBag.ErrorMessage = "Error: " + ie.Message; Product product = new Product { Title = title, UnitPrice = unitPrice, UnitsOnStock = unitsOnStock }; return View(product); } } // GET: Product/Edit/5 public ActionResult Edit(int id) { var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext); using (ClientContext cc = spContext.CreateUserClientContextForSPHost()) { if (cc != null) { ListItem item = cc.Web.Lists.GetByTitle("Products").GetItemById(id); cc.Load(item); cc.ExecuteQuery(); if (item != null) { Product product = new Product { ID = item.Id, Title = item["Title"].ToString(), UnitPrice = item["UnitPrice"] == null ? 0.00m : Convert.ToDecimal(item["UnitPrice"]), UnitsOnStock = item["UnitsOnStock"] == null ? 0 : Convert.ToInt32(item["UnitsOnStock"]) }; return View(product); } else { return View(); } } else { ViewBag.ErrorMessage = "Error: ClientContext was null"; return View(); } } } // POST: Product/Edit/5 [HttpPost] public ActionResult Edit(int id, System.Web.Mvc.FormCollection collection) { try { string title = collection["Title"].ToString(); decimal unitPrice = Convert.ToDecimal(collection["UnitPrice"]); int unitsOnStock = Convert.ToInt32(collection["UnitsOnStock"]); var spContext = SharePointAcsContextProvider.Current.GetSharePointContext(HttpContext); using (ClientContext cc = spContext.CreateUserClientContextForSPHost()) { if (cc != null) { ListItem item = cc.Web.Lists.GetByTitle("Products").GetItemById(id); item["Title"] = title; item["UnitPrice"] = unitPrice; item["UnitsOnStock"] = unitsOnStock; item.Update(); cc.ExecuteQuery(); return RedirectToAction("Index", new { SPHostUrl = Request.QueryString["SPHostUrl"] }); } else { ViewBag.ErrorMessage = "ClientContext was null."; Product product = new Product { ID = id, Title = title, UnitPrice = unitPrice, UnitsOnStock = unitsOnStock }; return View(product); } } } catch (Exception ex) { Exception ie = ex; while (ie.InnerException != null) { ie = ie.InnerException; } ViewBag.Error = "Error: " + ie.Message; return View(); } } // GET: Product/Delete/5 public ActionResult Delete(int id) { var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext); using (ClientContext cc = spContext.CreateUserClientContextForSPHost()) { if (cc != null) { ListItem item = cc.Web.Lists.GetByTitle("Products").GetItemById(id); cc.Load(item); cc.ExecuteQuery(); if (item != null) { Product product = new Product { ID = item.Id, Title = item["Title"].ToString(), UnitPrice = item["UnitPrice"] == null ? 0.00m : Convert.ToDecimal(item["UnitPrice"]), UnitsOnStock = item["UnitsOnStock"] == null ? 0 : Convert.ToInt32(item["UnitsOnStock"]) }; return View(product); } else { return View(); } } else { ViewBag.Error = "Error: ClientContext was null"; return View(); } } } // POST: Product/Delete/5 [HttpPost] public ActionResult Delete(int id, System.Web.Mvc.FormCollection collection) { string title = collection["Title"].ToString(); decimal unitPrice = Convert.ToDecimal(collection["UnitPrice"]); int unitsOnStock = Convert.ToInt32(collection["UnitsOnStock"]); try { var spContext = SharePointContextProvider.Current.GetSharePointContext(HttpContext); using (ClientContext cc = spContext.CreateUserClientContextForSPHost()) { if (cc != null) { ListItem item = cc.Web.Lists.GetByTitle("Products").GetItemById(id); item.DeleteObject(); cc.ExecuteQuery(); return RedirectToAction("Index", new { SPHostUrl = Request.QueryString["SPHostUrl"] }); } else { Product product = new Product { ID = id, Title = title, UnitPrice = unitPrice, UnitsOnStock = unitsOnStock }; ViewBag.Error = "Error: ClientContext was null"; return View(); } } } catch (Exception ex) { Exception ie = ex; while (ie.InnerException != null) { ie = ie.InnerException; } ViewBag.ErrorMessage = "Error: " + ie.Message; return View(); } } } }
Tuesday, July 26, 2016
Provider-Hosted Add-in CRUD example using CSOM
Below is a complete CRUD example of provider-hosted SharePoint Add-In using CSOM.
In the controller, the CRUD is performed on a SharePoint list, "Products", which is made of [ID], [Title], [UnitPrice] and [UnitsOnStock] fields.
Monday, July 25, 2016
Bootstrap Popover() - useful example
Bootstrap popover() example below has a few useful features:
- Popover initiates via mouse-hover over <span class="paymentNum">
- trigger: 'manual' is used with onmouseenter and onmouseleave event to mimic trigger by hover
- User can move the mouse into the popover. Popover dissapears when mouse is completely out of the popover-initiating span tag or the shown popover
- Once popover is shown, it stays visible even when mouse moves between the popover-initiating span tag and the popover itself (This would not work if trigger: 'hover' was used. It was possible by using trigger: 'manual' and onmouseenter and onmouseover events).
- Popover title is dynamically loaded.
- Popover content is dynamically loaded via ajax. Loading... is shown if there is a delay. When ajax get is done, its response dynamically replaces popover content.
<span class="paymentNum">@payment.PaymentNum</span> <input type="hidden" class="payment-id" value="@payment.PaymentID" /> ..... <script type="text/javascript"> $(function () { $('span.paymentNum').popover({ trigger: 'manual', placement: 'right', title: function(){ return "Payment " + $(this).text(); }, html: true, animation: false, container: 'body', template: '<div class="popover" role="tooltip" style="min-width: 400px; background-color: #fff; ">' + '<div class="arrow"></div>' + '<h3 class="popover-title" style="background-color: #dedede"></h3>' + '<div class="popover-content" style="height: 400px; overflow-y: auto; font-size: 0.9em;"></div>' + '</div>', content: function () { var div_id = "temp_" + $.now(); var payment_id = $(this).parent().find('.payment-id').val(); $.ajax({ type: 'GET', url: GL.site_root_path + '/Payment/_QuickSummary/' + payment_id, cache: false, beforeSend: function () { }, complete: function () { } }).done(function (d) { $('#' + div_id).html(d); // Genius!!! }); return '<div id="' + div_id + '"><div style="margin-top: 180px; text-align: center; font-size: 1.2em;">Loading ...<i class="fa fa-refresh fa-spin"></i></div></div>'; } }).on('mouseenter', function () { var _this = this; $(this).popover("show"); $('.popover').on('mouseleave', function () { $(_this).popover("hide"); }); }).on('mouseleave', function () { var _this = this; setTimeout(function () { if (!$('.popover:hover').length) { $(_this).popover("hide"); } }, 50); }); }); </script>
Subscribe to:
Posts (Atom)