support header-based triggers after swaps and settles

This commit is contained in:
carson 2020-10-04 10:00:40 -06:00
parent af0ae86325
commit 6da50570bc

View File

@ -619,22 +619,21 @@ return (function () {
}
}
function handleTrigger(elt, trigger) {
if (trigger) {
if (trigger.indexOf("{") === 0) {
var triggers = parseJSON(trigger);
for (var eventName in triggers) {
if (triggers.hasOwnProperty(eventName)) {
var detail = triggers[eventName];
if (!isRawObject(detail)) {
detail = {"value": detail}
}
triggerEvent(elt, eventName, detail);
function handleTrigger(xhr, header, elt) {
var triggerBody = xhr.getResponseHeader(header);
if (triggerBody.indexOf("{") === 0) {
var triggers = parseJSON(triggerBody);
for (var eventName in triggers) {
if (triggers.hasOwnProperty(eventName)) {
var detail = triggers[eventName];
if (!isRawObject(detail)) {
detail = {"value": detail}
}
triggerEvent(elt, eventName, detail);
}
} else {
triggerEvent(elt, trigger, []);
}
} else {
triggerEvent(elt, triggerBody, []);
}
}
@ -1613,6 +1612,10 @@ return (function () {
}
}
function hasHeader(xhr, regexp) {
return xhr.getAllResponseHeaders().match(regexp);
}
function issueAjaxRequest(elt, verb, path, eventTarget) {
var target = getTarget(elt);
if (target == null) {
@ -1726,11 +1729,11 @@ return (function () {
try {
if (!triggerEvent(elt, 'htmx:beforeOnLoad', eventDetail)) return;
if (xhr.getAllResponseHeaders().search(/HX-Trigger/i) >= 0) {
handleTrigger(elt, this.getResponseHeader("HX-Trigger"));
if (hasHeader(xhr, /HX-Trigger:/i)) {
handleTrigger(xhr, "HX-Trigger", elt);
}
if (xhr.getAllResponseHeaders().search(/HX-Push/i) >= 0) {
if (hasHeader(xhr,/HX-Push:/i)) {
var pushedUrl = this.getResponseHeader("HX-Push");
}
@ -1792,6 +1795,11 @@ return (function () {
if (anchor) {
location.hash = anchor;
}
if (hasHeader(xhr, /HX-Trigger-After-Swap:/i)) {
handleTrigger(xhr, "HX-Trigger-After-Swap", elt);
}
var doSettle = function(){
forEach(settleInfo.tasks, function (task) {
task.call();
@ -1809,6 +1817,10 @@ return (function () {
triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path:pathToPush});
}
updateScrollState(target, settleInfo.elts, swapSpec);
if (hasHeader(xhr, /HX-Trigger-After-Settle:/i)) {
handleTrigger(xhr, "HX-Trigger-After-Settle", elt);
}
}
if (swapSpec.settleDelay > 0) {