refactored widgets api call to render all at once rather than one area at a time, closes https://github.com/NodeBB/NodeBB/issues/2062

v1.18.x
psychobunny 11 years ago
parent 0ecaa05c76
commit ecd00bb679

@ -30,60 +30,56 @@
ajaxify.widgets.reposition(); ajaxify.widgets.reposition();
} }
function renderWidgets(location) { function renderWidgets(locations) {
var area = $('#content [widget-area="' + location + '"]'), var areaDatas = [];
areaData = {
location: location, $.get(RELATIVE_PATH + '/api/widgets/render', {
template: template + '.tpl', locations: locations,
url: url template: template + '.tpl',
}; url: url
}, function(renderedAreas) {
$.get(RELATIVE_PATH + '/api/widgets/render', areaData, function(renderedWidgets) { for (var x=0; x<renderedAreas.length; ++x) {
var html = ''; var renderedWidgets = renderedAreas[x].widgets,
location = renderedAreas[x].location,
for (var i=0; i<renderedWidgets.length; ++i) { html = '';
html += templates.parse(renderedWidgets[i].html, {});
} for (var i=0; i<renderedWidgets.length; ++i) {
html += templates.parse(renderedWidgets[i].html, {});
if (!area.length && window.location.pathname.indexOf('/admin') === -1 && renderedWidgets.length) {
if (location === 'footer' && !$('#content [widget-area="footer"]').length) {
$('#content').append($('<div class="col-xs-12"><div widget-area="footer"></div></div>'));
} else if (location === 'sidebar' && !$('#content [widget-area="sidebar"]').length) {
$('#content > *').wrapAll($('<div class="col-lg-9 col-xs-12"></div>'));
$('#content').append($('<div class="col-lg-3 col-xs-12"><div widget-area="sidebar"></div></div>'));
} else if (location === 'header' && !$('#content [widget-area="header"]').length) {
$('#content').prepend($('<div class="col-xs-12"><div widget-area="header"></div></div>'));
} }
area = $('#content [widget-area="' + location + '"]'); var area = $('#content [widget-area="' + location + '"]');
}
area.html(html); if (!area.length && window.location.pathname.indexOf('/admin') === -1 && renderedWidgets.length) {
if (location === 'footer' && !$('#content [widget-area="footer"]').length) {
$('#content').append($('<div class="col-xs-12"><div widget-area="footer"></div></div>'));
} else if (location === 'sidebar' && !$('#content [widget-area="sidebar"]').length) {
$('#content > *').wrapAll($('<div class="col-lg-9 col-xs-12"></div>'));
$('#content').append($('<div class="col-lg-3 col-xs-12"><div widget-area="sidebar"></div></div>'));
} else if (location === 'header' && !$('#content [widget-area="header"]').length) {
$('#content').prepend($('<div class="col-xs-12"><div widget-area="header"></div></div>'));
}
if (!renderedWidgets.length) { area = $('#content [widget-area="' + location + '"]');
area.addClass('hidden'); }
ajaxify.widgets.reposition(location);
}
$('#content [widget-area] img:not(.user-img)').addClass('img-responsive'); area.html(html);
checkCallback();
});
}
function checkCallback() { if (!renderedWidgets.length) {
numLocations--; area.addClass('hidden');
if (numLocations < 0) { ajaxify.widgets.reposition(location);
}
$('#content [widget-area] img:not(.user-img)').addClass('img-responsive');
}
$(window).trigger('action:widgets.loaded', {}); $(window).trigger('action:widgets.loaded', {});
if (typeof callback === 'function') { if (typeof callback === 'function') {
callback(); callback();
} }
} });
}
for (var i=0; i<widgetLocations.length; ++i) {
renderWidgets(widgetLocations[i]);
} }
checkCallback(); renderWidgets(widgetLocations);
}; };
}(ajaxify || {})); }(ajaxify || {}));

@ -84,19 +84,34 @@ apiController.getConfig = function(req, res, next) {
apiController.renderWidgets = function(req, res, next) { apiController.renderWidgets = function(req, res, next) {
var uid = req.user ? req.user.uid : 0, var async = require('async'),
area = { uid = req.user ? req.user.uid : 0,
areas = {
template: req.query.template, template: req.query.template,
location: req.query.location, locations: req.query.locations,
url: req.query.url url: req.query.url
}; },
renderedWidgets = [];
if (!area.template || !area.location) { if (!areas.template || !areas.locations) {
return res.json(200, {}); return res.json(200, {});
} }
widgets.render(uid, area, function(err, data) { async.each(areas.locations, function(location, next) {
res.json(200, data); widgets.render(uid, {
template: areas.template,
url: areas.url,
location: location
}, function(err, widgets) {
renderedWidgets.push({
location: location,
widgets: widgets
});
next();
});
}, function(err) {
res.json(200, renderedWidgets);
}); });
}; };

Loading…
Cancel
Save