diff --git a/public/app.js b/public/app.js index 3d1df78..bb067ec 100644 --- a/public/app.js +++ b/public/app.js @@ -757,7 +757,7 @@ function buildDefaultLayout() { } async function initPerspectiveViewer(data) { - const viewer = document.getElementById('pivot-viewer'); + const tableName = `pf_${state.version.id}`; // terminate old worker if reloading if (state.pspWorker) { @@ -770,28 +770,28 @@ async function initPerspectiveViewer(data) { const worker = await perspective.worker(); state.pspWorker = worker; - const table = await worker.table(data, { name: `pf_${state.version.id}` }); - state.pspTable = table; + const table = await worker.table(data, { name: tableName }); + state.pspTable = table; - // remove old listener to avoid stacking on refresh - const fresh = viewer.cloneNode(false); - viewer.parentNode.replaceChild(fresh, viewer); const v = document.getElementById('pivot-viewer'); - v.addEventListener('perspective-click', async (e) => { + // re-attach click listener (use named handler so it can be replaced on refresh) + v._pspClickHandler = async (e) => { const detail = e.detail || {}; const eventFilters = (detail.config || {}).filter || []; - const config = await v.save(); - extractSliceFromPerspective(eventFilters, config); - }); + extractSliceFromPerspective(eventFilters); + }; + v.removeEventListener('perspective-click', v._pspClickHandler); + v.addEventListener('perspective-click', v._pspClickHandler); await v.load(worker); const saved = localStorage.getItem(pspLayoutKey()); if (saved) { - await v.restore(JSON.parse(saved)); + const layout = JSON.parse(saved); + await v.restore({ ...layout, table: tableName }); } else { - await v.restore(buildDefaultLayout()); + await v.restore({ ...buildDefaultLayout(), table: tableName }); } // update reset button visibility