This commit is contained in:
carson 2021-03-02 10:47:22 -07:00
parent a664587686
commit ef08797e19
3 changed files with 87 additions and 31 deletions

116
dist/htmx.js vendored
View File

@ -847,12 +847,17 @@ return (function () {
triggerSpec.changed = true;
} else if (token === "once") {
triggerSpec.once = true;
} else if (token === "consume") {
triggerSpec.consume = true;
} else if (token === "delay" && tokens[0] === ":") {
tokens.shift();
triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA));
} else if (token === "from" && tokens[0] === ":") {
tokens.shift();
triggerSpec.from = consumeUntil(tokens, WHITESPACE_OR_COMMA);
} else if (token === "target" && tokens[0] === ":") {
tokens.shift();
triggerSpec.target = consumeUntil(tokens, WHITESPACE_OR_COMMA);
} else if (token === "throttle" && tokens[0] === ":") {
tokens.shift();
triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA));
@ -922,7 +927,7 @@ return (function () {
function shouldCancel(elt) {
return elt.tagName === "FORM" ||
(matches(elt, 'input[type="submit"], button') && closest(elt, 'form') !== null) ||
(elt.tagName === "A" && elt.href && elt.href.indexOf('#') !== 0);
(elt.tagName === "A" && elt.href && elt.getAttribute('href').indexOf('#') !== 0);
}
function ignoreBoostedAnchorCtrlClick(elt, evt) {
@ -962,9 +967,20 @@ return (function () {
return;
}
var eventData = getInternalData(evt);
if (eventData.handledFor == null) {
eventData.handledFor = [];
}
var elementData = getInternalData(elt);
if (!eventData.handled) {
eventData.handled = true;
if (eventData.handledFor.indexOf(elt) < 0) {
eventData.handledFor.push(elt);
if (triggerSpec.consume) {
evt.stopPropagation();
}
if (triggerSpec.target && evt.target) {
if (!evt.target.matches(triggerSpec.target)) {
return;
}
}
if (triggerSpec.once) {
if (elementData.triggeredOnce) {
return;
@ -1052,8 +1068,13 @@ return (function () {
}
function processWebSocketSource(elt, wssSource) {
if (wssSource.indexOf("ws:") !== 0 && wssSource.indexOf("wss:") !== 0) {
wssSource = "wss:" + wssSource;
if (wssSource.indexOf("/") == 0) { // complete absolute paths only
var base_part = location.hostname + (location.port ? ':'+location.port: '');
if (location.protocol == 'https:') {
wssSource = "wss://" + base_part + wssSource;
} else if (location.protocol == 'http:') {
wssSource = "ws://" + base_part + wssSource;
}
}
var socket = htmx.createWebSocket(wssSource);
socket.onerror = function (e) {
@ -1169,6 +1190,7 @@ return (function () {
var settleInfo = makeSettleInfo(elt);
selectAndSwap(swapSpec.swapStyle, elt, target, response, settleInfo)
settleImmediately(settleInfo.tasks)
triggerEvent(elt, "htmx:sseMessage", event)
};
@ -1422,7 +1444,7 @@ return (function () {
while(historyCache.length > 0){
try {
localStorage.setItem("htmx-history-cache", JSON.stringify(historyCache));
return;
break;
} catch (e) {
triggerErrorEvent(getDocument().body, "htmx:historyCacheError", {cause:e, cache: historyCache})
historyCache.shift(); // shrink the cache and retry
@ -1526,22 +1548,21 @@ return (function () {
}
function addRequestIndicatorClasses(elt) {
mutateRequestIndicatorClasses(elt, "add");
}
function removeRequestIndicatorClasses(elt) {
mutateRequestIndicatorClasses(elt, "remove");
}
function mutateRequestIndicatorClasses(elt, action) {
var indicator = getClosestAttributeValue(elt, 'hx-indicator');
if (indicator) {
var indicators = querySelectorAllExt(elt, indicator);
} else {
indicators = [elt];
}
forEach(indicators, function(ic) {
ic.classList[action].call(ic.classList, htmx.config.requestClass);
forEach(indicators, function (ic) {
ic.classList["add"].call(ic.classList, htmx.config.requestClass);
});
return indicators;
}
function removeRequestIndicatorClasses(indicators) {
forEach(indicators, function (ic) {
ic.classList["remove"].call(ic.classList, htmx.config.requestClass);
});
}
@ -1919,16 +1940,22 @@ return (function () {
function ajaxHelper(verb, path, context) {
if (context) {
if (context instanceof Element || isType(context, 'String')) {
issueAjaxRequest(verb, path, null, null, null, resolveTarget(context));
return issueAjaxRequest(verb, path, null, null, null, resolveTarget(context));
} else {
issueAjaxRequest(verb, path, resolveTarget(context.source), context.event, context.handler, resolveTarget(context.target));
return issueAjaxRequest(verb, path, resolveTarget(context.source), context.event, context.handler, resolveTarget(context.target));
}
} else {
issueAjaxRequest(verb, path);
return issueAjaxRequest(verb, path);
}
}
function issueAjaxRequest(verb, path, elt, event, responseHandler, targetOverride) {
var resolve = null;
var reject = null;
var promise = new Promise(function (_resolve, _reject) {
resolve = _resolve;
reject = _reject;
});
if(elt == null) {
elt = getDocument().body;
}
@ -1966,12 +1993,18 @@ return (function () {
// prompt returns null if cancelled and empty string if accepted with no entry
if (promptResponse === null ||
!triggerEvent(elt, 'htmx:prompt', {prompt: promptResponse, target:target}))
return endRequestLock();
resolve();
endRequestLock();
return promise;
}
var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm");
if (confirmQuestion) {
if(!confirm(confirmQuestion)) return endRequestLock();
if(!confirm(confirmQuestion)) {
resolve();
endRequestLock()
return promise;
}
}
var xhr = new XMLHttpRequest();
@ -2014,7 +2047,9 @@ return (function () {
if(errors && errors.length > 0){
triggerEvent(elt, 'htmx:validation:halted', requestConfig)
return endRequestLock();
resolve();
endRequestLock();
return promise;
}
var splitPath = path.split("#");
@ -2060,25 +2095,45 @@ return (function () {
triggerErrorEvent(elt, 'htmx:onLoadError', mergeObjects({error:e}, responseInfo));
throw e;
} finally {
removeRequestIndicatorClasses(elt);
var finalElt = getInternalData(elt).replacedWith || elt;
removeRequestIndicatorClasses(indicators);
var finalElt = elt;
if (!bodyContains(elt)) {
finalElt = getInternalData(target).replacedWith || target;
}
triggerEvent(finalElt, 'htmx:afterRequest', responseInfo);
triggerEvent(finalElt, 'htmx:afterOnLoad', responseInfo);
resolve();
endRequestLock();
}
}
xhr.onerror = function () {
removeRequestIndicatorClasses(elt);
triggerErrorEvent(elt, 'htmx:afterRequest', responseInfo);
triggerErrorEvent(elt, 'htmx:sendError', responseInfo);
removeRequestIndicatorClasses(indicators);
var finalElt = elt;
if (!bodyContains(elt)) {
finalElt = getInternalData(target).replacedWith || target;
}
triggerErrorEvent(finalElt, 'htmx:afterRequest', responseInfo);
triggerErrorEvent(finalElt, 'htmx:sendError', responseInfo);
reject();
endRequestLock();
}
xhr.onabort = function() {
removeRequestIndicatorClasses(elt);
removeRequestIndicatorClasses(indicators);
var finalElt = elt;
if (!bodyContains(elt)) {
finalElt = getInternalData(target).replacedWith || target;
}
triggerErrorEvent(finalElt, 'htmx:afterRequest', responseInfo);
triggerErrorEvent(finalElt, 'htmx:sendAbort', responseInfo);
reject();
endRequestLock();
}
if(!triggerEvent(elt, 'htmx:beforeRequest', responseInfo)) return endRequestLock();
addRequestIndicatorClasses(elt);
if(!triggerEvent(elt, 'htmx:beforeRequest', responseInfo)){
resolve();
endRequestLock()
return promise
}
var indicators = addRequestIndicatorClasses(elt);
forEach(['loadstart', 'loadend', 'progress', 'abort'], function(eventName) {
forEach([xhr, xhr.upload], function (target) {
@ -2092,6 +2147,7 @@ return (function () {
});
});
xhr.send(verb === 'get' ? null : encodeParamsForBody(xhr, elt, filteredParameters));
return promise;
}
function handleAjaxResponse(elt, responseInfo) {

2
dist/htmx.min.js vendored

File diff suppressed because one or more lines are too long

BIN
dist/htmx.min.js.gz vendored

Binary file not shown.