Stabilize discovery workflow
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
(function () {
|
||||
function request(method, url, body, target, swap) {
|
||||
fetch(url, {
|
||||
method: method,
|
||||
body: body,
|
||||
headers: body ? {'X-Requested-With': 'fetch'} : {'X-Requested-With': 'fetch'}
|
||||
})
|
||||
.then(function (response) { return response.text(); })
|
||||
.then(function (html) {
|
||||
if (!target) {
|
||||
return;
|
||||
}
|
||||
if (swap === 'outerHTML') {
|
||||
target.outerHTML = html;
|
||||
} else {
|
||||
target.innerHTML = html;
|
||||
}
|
||||
install(target);
|
||||
});
|
||||
}
|
||||
|
||||
function targetFor(element) {
|
||||
var selector = element.getAttribute('hx-target');
|
||||
return selector ? document.querySelector(selector) : element;
|
||||
}
|
||||
|
||||
function install(root) {
|
||||
root.querySelectorAll('[hx-get]').forEach(function (element) {
|
||||
if (element.dataset.domovoyGetInstalled === '1') {
|
||||
return;
|
||||
}
|
||||
element.dataset.domovoyGetInstalled = '1';
|
||||
var url = element.getAttribute('hx-get');
|
||||
var trigger = element.getAttribute('hx-trigger') || '';
|
||||
var swap = element.getAttribute('hx-swap') || 'innerHTML';
|
||||
|
||||
if (element.tagName === 'FORM' && trigger.includes('change')) {
|
||||
element.addEventListener('change', function () {
|
||||
var params = new URLSearchParams(new FormData(element));
|
||||
var nextUrl = url + '?' + params.toString();
|
||||
var target = targetFor(element);
|
||||
if (target) {
|
||||
target.setAttribute('hx-get', nextUrl);
|
||||
}
|
||||
request('GET', nextUrl, null, target, swap);
|
||||
});
|
||||
}
|
||||
|
||||
if (trigger.includes('load')) {
|
||||
request('GET', url, null, targetFor(element), swap);
|
||||
}
|
||||
|
||||
var every = trigger.match(/every\s+(\d+)s/);
|
||||
if (every) {
|
||||
window.setInterval(function () {
|
||||
request('GET', url, null, targetFor(element), swap);
|
||||
}, parseInt(every[1], 10) * 1000);
|
||||
}
|
||||
});
|
||||
|
||||
root.querySelectorAll('[hx-post]').forEach(function (element) {
|
||||
if (element.dataset.domovoyPostInstalled === '1') {
|
||||
return;
|
||||
}
|
||||
element.dataset.domovoyPostInstalled = '1';
|
||||
element.addEventListener('click', function () {
|
||||
request(
|
||||
'POST',
|
||||
element.getAttribute('hx-post'),
|
||||
new FormData(),
|
||||
targetFor(element),
|
||||
element.getAttribute('hx-swap') || 'innerHTML'
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
install(document);
|
||||
});
|
||||
})();
|
||||
Reference in New Issue
Block a user