UNPKG

generator-portals-clientside

Version:

Generates a SharePoint clientside project skeleton. Brought to you by Skyline's Portals & Collaboration Team.

63 lines (54 loc) 2.23 kB
var SPScript = require("spscript"); var cache = sessionStorage; //also would support localstorage var constants = require("./constants"); exports.getMenu = function(menuType, url) { // Try to get menu from cache var cachedMenu = getCache(menuType); if (cachedMenu) return Promise.resolve(cachedMenu); // No cache, so fetch, process, cache, and return return fetchMenu(menuType, url) .then(processMenu) .then((menu) => setCache(menuType, menu)) }; var fetchMenu = function(menuType, url) { // Url is optional to allow passing in a global menu lists location var ctx = SPScript.createContext(url); // Query each Menu List for all items by MenuType var requests = constants.listNames.map(listName => { return ctx.lists(listName) .findItems("MenuType", menuType, "$OrderBy=SortOrder") .then(items => { //trim up the object so it serializes/caches better return items.map(i => pluck(i, constants.fields)) }) }) // Return a promise that resolves when all List requests succeed return Promise.all(requests); }; // Take the 3 sets of List Items and create a hierarchy using 'children' array var processMenu = function([ firstLevels, secondLevels, thirdLevels ]) { secondLevels.forEach(link => { link.children = thirdLevels.filter(i => i.AppearsUnderId === link.Id); }) firstLevels.forEach(link => { link.children = secondLevels.filter(i => i.AppearsUnderId === link.Id); }) return firstLevels; }; var getCache = function(menuType) { var valueStr = cache.getItem(makeCacheKey(menuType)); return (valueStr) ? JSON.parse(valueStr) : null; }; var setCache = function(menuType, menu) { var key = makeCacheKey(menuType) cache.setItem(key, JSON.stringify(menu)); return getCache(menuType); }; var pluck = function(obj, props) { return props.reduce((newObj, key) =>{ newObj[key] = obj[key]; return newObj; }, {}) }; // Might want to make this url specific so differnt sites can cache a different menu var makeCacheKey = (menuType) => "menu-" + menuType;