From a8dc609b62201b993943607eb9dde0e4d5a3ebaf Mon Sep 17 00:00:00 2001
From: Johannes Meyer <johannes.meyer@icinga.com>
Date: Mon, 23 Sep 2019 10:30:20 +0200
Subject: [PATCH] loader.js: Add support for multipart content

refs #3953
---
 public/js/icinga/loader.js | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/public/js/icinga/loader.js b/public/js/icinga/loader.js
index 468074d2f..4a51c644c 100644
--- a/public/js/icinga/loader.js
+++ b/public/js/icinga/loader.js
@@ -555,7 +555,28 @@
                 this.icinga.timer.unregister(req.progressTimer);
             }
 
-            this.renderContentToContainer(req.responseText, 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=(?<id>\S+)\s+(?<html>.*)/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'));
             }