aboutsummaryrefslogtreecommitdiff
path: root/static/js/ext/path-deps.js
diff options
context:
space:
mode:
authorAlexander Neonxp Kiryukhin <i@neonxp.ru>2024-10-12 02:52:22 +0300
committerAlexander Neonxp Kiryukhin <i@neonxp.ru>2024-10-12 02:53:52 +0300
commitd05ea66f4bbcf0cc5c8908f3435c68de1b070fa1 (patch)
tree7c7a769206646f2b81a0eda0680f0be5033a4197 /static/js/ext/path-deps.js
Начальная версияv0.0.1
Diffstat (limited to 'static/js/ext/path-deps.js')
-rw-r--r--static/js/ext/path-deps.js63
1 files changed, 63 insertions, 0 deletions
diff --git a/static/js/ext/path-deps.js b/static/js/ext/path-deps.js
new file mode 100644
index 0000000..8460e83
--- /dev/null
+++ b/static/js/ext/path-deps.js
@@ -0,0 +1,63 @@
+(function(undefined){
+ 'use strict';
+ if (htmx.version && !htmx.version.startsWith("1.")) {
+ console.warn("WARNING: You are using an htmx 1 extension with htmx " + htmx.version +
+ ". It is recommended that you move to the version of this extension found on https://htmx.org/extensions")
+ }
+ // Save a reference to the global object (window in the browser)
+ var _root = this;
+
+ function dependsOn(pathSpec, url) {
+ if (pathSpec === "ignore") {
+ return false;
+ }
+ var dependencyPath = pathSpec.split("/");
+ var urlPath = url.split("/");
+ for (var i = 0; i < urlPath.length; i++) {
+ var dependencyElement = dependencyPath.shift();
+ var pathElement = urlPath[i];
+ if (dependencyElement !== pathElement && dependencyElement !== "*") {
+ return false;
+ }
+ if (dependencyPath.length === 0 || (dependencyPath.length === 1 && dependencyPath[0] === "")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function refreshPath(path) {
+ var eltsWithDeps = htmx.findAll("[path-deps]");
+ for (var i = 0; i < eltsWithDeps.length; i++) {
+ var elt = eltsWithDeps[i];
+ if (dependsOn(elt.getAttribute('path-deps'), path)) {
+ htmx.trigger(elt, "path-deps");
+ }
+ }
+ }
+
+ htmx.defineExtension('path-deps', {
+ onEvent: function (name, evt) {
+ if (name === "htmx:beforeOnLoad") {
+ var config = evt.detail.requestConfig;
+ // mutating call
+ if (config.verb !== "get" && evt.target.getAttribute('path-deps') !== 'ignore') {
+ refreshPath(config.path);
+ }
+ }
+ }
+ });
+
+ /**
+ * ********************
+ * Expose functionality
+ * ********************
+ */
+
+ _root.PathDeps = {
+ refresh: function(path) {
+ refreshPath(path);
+ }
+ };
+
+}).call(this);