Fix Perspective viewer: pass table name in restore, simplify listener

- restore() must include table: tableName so viewer knows which table
- Replace cloneNode listener reset with named _pspClickHandler pattern
- Always inject table name into saved layouts on restore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Paul Trowbridge 2026-04-14 23:14:22 -04:00
parent 5171b9770c
commit 4c71049bf0

View File

@ -757,7 +757,7 @@ function buildDefaultLayout() {
} }
async function initPerspectiveViewer(data) { async function initPerspectiveViewer(data) {
const viewer = document.getElementById('pivot-viewer'); const tableName = `pf_${state.version.id}`;
// terminate old worker if reloading // terminate old worker if reloading
if (state.pspWorker) { if (state.pspWorker) {
@ -770,28 +770,28 @@ async function initPerspectiveViewer(data) {
const worker = await perspective.worker(); const worker = await perspective.worker();
state.pspWorker = worker; state.pspWorker = worker;
const table = await worker.table(data, { name: `pf_${state.version.id}` }); const table = await worker.table(data, { name: tableName });
state.pspTable = table; 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'); 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 detail = e.detail || {};
const eventFilters = (detail.config || {}).filter || []; const eventFilters = (detail.config || {}).filter || [];
const config = await v.save(); extractSliceFromPerspective(eventFilters);
extractSliceFromPerspective(eventFilters, config); };
}); v.removeEventListener('perspective-click', v._pspClickHandler);
v.addEventListener('perspective-click', v._pspClickHandler);
await v.load(worker); await v.load(worker);
const saved = localStorage.getItem(pspLayoutKey()); const saved = localStorage.getItem(pspLayoutKey());
if (saved) { if (saved) {
await v.restore(JSON.parse(saved)); const layout = JSON.parse(saved);
await v.restore({ ...layout, table: tableName });
} else { } else {
await v.restore(buildDefaultLayout()); await v.restore({ ...buildDefaultLayout(), table: tableName });
} }
// update reset button visibility // update reset button visibility