Update intercooler.js

This commit is contained in:
Jason McBrayer 2020-07-08 13:24:00 -04:00
parent adc65f8d5a
commit 012c0b74c1

View File

@ -4,7 +4,7 @@
define(["jquery"], function (a0) {
return (root['Intercooler'] = factory(a0));
});
} else if (typeof exports === 'object') {
} else if (typeof module === 'object' && module.exports) {
// Node. Does not work with strict CommonJS, but
// only CommonJS-like environments that support module.exports,
// like Node.
@ -24,7 +24,7 @@ var Intercooler = Intercooler || (function() {
// work around zepto build issue TODO - fix me
if((typeof Zepto !== "undefined") && ($ == null)) {
$ = Zepto
window["$"] = Zepto
}
//--------------------------------------------------
@ -88,9 +88,10 @@ var Intercooler = Intercooler || (function() {
}
function hideIndicator(elt) {
if (elt.data('ic-use-transition')) {
if (elt.data('ic-use-transition') || elt.data('ic-indicator-cleared')) {
elt.data('ic-use-transition', null);
elt.addClass('ic-use-transition');
elt.data('ic-indicator-cleared', true);
} else {
elt.hide();
}
@ -259,6 +260,11 @@ var Intercooler = Intercooler || (function() {
document.title = xhr.getResponseHeader("X-IC-Title");
}
if (xhr.getResponseHeader("X-IC-Title-Encoded")) {
var decodedTitle = decodeURIComponent((xhr.getResponseHeader("X-IC-Title-Encoded")).replace(/\+/g, '%20'));
document.title = decodedTitle;
}
if (xhr.getResponseHeader("X-IC-Refresh")) {
var pathsToRefresh = xhr.getResponseHeader("X-IC-Refresh").split(",");
log(elt, "X-IC-Refresh: refreshing " + pathsToRefresh, "DEBUG");
@ -351,14 +357,19 @@ var Intercooler = Intercooler || (function() {
function beforeRequest(elt) {
elt.addClass('disabled');
elt.addClass('ic-request-in-flight');
elt.data('ic-request-in-flight', true);
}
function requestCleanup(indicator, elt) {
function requestCleanup(indicator, globalIndicator, elt) {
if (indicator.length > 0) {
hideIndicator(indicator);
}
if (globalIndicator.length > 0) {
hideIndicator(globalIndicator);
}
elt.removeClass('disabled');
elt.removeClass('ic-request-in-flight');
elt.data('ic-request-in-flight', false);
if (elt.data('ic-next-request')) {
elt.data('ic-next-request')["req"]();
@ -439,12 +450,35 @@ var Intercooler = Intercooler || (function() {
return msg;
}
function getLocalURL(baseURL, paramsToPush, data) {
if (paramsToPush) {
baseURL = baseURL + "?";
var vars = {};
data.replace(/([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
$(paramsToPush.split(",")).each(function(index) {
var param = $.trim(this);
var value = vars[param] || "";
baseURL += (index == 0) ? "" : "&";
baseURL += param + "=" + value;
});
}
return baseURL;
}
function handleRemoteRequest(elt, type, url, data, success) {
beforeRequest(elt);
data = replaceOrAddMethod(data, type);
// Global spinner support
var globalIndicator = findGlobalIndicator(elt);
if (globalIndicator && globalIndicator.length > 0) {
showIndicator(globalIndicator);
}
// Spinner support
var indicator = findIndicator(elt);
if (indicator.length > 0) {
@ -479,17 +513,18 @@ var Intercooler = Intercooler || (function() {
}
maybeInvokeLocalAction(elt, "-beforeSend");
},
success: function(data, textStatus, xhr) {
triggerEvent(elt, "success.ic", [elt, data, textStatus, xhr, requestId]);
success: function(responseData, textStatus, xhr) {
triggerEvent(elt, "success.ic", [elt, responseData, textStatus, xhr, requestId]);
log(elt, "AJAX request " + requestId + " was successful.", "DEBUG");
var onSuccess = closestAttrValue(elt, 'ic-on-success');
if (onSuccess) {
if (globalEval(onSuccess, [["elt", elt], ["data", data], ["textStatus", textStatus], ["xhr", xhr]]) == false) {
if (globalEval(onSuccess, [["elt", elt], ["data", responseData], ["textStatus", textStatus], ["xhr", xhr]]) == false) {
return;
}
}
var beforeHeaders = new Date();
var oldTitle = document.title;
try {
if (processHeaders(elt, xhr)) {
log(elt, "Processed headers for request " + requestId + " in " + (new Date() - beforeHeaders) + "ms", "DEBUG");
@ -497,10 +532,12 @@ var Intercooler = Intercooler || (function() {
if (xhr.getResponseHeader("X-IC-PushURL") || closestAttrValue(elt, 'ic-push-url') == "true") {
try {
requestCleanup(indicator, elt); // clean up before snap-shotting HTML
var newUrl = xhr.getResponseHeader("X-IC-PushURL") || closestAttrValue(elt, 'ic-src');
requestCleanup(indicator, globalIndicator, elt); // clean up before snap-shotting HTML
var baseURL = closestAttrValue(elt, 'ic-src');
var paramsToPush = closestAttrValue(elt, 'ic-push-params');
var newUrl = xhr.getResponseHeader("X-IC-PushURL") || getLocalURL(baseURL, paramsToPush, data);
if(_history) {
_history.snapshotForHistory(newUrl);
_history.snapshotForHistory(newUrl, oldTitle);
} else {
throw "History support not enabled";
}
@ -509,11 +546,11 @@ var Intercooler = Intercooler || (function() {
}
}
success(data, textStatus, elt, xhr);
success(responseData, textStatus, elt, xhr);
log(elt, "Process content for request " + requestId + " in " + (new Date() - beforeSuccess) + "ms", "DEBUG");
}
triggerEvent(elt, "after.success.ic", [elt, data, textStatus, xhr, requestId]);
triggerEvent(elt, "after.success.ic", [elt, responseData, textStatus, xhr, requestId]);
maybeInvokeLocalAction(elt, "-success");
} catch (e) {
log(elt, "Error processing successful request " + requestId + " : " + formatError(e), "ERROR");
@ -531,7 +568,7 @@ var Intercooler = Intercooler || (function() {
},
complete: function(xhr, status) {
log(elt, "AJAX request " + requestId + " completed in " + (new Date() - requestStart) + "ms", "DEBUG");
requestCleanup(indicator, elt);
requestCleanup(indicator, globalIndicator, elt);
try {
if ($.contains(document, elt[0])) {
triggerEvent(elt, "complete.ic", [elt, data, status, xhr, requestId]);
@ -557,14 +594,24 @@ var Intercooler = Intercooler || (function() {
triggerEvent($(document), "beforeAjaxSend.ic", [ajaxSetup, elt]);
if(ajaxSetup.cancel) {
requestCleanup(indicator, elt);
requestCleanup(indicator, globalIndicator, elt);
} else {
$.ajax(ajaxSetup)
}
}
function findGlobalIndicator(elt) {
var indicator = $([]);
elt = $(elt);
var attr = closestAttrValue(elt, 'ic-global-indicator');
if (attr && attr !== "false") {
indicator = $(attr).first();
}
return indicator;
}
function findIndicator(elt) {
var indicator = null;
var indicator = $([]);
elt = $(elt);
if (getICAttribute(elt, 'ic-indicator')) {
indicator = $(getICAttribute(elt, 'ic-indicator')).first();
@ -612,14 +659,14 @@ var Intercooler = Intercooler || (function() {
return data;
}
function appendData(data, string, value) {
function appendData(data, key, value) {
if ($.type(data) === "string") {
if($.type(value) !== "string") {
value = JSON.stringify(value);
}
return data + "&" + string + "=" + encodeURIComponent(value);
return data + "&" + key + "=" + encodeURIComponent(value);
} else {
data.append(string, value);
data.append(key, value);
return data;
}
}
@ -727,6 +774,7 @@ var Intercooler = Intercooler || (function() {
});
} else {
processMacros(elt);
processEnhancement(elt);
processSources(elt);
processPolling(elt);
processEventSources(elt);
@ -846,6 +894,18 @@ var Intercooler = Intercooler || (function() {
}
}
function processEnhancement(elt) {
if (elt.closest('.ic-ignore').length == 0) {
if(closestAttrValue(elt, 'ic-enhance') === 'true') {
enhanceDomTree(elt);
} else {
elt.find(getICAttributeSelector('ic-enhance')).each(function(){
enhanceDomTree($(this));
});
}
}
}
function processEventSources(elt) {
if (elt.closest('.ic-ignore').length == 0) {
handleEventSource(elt);
@ -1024,14 +1084,15 @@ var Intercooler = Intercooler || (function() {
elt = $(elt);
if (getICAttribute(elt, 'ic-sse-src')) {
var evtSrcUrl = getICAttribute(elt, 'ic-sse-src');
var eventSource = initEventSource(elt, evtSrcUrl);
var evtSrcWithCredentials = getICAttribute(elt, 'ic-sse-with-credentials') === 'true';
var eventSource = initEventSource(elt, evtSrcUrl, evtSrcWithCredentials);
elt.data('ic-event-sse-source', eventSource);
elt.data('ic-event-sse-map', {});
}
}
function initEventSource(elt, evtSrcUrl) {
var eventSource = Intercooler._internal.initEventSource(evtSrcUrl);
function initEventSource(elt, evtSrcUrl, evtSrcWithCredentials) {
var eventSource = Intercooler._internal.initEventSource(evtSrcUrl, evtSrcWithCredentials);
eventSource.onmessage = function(e) {
processICResponse(e.data, elt, false);
};
@ -1069,7 +1130,9 @@ var Intercooler = Intercooler || (function() {
}
function handleTriggerOn(elt) {
if (getICAttribute(elt, 'ic-trigger-on')) {
var triggerOnValue = getICAttribute(elt, 'ic-trigger-on');
if (triggerOnValue) {
// record button or submit input click info
if(elt.is('form')) {
elt.on('click focus', 'input, button, select, textarea', function(e){
@ -1080,25 +1143,29 @@ var Intercooler = Intercooler || (function() {
}
});
}
if (getICAttribute(elt, 'ic-trigger-on') == 'load') {
var triggerOnArray = triggerOnValue.split(",");
for (var i = 0; i < triggerOnArray.length; i++) {
var triggerOn = $.trim(triggerOnArray[i]);
var splitTriggerOn = triggerOn.split(" ");
var eventString = eventFor(splitTriggerOn[0], $(elt));
var eventModifier = splitTriggerOn[1];
if (triggerOn == 'load') {
fireICRequest(elt);
} else if (getICAttribute(elt, 'ic-trigger-on') == 'scrolled-into-view') {
} else if (triggerOn == 'scrolled-into-view') {
initScrollHandler();
setTimeout(function() {
triggerEvent($(window), 'scroll');
}, 100); // Trigger a scroll in case element is already viewable
} else {
var triggerOn = getICAttribute(elt, 'ic-trigger-on').split(" ");
if(triggerOn[0].indexOf("sse:") == 0) {
if(eventString.indexOf("sse:") == 0) {
//Server-sent event, find closest event source and register for it
var sourceElt = elt.closest(getICAttributeSelector('ic-sse-src'));
if(sourceElt) {
registerSSE(sourceElt, triggerOn[0].substr(4))
if(sourceElt.length > 0) {
registerSSE(sourceElt, splitTriggerOn[0].substr(4))
}
} else {
var triggerOn = getICAttribute($(elt), 'ic-trigger-on').split(" ");
var event = eventFor(triggerOn[0], $(elt));
$(getTriggeredElement(elt)).on(event, function(e) {
$(getTriggeredElement(elt)).on(eventString, function(e) {
var onBeforeTrigger = closestAttrValue(elt, 'ic-on-beforeTrigger');
if (onBeforeTrigger) {
if (globalEval(onBeforeTrigger, [["elt", elt], ["evt", e], ["elt", elt]]) == false) {
@ -1107,14 +1174,14 @@ var Intercooler = Intercooler || (function() {
}
}
if (triggerOn[1] == 'changed') {
if (eventModifier == 'changed') {
var currentVal = elt.val();
var previousVal = elt.data('ic-previous-val');
elt.data('ic-previous-val', currentVal);
if (currentVal != previousVal) {
fireICRequest(elt);
}
} else if (triggerOn[1] == 'once') {
} else if (eventModifier == 'once') {
var alreadyTriggered = elt.data('ic-already-triggered');
elt.data('ic-already-triggered', true);
if (alreadyTriggered !== true) {
@ -1129,10 +1196,12 @@ var Intercooler = Intercooler || (function() {
}
return true;
});
if(event && (event.indexOf("timeout:") == 0)) {
if(eventString && (eventString.indexOf("timeout:") == 0)) {
var timeout = parseInterval(eventString.split(":")[1]);
setTimeout(function () {
$(getTriggeredElement(elt)).trigger(event);
}, parseInterval(event.split(":")[1]));
$(getTriggeredElement(elt)).trigger(eventString);
}, timeout);
}
}
}
}
@ -1178,6 +1247,7 @@ var Intercooler = Intercooler || (function() {
setIfAbsent(elt, 'ic-trigger-on', 'default');
setIfAbsent(elt, 'ic-deps', 'ignore');
}
if (macroIs(macro, 'ic-action')) {
setIfAbsent(elt, 'ic-trigger-on', 'default');
}
@ -1209,6 +1279,51 @@ var Intercooler = Intercooler || (function() {
}
}
function isLocalLink(anchor) {
return location.hostname === anchor[0].hostname &&
anchor.attr('href') &&
!anchor.attr('href').startsWith("#")
}
function enhanceAnchor(anchor) {
if (closestAttrValue(anchor, 'ic-enhance') === "true") {
if (isLocalLink(anchor)) {
setIfAbsent(anchor, 'ic-src', anchor.attr('href'));
setIfAbsent(anchor, 'ic-trigger-on', 'default');
setIfAbsent(anchor, 'ic-deps', 'ignore');
setIfAbsent(anchor, 'ic-push-url', 'true');
}
}
}
function determineFormVerb(form) {
return form.find('input[name="_method"]').val() || form.attr('method') || form[0].method;
}
function enhanceForm(form) {
if (closestAttrValue(form, 'ic-enhance') === "true") {
setIfAbsent(form, 'ic-src', form.attr('action'));
setIfAbsent(form, 'ic-trigger-on', 'default');
setIfAbsent(form, 'ic-deps', 'ignore');
setIfAbsent(form, 'ic-verb', determineFormVerb(form));
}
}
function enhanceDomTree(elt) {
if(elt.is('a')) {
enhanceAnchor(elt);
}
elt.find('a').each(function(){
enhanceAnchor($(this));
});
if(elt.is('form')){
enhanceForm(elt);
}
elt.find('form').each(function(){
enhanceForm($(this));
});
}
function setIfAbsent(elt, attr, value) {
if (getICAttribute(elt, attr) == null) {
setICAttribute(elt, attr, value);
@ -1352,6 +1467,19 @@ var Intercooler = Intercooler || (function() {
if (forHistory != true) {
maybeScrollToTarget(elt, target);
}
var switchClass = elt.closest(getICAttributeSelector('ic-switch-class'));
var classToSwitch = switchClass.attr(fixICAttributeName('ic-switch-class'));
if(classToSwitch) {
switchClass.children().removeClass(classToSwitch);
switchClass.children().each(function(){
if($.contains($(this)[0], $(elt)[0]) || $(this)[0] == $(elt)[0]) {
$(this).addClass(classToSwitch);
$(this).addClass(classToSwitch);
}
})
}
}
};
@ -1692,13 +1820,14 @@ var Intercooler = Intercooler || (function() {
}
}
function makeHistoryEntry(html, yOffset, url) {
function makeHistoryEntry(html, yOffset, url, title) {
var restorationData = {
"url": url,
"id": HISTORY_SLOT_PREFIX + url,
"content": html,
"yOffset": yOffset,
"timestamp": new Date().getTime()
"timestamp": new Date().getTime(),
"title": title
};
updateLRUList(url);
// save to the history slot
@ -1724,18 +1853,18 @@ var Intercooler = Intercooler || (function() {
function updateHistory() {
if (_snapshot) {
pushUrl(_snapshot.newUrl, currentUrl(), _snapshot.oldHtml, _snapshot.yOffset);
pushUrl(_snapshot.newUrl, currentUrl(), _snapshot.oldHtml, _snapshot.yOffset, _snapshot.oldTitle);
_snapshot = null;
}
}
function pushUrl(newUrl, originalUrl, originalHtml, yOffset) {
function pushUrl(newUrl, originalUrl, originalHtml, yOffset, originalTitle) {
var historyEntry = makeHistoryEntry(originalHtml, yOffset, originalUrl);
var historyEntry = makeHistoryEntry(originalHtml, yOffset, originalUrl, originalTitle);
history.replaceState({"ic-id": historyEntry.id}, "", "");
var t = getTargetForHistory($('body'));
var restorationData = makeHistoryEntry(t.html(), window.pageYOffset, newUrl);
var restorationData = makeHistoryEntry(t.html(), window.pageYOffset, newUrl, document.title);
history.pushState({'ic-id': restorationData.id}, "", newUrl);
triggerEvent(t, "pushUrl.ic", [t, restorationData]);
@ -1748,7 +1877,12 @@ var Intercooler = Intercooler || (function() {
if (historyData) {
processICResponse(historyData["content"], getTargetForHistory($('body')), true);
if (historyData["yOffset"]) {
window.scrollTo(0, historyData["yOffset"])
setTimeout(function () {
window.scrollTo(0, historyData["yOffset"]);
}, 100);
}
if (historyData["title"]) {
document.title = historyData["title"];
}
return true;
} else {
@ -1771,13 +1905,14 @@ var Intercooler = Intercooler || (function() {
}
}
function snapshotForHistory(newUrl) {
function snapshotForHistory(newUrl, oldTitle) {
var t = getTargetForHistory($('body'));
triggerEvent(t, "beforeHistorySnapshot.ic", [t]);
_snapshot = {
newUrl: newUrl,
oldHtml: t.html(),
yOffset: window.pageYOffset
yOffset: window.pageYOffset,
oldTitle: oldTitle
};
}
@ -1897,12 +2032,11 @@ var Intercooler = Intercooler || (function() {
if($.zepto) {
$('body').data('zeptoDataTest', {});
if(typeof($('body').data('zeptoDataTest')) == "string") {
console.log("!!!! Please include the data module with Zepto! Intercooler requires full data support to function !!!!")
log(null,
"!!!! Please include the data module with Zepto! Intercooler requires full data support to function !!!!",
"ERROR")
}
}
if (location.search && location.search.indexOf("ic-launch-debugger=true") >= 0) {
Intercooler.debug();
}
}
$(function() {
@ -1922,27 +2056,22 @@ var Intercooler = Intercooler || (function() {
isDependent: isDependent,
getTarget: getTarget,
processHeaders: processHeaders,
startPolling: startPolling,
cancelPolling: cancelPolling,
setIsDependentFunction: function(func) {
_isDependentFunction = func;
},
ready: function(readyHandler) {
_readyHandlers.push(readyHandler);
},
debug: function() {
var debuggerUrl = closestAttrValue('body', 'ic-debugger-url') ||
"https://intercoolerreleases-leaddynocom.netdna-ssl.com/intercooler-debugger.js";
$.getScript(debuggerUrl)
.fail(function(jqxhr, settings, exception) {
log($('body'), formatError(exception), "ERROR");
});
},
_internal: {
init: init,
replaceOrAddMethod: replaceOrAddMethod,
initEventSource: function(url) {
return new EventSource(url);
initEventSource: function(url, withCredentials) {
return new EventSource(url, {withCredentials: withCredentials});
},
globalEval: globalEval
globalEval: globalEval,
getLocalURL: getLocalURL
}
};
})();