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) {
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