Rustelo/templates/shared/htmx/ext/path-deps.js
2026-07-18 19:57:03 +01:00

59 lines
1.5 KiB
JavaScript

(function() {
'use strict'
// 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)