diff --git a/public/js/icinga/loader.js b/public/js/icinga/loader.js index 3458ac653..4a51c644c 100644 --- a/public/js/icinga/loader.js +++ b/public/js/icinga/loader.js @@ -399,22 +399,6 @@ } }, - cacheLoadedIcons: function($container) { - // TODO: this is just a prototype, disabled for now - return; - - var _this = this; - $('img.icon', $container).each(function(idx, img) { - var src = $(img).attr('src'); - if (typeof _this.iconCache[src] !== 'undefined') { - return; - } - var cache = new Image(); - cache.src = src - _this.iconCache[src] = cache; - }); - }, - /** * Handle successful XHR response */ @@ -445,8 +429,6 @@ _this.loadUrl(_this.url('/layout/announcements'), $('#announcements')); } - // div helps getting an XML tree - var $resp = $('
' + req.responseText + '
'); var active = false; var rendered = false; var classes; @@ -521,33 +503,32 @@ } // Handle search requests, still hardcoded. - if (req.url.match(/^\/search/) && - req.$target.data('icingaUrl').match(/^\/search/) && - $('.dashboard', $resp).length > 0 && - $('.dashboard .container', req.$target).length > 0) - { - // TODO: We need dashboard pane and container identifiers (not ids) - var targets = []; - $('.dashboard .container', req.$target).each(function (idx, el) { - targets.push($(el)); - }); + if (req.url.match(/^\/search/) && req.$target.data('icingaUrl').match(/^\/search/)) { + var $resp = $('
' + req.responseText + '
'); // div helps getting an XML tree + if ($('.dashboard', $resp).length > 0 && $('.dashboard .container', req.$target).length > 0) { + // TODO: We need dashboard pane and container identifiers (not ids) + var targets = []; + $('.dashboard .container', req.$target).each(function (idx, el) { + targets.push($(el)); + }); - var i = 0; - // Searching for '.dashboard .container' in $resp doesn't dork?! - $('.dashboard .container', $resp).each(function (idx, el) { - var $el = $(el); - if ($el.hasClass('dashboard')) { - return; - } - var url = $el.data('icingaUrl'); - targets[i].data('icingaUrl', url); - var title = $('h1', $el).first(); - $('h1', targets[i]).first().replaceWith(title); + var i = 0; + // Searching for '.dashboard .container' in $resp doesn't dork?! + $('.dashboard .container', $resp).each(function (idx, el) { + var $el = $(el); + if ($el.hasClass('dashboard')) { + return; + } + var url = $el.data('icingaUrl'); + targets[i].data('icingaUrl', url); + var title = $('h1', $el).first(); + $('h1', targets[i]).first().replaceWith(title); - _this.loadUrl(url, targets[i]); - i++; - }); - rendered = true; + _this.loadUrl(url, targets[i]); + i++; + }); + rendered = true; + } } var referrer = req.referrer; @@ -574,15 +555,34 @@ this.icinga.timer.unregister(req.progressTimer); } - // .html() removes outer div we added above - this.renderContentToContainer($resp.html(), req.$target, req.action, req.autorefresh, req.forceFocus, autoSubmit); + var contentSeparator = req.getResponseHeader('X-Icinga-Multipart-Content'); + if (!! contentSeparator) { + $.each(req.responseText.split(contentSeparator), function (idx, el) { + var match = el.match(/for=(?\S+)\s+(?.*)/m); + if (!! match) { + var $target = $('#' + match.groups.id); + if ($target.length) { + _this.renderContentToContainer( + match.groups.html, $target, 'replace', req.autorefresh, req.forceFocus, autoSubmit); + } else { + _this.icinga.logger.warn( + 'Invalid target ID. Cannot render multipart to #' + match.groups.id); + } + } else { + _this.icinga.logger.error('Ill-formed multipart', el); + } + }) + } else { + this.renderContentToContainer( + req.responseText, req.$target, req.action, req.autorefresh, req.forceFocus, autoSubmit); + } + if (oldNotifications) { oldNotifications.appendTo($('#notifications')); } if (newBody) { this.icinga.ui.fixDebugVisibility().triggerWindowResize(); } - _this.cacheLoadedIcons(req.$target); }, /** @@ -643,6 +643,26 @@ delete this.requests[req.$target.attr('id')]; this.icinga.ui.fadeNotificationsAway(); + var extraUpdates = req.getResponseHeader('X-Icinga-Extra-Updates'); + if (!! extraUpdates && req.getResponseHeader('X-Icinga-Redirect-Http') !== 'yes') { + var _this = this; + $.each(extraUpdates.split(','), function (idx, el) { + var parts = el.trim().split(';'); + if (parts.length !== 2) { + _this.icinga.logger.error('Invalid extra update', el); + return; + } + + var $target = $('#' + parts[0]); + if (! $target.length) { + _this.icinga.logger.warn('Invalid target ID. Cannot load extra URL', el); + return; + } + + _this.loadUrl(parts[1], $target).addToHistory = false; + }); + } + if (this.processRedirectHeader(req)) { return; } diff --git a/public/js/icinga/ui.js b/public/js/icinga/ui.js index f5d8a4800..947473b49 100644 --- a/public/js/icinga/ui.js +++ b/public/js/icinga/ui.js @@ -681,7 +681,7 @@ * This is based on the assumption that the server only knows about the menu and first column * and therefore does not need to protect its ids. (As the menu is most likely part of the sidebar) */ - if ($cont.attr('id') === 'menu' || $cont.attr('id') === 'col1') { + if ($cont.attr('id') === 'menu' || $cont.attr('id') === 'col1' || $cont.closest('#col1').length) { return null; }