Add "ignore:" command for extensions

This commit is contained in:
Ben Pate 2020-12-14 13:26:34 -07:00
parent 8bad3b61f5
commit 84ac44b591
2 changed files with 46 additions and 13 deletions

View File

@ -1735,24 +1735,35 @@ return (function () {
delete extensions[name];
}
function getExtensions(elt, extensionsToReturn) {
function getExtensions(elt) {
return getExtensionNames(elt).map(function (name) {
return extensions[name]
}).filter(function (extension) {
return (extension != undefined)
})
}
function getExtensionNames(elt) {
if (elt == null) {
return extensionsToReturn;
return []
}
if (extensionsToReturn == null) {
extensionsToReturn = [];
}
var extensionsForElement = getAttributeValue(elt, "hx-ext");
if (extensionsForElement) {
forEach(extensionsForElement.split(","), function(extensionName){
extensionName = extensionName.replace(/ /g, '');
var extension = extensions[extensionName];
if (extension && extensionsToReturn.indexOf(extension) < 0) {
extensionsToReturn.push(extension);
var result = getExtensionNames(parentElt(elt));
var exts = getAttributeValue(elt, "hx-ext");
if (exts) {
exts = exts.replace(/ /g, '');
forEach(exts.split(","), function (name) {
if (name.slice(0, 7) == "ignore:") {
result = result.filter(function (n) { return n != name.slice(7) });
} else if (result.indexOf(name) < 0) {
result.push(name)
}
});
}
return getExtensions(parentElt(elt), extensionsToReturn);
return result
}
//====================================================================

View File

@ -94,5 +94,27 @@ describe("hx-ext attribute", function() {
ext3Calls.should.equal(0);
});
it('Extensions are ignored properly', function () {
this.server.respondWith("GET", "/test", "Clicked!");
make('<div id="div-AA" hx-ext="ext-1, ext-2"><button id="btn-AA" hx-get="/test">Click Me!</button>' +
'<div id="div-BB" hx-ext="ignore:ext-1"><button id="btn-BB" hx-get="/test"></div></div>')
var btn1 = byId("btn-AA");
var btn2 = byId("btn-BB");
btn1.click();
this.server.respond();
ext1Calls.should.equal(1);
ext2Calls.should.equal(1);
ext3Calls.should.equal(0);
btn2.click();
this.server.respond();
ext1Calls.should.equal(1);
ext2Calls.should.equal(2);
ext3Calls.should.equal(0);
});
});