summaryrefslogtreecommitdiff
path: root/static
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2024-04-11 00:19:44 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2024-04-11 00:19:57 +0200
commit5e12dabced6ce55031f5c7f13afb15048d03edcd (patch)
tree5ebec65fcc3e92ef31854b28a134c6432bf1eb58 /static
parent49f7be2a35539bae2d43594c9b39268eec7837d0 (diff)
Timer create & delete
Diffstat (limited to 'static')
-rw-r--r--static/response-targets.js130
-rw-r--r--static/style.css3
2 files changed, 133 insertions, 0 deletions
diff --git a/static/response-targets.js b/static/response-targets.js
new file mode 100644
index 0000000..dd6fd41
--- /dev/null
+++ b/static/response-targets.js
@@ -0,0 +1,130 @@
+(function(){
+
+ /** @type {import("../htmx").HtmxInternalApi} */
+ var api;
+
+ var attrPrefix = 'hx-target-';
+
+ // IE11 doesn't support string.startsWith
+ function startsWith(str, prefix) {
+ return str.substring(0, prefix.length) === prefix
+ }
+
+ /**
+ * @param {HTMLElement} elt
+ * @param {number} respCode
+ * @returns {HTMLElement | null}
+ */
+ function getRespCodeTarget(elt, respCodeNumber) {
+ if (!elt || !respCodeNumber) return null;
+
+ var respCode = respCodeNumber.toString();
+
+ // '*' is the original syntax, as the obvious character for a wildcard.
+ // The 'x' alternative was added for maximum compatibility with HTML
+ // templating engines, due to ambiguity around which characters are
+ // supported in HTML attributes.
+ //
+ // Start with the most specific possible attribute and generalize from
+ // there.
+ var attrPossibilities = [
+ respCode,
+
+ respCode.substr(0, 2) + '*',
+ respCode.substr(0, 2) + 'x',
+
+ respCode.substr(0, 1) + '*',
+ respCode.substr(0, 1) + 'x',
+ respCode.substr(0, 1) + '**',
+ respCode.substr(0, 1) + 'xx',
+
+ '*',
+ 'x',
+ '***',
+ 'xxx',
+ ];
+ if (startsWith(respCode, '4') || startsWith(respCode, '5')) {
+ attrPossibilities.push('error');
+ }
+
+ for (var i = 0; i < attrPossibilities.length; i++) {
+ var attr = attrPrefix + attrPossibilities[i];
+ var attrValue = api.getClosestAttributeValue(elt, attr);
+ if (attrValue) {
+ if (attrValue === "this") {
+ return api.findThisElement(elt, attr);
+ } else {
+ return api.querySelectorExt(elt, attrValue);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /** @param {Event} evt */
+ function handleErrorFlag(evt) {
+ if (evt.detail.isError) {
+ if (htmx.config.responseTargetUnsetsError) {
+ evt.detail.isError = false;
+ }
+ } else if (htmx.config.responseTargetSetsError) {
+ evt.detail.isError = true;
+ }
+ }
+
+ htmx.defineExtension('response-targets', {
+
+ /** @param {import("../htmx").HtmxInternalApi} apiRef */
+ init: function (apiRef) {
+ api = apiRef;
+
+ if (htmx.config.responseTargetUnsetsError === undefined) {
+ htmx.config.responseTargetUnsetsError = true;
+ }
+ if (htmx.config.responseTargetSetsError === undefined) {
+ htmx.config.responseTargetSetsError = false;
+ }
+ if (htmx.config.responseTargetPrefersExisting === undefined) {
+ htmx.config.responseTargetPrefersExisting = false;
+ }
+ if (htmx.config.responseTargetPrefersRetargetHeader === undefined) {
+ htmx.config.responseTargetPrefersRetargetHeader = true;
+ }
+ },
+
+ /**
+ * @param {string} name
+ * @param {Event} evt
+ */
+ onEvent: function (name, evt) {
+ if (name === "htmx:beforeSwap" &&
+ evt.detail.xhr &&
+ evt.detail.xhr.status !== 200) {
+ if (evt.detail.target) {
+ if (htmx.config.responseTargetPrefersExisting) {
+ evt.detail.shouldSwap = true;
+ handleErrorFlag(evt);
+ return true;
+ }
+ if (htmx.config.responseTargetPrefersRetargetHeader &&
+ evt.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)) {
+ evt.detail.shouldSwap = true;
+ handleErrorFlag(evt);
+ return true;
+ }
+ }
+ if (!evt.detail.requestConfig) {
+ return true;
+ }
+ var target = getRespCodeTarget(evt.detail.requestConfig.elt, evt.detail.xhr.status);
+ if (target) {
+ handleErrorFlag(evt);
+ evt.detail.shouldSwap = true;
+ evt.detail.target = target;
+ }
+ return true;
+ }
+ }
+ });
+})();
diff --git a/static/style.css b/static/style.css
index 63193d7..17df2b0 100644
--- a/static/style.css
+++ b/static/style.css
@@ -6,3 +6,6 @@ body {
font-family: sans-serif;
}
+.error {
+ color: red;
+}