From 910d7a90fef9f16ace2084631d5873a5bf5c7e68 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Thu, 29 Nov 2018 12:43:10 +0100 Subject: [PATCH] Fix multiple js-initialization issues --- templates/standalone/inputs.julius | 12 ++++++++---- templates/table/layout.julius | 25 ++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/templates/standalone/inputs.julius b/templates/standalone/inputs.julius index 88b658851..f45a224c7 100644 --- a/templates/standalone/inputs.julius +++ b/templates/standalone/inputs.julius @@ -118,23 +118,27 @@ document.addEventListener('setup', function(e) { return; // initialize checkboxes - Array.from(e.detail.scope.querySelectorAll('input[type="checkbox"]')).forEach(function(inp) { + Array.from(e.detail.scope.querySelectorAll('input[type="checkbox"]:not(.js-initialized)')).forEach(function(inp) { window.utils.initializeCheckboxRadio(inp, 'checkbox'); + inp.classList.add("js-initialized"); }); // initialize radios - Array.from(e.detail.scope.querySelectorAll('input[type="radio"]')).forEach(function(inp) { + Array.from(e.detail.scope.querySelectorAll('input[type="radio"]:not(.js-initialized)')).forEach(function(inp) { window.utils.initializeCheckboxRadio(inp, 'radio'); + inp.classList.add("js-initialized"); }); // initialize file-upload-fields - Array.from(e.detail.scope.querySelectorAll('input[type="file"]')).forEach(function(inp) { + Array.from(e.detail.scope.querySelectorAll('input[type="file"]:not(.js-initialized)')).forEach(function(inp) { window.utils.initializeFileUpload(inp); + inp.classList.add("js-initialized"); }); // initialize file-checkbox-fields - Array.from(e.detail.scope.querySelectorAll('.js-file-checkbox')).forEach(function(inp) { + Array.from(e.detail.scope.querySelectorAll('.js-file-checkbox:not(.js-initialized)')).forEach(function(inp) { window.utils.reactiveFileCheckbox(inp); + inp.classList.add("js-initialized"); }); }); diff --git a/templates/table/layout.julius b/templates/table/layout.julius index 25ded585f..d202b780f 100644 --- a/templates/table/layout.julius +++ b/templates/table/layout.julius @@ -3,6 +3,11 @@ document.addEventListener('setup', function DOMContentLoaded(e) { + console.log('dbtable', e); + + if (e.detail.module && e.detail.module !== 'dbtable') + return; + function setupAsync(wrapper) { var table = wrapper.querySelector('#' + #{String $ dbtIdent}); @@ -66,16 +71,30 @@ wrapper.innerHTML = data; // set up async functionality again - setupAsync(wrapper); - table.querySelector('tbody').innerHTML = data; + wrapper.classList.remove("js-initialized"); + document.dispatchEvent(new CustomEvent('setup', { + detail: { scope: wrapper }, + bubbles: true, + cancelable: true + })); + // table.querySelector('tbody').innerHTML = data; }).catch(function(err) { console.error(err); }); } + + wrapper.classList.add("js-initialized"); } - var wrapperEl = e.detail.scope.querySelector('#' + #{String $ dbtIdent} + '-table-wrapper'); + var selector = '#' + #{String $ dbtIdent} + '-table-wrapper:not(.js-initialized)'; + var wrapperEl = e.detail.scope.querySelector(selector); if (wrapperEl) setupAsync(wrapperEl); + else if (e.detail.scope.matches(selector)) + setupAsync(e.detail.scope); }); })(); + +document.addEventListener('DOMContentLoaded', function() { + document.dispatchEvent(new CustomEvent('setup', { detail: { scope: document.body, module: 'dbtable' }, bubbles: true, cancelable: true })); +});