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
JavaScript
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;