From 40ed7b08271149085b478e8f9935e9c33dafa3d4 Mon Sep 17 00:00:00 2001 From: carson Date: Tue, 6 Jul 2021 10:24:55 -0600 Subject: [PATCH] allow filters for polling --- src/htmx.js | 26 +++++++++++++++++--------- test/attributes/hx-trigger.js | 15 +++++++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/htmx.js b/src/htmx.js index d77e4a29..3c620753 100644 --- a/src/htmx.js +++ b/src/htmx.js @@ -853,7 +853,11 @@ return (function () { if (trigger === "every") { var every = {trigger: 'every'}; consumeUntil(tokens, NOT_WHITESPACE); - every.pollInterval = parseInterval(consumeUntil(tokens, WHITESPACE)); + every.pollInterval = parseInterval(consumeUntil(tokens, /[,\[\s]/)); + var eventFilter = maybeGenerateConditional(elt, tokens, "event"); + if (eventFilter) { + every.eventFilter = eventFilter; + } triggerSpecs.push(every); } else if (trigger.indexOf("sse:") === 0) { triggerSpecs.push({trigger: 'sse', sseEvent: trigger.substr(4)}); @@ -919,14 +923,16 @@ return (function () { getInternalData(elt).cancelled = true; } - function processPolling(elt, verb, path, interval) { + function processPolling(elt, verb, path, spec) { var nodeData = getInternalData(elt); nodeData.timeout = setTimeout(function () { if (bodyContains(elt) && nodeData.cancelled !== true) { - issueAjaxRequest(verb, path, elt); - processPolling(elt, verb, getAttributeValue(elt, "hx-" + verb), interval); + if (!maybeFilterEvent(spec, makeEvent('hx:poll:trigger', {triggerSpec:spec}))) { + issueAjaxRequest(verb, path, elt); + } + processPolling(elt, verb, getAttributeValue(elt, "hx-" + verb), spec); } - }, interval); + }, spec.pollInterval); } function isLocalLink(elt) { @@ -1360,7 +1366,7 @@ return (function () { loadImmediately(elt, verb, path, nodeData, triggerSpec.delay); } else if (triggerSpec.pollInterval) { nodeData.polling = true; - processPolling(elt, verb, path, triggerSpec.pollInterval); + processPolling(elt, verb, path, triggerSpec); } else { addEventListener(elt, verb, path, nodeData, triggerSpec); } @@ -2131,9 +2137,11 @@ return (function () { var eltData = getInternalData(elt); if (eltData.requestInFlight) { var queueStrategy = 'last'; - var eventData = getInternalData(event); - if (eventData && eventData.triggerSpec && eventData.triggerSpec.queue) { - queueStrategy = eventData.triggerSpec.queue; + if (event) { + var eventData = getInternalData(event); + if (eventData && eventData.triggerSpec && eventData.triggerSpec.queue) { + queueStrategy = eventData.triggerSpec.queue; + } } if (eltData.queuedRequests == null) { eltData.queuedRequests = []; diff --git a/test/attributes/hx-trigger.js b/test/attributes/hx-trigger.js index fca35134..0ee23e35 100644 --- a/test/attributes/hx-trigger.js +++ b/test/attributes/hx-trigger.js @@ -316,6 +316,21 @@ describe("hx-trigger attribute", function(){ } }) + it('can filter polling', function(complete){ + this.server.respondWith("GET", "/test", "Called!"); + window.foo = false; + var div = make('
Not Called
'); + var div2 = make('
Not Called
'); + this.server.autoRespond = true; + this.server.autoRespondAfter = 0; + setTimeout(function () { + div.innerHTML.should.equal("Not Called"); + div2.innerHTML.should.equal("Called!"); + delete window.foo; + complete(); + }, 100); + }) + it('bad condition issues error', function(){ this.server.respondWith("GET", "/test", "Called!"); var div = make('
Not Called
');