add options object to HtmlHelpers »parseResponse«

This commit is contained in:
Felix Hamann 2019-05-19 11:25:20 +02:00
parent 39da7d40ec
commit 0f1abf6cd1
4 changed files with 41 additions and 22 deletions

View File

@ -3,27 +3,44 @@
window.HtmlHelpers = (function() { window.HtmlHelpers = (function() {
function _prefixIds(element) { // `parseResponse` takes a raw HttpClient response and an options object.
var idPrefix = Math.floor(Math.random() * 100000); // Returns an object with `element` being an contextual fragment of the
// HTML in the response and `ifPrefix` being the prefix that was used to
// "unique-ify" the ids of the received HTML.
// Original Response IDs can optionally be kept by adding `originalIds: true`
// to the `options` object.
function parseResponse(response, options) {
options = options || {};
return response.text().then(function (responseText) {
var docFrag = document.createRange().createContextualFragment(responseText);
var idPrefix;
if (!options.originalIds) {
idPrefix = _getIdPrefix();
_prefixIds(docFrag, idPrefix);
}
return Promise.resolve({ idPrefix: idPrefix, element: docFrag });
},
function (error) {
return Promise.reject(error);
}).catch(function (error) { console.error(error); });
}
function _prefixIds(element, idPrefix) {
var idAttrs = ['id', 'for', 'data-conditional-input', 'data-modal-trigger']; var idAttrs = ['id', 'for', 'data-conditional-input', 'data-modal-trigger'];
idAttrs.forEach(function(attr) { idAttrs.forEach(function(attr) {
Array.from(element.querySelectorAll('[' + attr + ']')).forEach(function(input) { Array.from(element.querySelectorAll('[' + attr + ']')).forEach(function(input) {
var value = idPrefix + '__' + input.getAttribute(attr); var value = idPrefix + input.getAttribute(attr);
input.setAttribute(attr, value); input.setAttribute(attr, value);
}); });
}); });
} }
function parseResponse(response) { function _getIdPrefix() {
return response.text().then(function (responseText) { // leading 'r'(andom) to overcome the fact that IDs
var docFrag = document.createRange().createContextualFragment(responseText); // starting with a numeric value are not valid in CSS
_prefixIds(docFrag); return 'r' + Math.floor(Math.random() * 100000) + '__';
return Promise.resolve(docFrag);
},
function (error) {
return Promise.reject(error);
}).catch(function (error) { console.error(error); });
} }
return { return {

View File

@ -324,14 +324,14 @@
headers: headers, headers: headers,
accept: HttpClient.ACCEPT.TEXT_HTML, accept: HttpClient.ACCEPT.TEXT_HTML,
}).then(function(response) { }).then(function(response) {
return HtmlHelpers.parseResponse(response); return HtmlHelpers.parseResponse(response, { originalIds: true });
}).then(function(responseElement) { }).then(function(response) {
setLocalStorageParameter('currentTableUrl', url.href); setLocalStorageParameter('currentTableUrl', url.href);
// reset table // reset table
removeListeners(); removeListeners();
element.classList.remove(ASYNC_TABLE_INITIALIZED_CLASS); element.classList.remove(ASYNC_TABLE_INITIALIZED_CLASS);
// update table with new // update table with new
updateWrapperContents(responseElement); updateWrapperContents(response);
if (callback && typeof callback === 'function') { if (callback && typeof callback === 'function') {
callback(element); callback(element);
@ -344,10 +344,10 @@
}); });
} }
function updateWrapperContents(newHtmlElement) { function updateWrapperContents(response) {
var newPage = document.createElement('div'); var newPage = document.createElement('div');
newPage.appendChild(newHtmlElement); newPage.appendChild(response.element);
var newWrapperContents = newPage.querySelector('#' + element.id + '__' + element.id); var newWrapperContents = newPage.querySelector('#' + element.id);
element.innerHTML = newWrapperContents.innerHTML; element.innerHTML = newWrapperContents.innerHTML;
if (UtilRegistry) { if (UtilRegistry) {

View File

@ -128,8 +128,8 @@
accept: HttpClient.ACCEPT.TEXT_HTML, accept: HttpClient.ACCEPT.TEXT_HTML,
}).then(function(response) { }).then(function(response) {
return HtmlHelpers.parseResponse(response); return HtmlHelpers.parseResponse(response);
}).then(function(responseElement) { }).then(function(response) {
processResponse(responseElement); processResponse(response.element);
if (isAddCell) { if (isAddCell) {
reFocusAddCell(); reFocusAddCell();
} }

View File

@ -173,8 +173,10 @@
headers: MODAL_HEADERS, headers: MODAL_HEADERS,
accept: HttpClient.ACCEPT.TEXT_HTML, accept: HttpClient.ACCEPT.TEXT_HTML,
}).then(function(response) { }).then(function(response) {
return HtmlHelpers.parseResponse(response, element.id); return HtmlHelpers.parseResponse(response);
}).then(processResponse); }).then(function(response) {
processResponse(response.element);
});
} }
function processResponse(responseElement) { function processResponse(responseElement) {