Hi,
I am trying to load all the webs including sub sites under the root web with the parent child relation in an array. Here ReadAllWebs function taking some time to load. So LoadSiteDirectory function should wait until treeData array loads completely.
Calling getParentWebDetails function within ReadAllWebs function's foreach loop takes more time. Any idea to fix this or better idea to remove the setTimeOut?
var context, hostcontext, rootWeb, treeData = [];$(document).ready(function () {
ReadAllWebs();
setTimeout(function () {
LoadSiteDirectory();
}, 5000);
});
function ReadAllWebs() {
enumWebs(['Id', 'Title', 'WebTemplate', 'Description', 'Created', 'LastItemModifiedDate', 'Url', 'ServerRelativeUrl'], function (webs) {
for (var i = 0; i < webs.length; i++) {
var temp_RelativeUrl_Trim = webs[i].get_serverRelativeUrl().substring(0, webs[i].get_serverRelativeUrl().lastIndexOf('/'));
var site_ID = webs[i].get_id().toString();
var site_Title = webs[i].get_title();
var site_Description = webs[i].get_description() ? webs[i].get_description() : "Not available.";
var site_CreatedDate = webs[i].get_created().toString();
var site_ModifiedDate = webs[i].get_lastItemModifiedDate().toString();
var site_RelativeUrl = webs[i].get_serverRelativeUrl();
var site_ParentRelativeUrl = temp_RelativeUrl_Trim.endsWith('/sites') ? 'null' : webs[i].get_serverRelativeUrl().substring(0, webs[i].get_serverRelativeUrl().lastIndexOf('/'));
getParentWebDetails(webs[i], site_ID, site_Title, site_Description, site_CreatedDate, site_ModifiedDate, site_RelativeUrl, site_ParentRelativeUrl)
}
},
function (sender, args) {
console.log(args.get_message());
});
}
function LoadSiteDirectory() {
var dataMap = treeData.reduce(function (map, node) {
map[node.name] = node;
return map;
}, {});
// create the tree array
var treeDataOut = [];
treeData.forEach(function (node) {
// add to parent
var parent = dataMap[node.parent];
if (parent) {
// create child array if it doesn't exist
(parent.children || (parent.children = []))
// add node to child array
.push(node);
} else {
// parent is null or missing
treeDataOut.push(node);
}
});
}
function getParentWebDetails(web, site_ID, site_Title, site_Description, site_CreatedDate, site_ModifiedDate, site_RelativeUrl, site_ParentRelativeUrl) {
if (site_ParentRelativeUrl !== 'null') {
var context = new SP.ClientContext.get_current();
var onelevelup = web.get_parentWeb();
context.load(onelevelup);
context.executeQueryAsync(function () {
processtree(site_ID, site_Title, site_Description, site_CreatedDate, site_ModifiedDate, site_RelativeUrl, site_ParentRelativeUrl, onelevelup.get_title());
},
function (sender, args) {
processtree(site_ID, site_Title, site_Description, site_CreatedDate, site_ModifiedDate, site_RelativeUrl, site_ParentRelativeUrl, "null");
}
);
}
else {
processtree(site_ID, site_Title, site_Description, site_CreatedDate, site_ModifiedDate, site_RelativeUrl, site_ParentRelativeUrl, "null");
}
}
function processtree(site_ID, site_Title, site_Description, site_CreatedDate, site_ModifiedDate, site_RelativeUrl, site_ParentRelativeUrl, parentSiteName) {
treeData.push({ "id": site_ID, "name": site_Title, "description": site_Description, "created": site_CreatedDate, "modified": site_ModifiedDate, "url": site_RelativeUrl, "parentUrl": site_ParentRelativeUrl, "parent": parentSiteName });
}
function enumWebs(propertiesToRetrieve, success, error) {
context = SP.ClientContext.get_current();
hostContext = new SP.AppContextSite(context, decodeURIComponent(getQueryStringParameter('SPHostUrl')));
rootWeb = hostContext.get_site().get_rootWeb();
var result = [];
var level = 0;
context.load(rootWeb, propertiesToRetrieve);
result.push(rootWeb);
var colPropertiesToRetrieve = String.format('Include({0})', propertiesToRetrieve.join(','));
var enumWebsInner = function (web, result, success, error) {
level++;
var webs = web.get_webs();
context.load(webs, colPropertiesToRetrieve);
context.executeQueryAsync(
function () {
for (var i = 0; i < webs.get_count() ; i++) {
var web = webs.getItemAtIndex(i);
var templateType = web.get_webTemplate();
if (templateType !== "APP") {
result.push(web);
}
enumWebsInner(web, result, success, error);
}
level--;
if (level == 0 && success)
success(result);
},
error);
};
enumWebsInner(rootWeb, result, success, error);
}
function getQueryStringParameter(paramToRetrieve) {
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] == paramToRetrieve)
return singleParam[1];
}
}