42 lines
1.2 KiB
JavaScript
42 lines
1.2 KiB
JavaScript
/**
|
|
* @file
|
|
* Connect Drupal.behaviors to htmx inserted content.
|
|
*/
|
|
(function (Drupal, htmx, drupalSettings) {
|
|
// Flag used to prevent running htmx initialization twice on elements we know
|
|
// have already been processed.
|
|
let attachFromHtmx = false;
|
|
|
|
// This is a custom event that triggers once the htmx request settled and
|
|
// all JS and CSS assets have been loaded successfully.
|
|
// @see https://htmx.org/api/#on
|
|
// @see htmx-assets.js
|
|
htmx.on('htmx:drupal:load', ({ detail }) => {
|
|
attachFromHtmx = true;
|
|
Drupal.attachBehaviors(detail.elt, drupalSettings);
|
|
attachFromHtmx = false;
|
|
});
|
|
|
|
// When htmx removes elements from the DOM, make sure they're detached first.
|
|
// This event is currently an alias of htmx:beforeSwap
|
|
htmx.on('htmx:drupal:unload', ({ detail }) => {
|
|
Drupal.detachBehaviors(detail.elt, drupalSettings, 'unload');
|
|
});
|
|
|
|
/**
|
|
* Initialize HTMX library on content added by Drupal Ajax Framework.
|
|
*
|
|
* @type {Drupal~behavior}
|
|
*
|
|
* @prop {Drupal~behaviorAttach} attach
|
|
* Initialize htmx behavior.
|
|
*/
|
|
Drupal.behaviors.htmx = {
|
|
attach(context) {
|
|
if (!attachFromHtmx && context !== document) {
|
|
htmx.process(context);
|
|
}
|
|
},
|
|
};
|
|
})(Drupal, htmx, drupalSettings);
|