Skip to content

Commit ee49233

Browse files
Filmbostock
andauthored
expand the inspector if its previous version was expanded (#1475)
* expand the inspector if its previous version was expanded this should be revised more thoroughly when we fix observablehq/inspector#12 closes #1458 * fix multiple display; apply suggestions from code review * fix comment * preserve deep expanded state * handle missing expanded state --------- Co-authored-by: Mike Bostock <[email protected]>
1 parent 6527940 commit ee49233

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

src/client/inspect.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import {Inspector} from "observablehq:runtime";
22

3-
export function inspect(value) {
3+
export function inspect(value, expanded) {
44
const node = document.createElement("div");
55
new Inspector(node).fulfilled(value);
6+
if (expanded) {
7+
for (const path of expanded) {
8+
let child = node;
9+
for (const i of path) child = child?.childNodes[i];
10+
child?.dispatchEvent(new Event("mouseup")); // restore expanded state
11+
}
12+
}
613
return node;
714
}
815

src/client/main.js

+21-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export function define(cell) {
2929
const root = rootsById.get(id);
3030
const loading = findLoading(root);
3131
root._nodes = [];
32+
root._expanded = [];
3233
if (loading) root._nodes.push(loading);
3334
const pending = () => reset(root, loading);
3435
const rejected = (error) => reject(root, error);
@@ -67,7 +68,7 @@ export function define(cell) {
6768
function noop() {}
6869

6970
function clear(root) {
70-
for (const v of root._nodes) v.remove();
71+
root._expanded = root._nodes.map((v) => (v.remove(), getExpanded(v)));
7172
root._nodes.length = 0;
7273
}
7374

@@ -130,7 +131,7 @@ function displayInline(root, value) {
130131
}
131132

132133
function displayBlock(root, value) {
133-
displayNode(root, isNode(value) ? value : inspect(value));
134+
displayNode(root, isNode(value) ? value : inspect(value, root._expanded[root._nodes.length]));
134135
}
135136

136137
export function undefine(id) {
@@ -173,3 +174,21 @@ export function registerRoot(id, node) {
173174
if (node == null) rootsById.delete(id);
174175
else rootsById.set(id, node);
175176
}
177+
178+
function getExpanded(node) {
179+
const expanded = node.querySelectorAll(".observablehq--expanded");
180+
return expanded.length ? Array.from(expanded, (e) => getNodePath(node, e)) : undefined;
181+
}
182+
183+
function getNodePath(node, descendant) {
184+
const path = [];
185+
while (descendant !== node) {
186+
path.push(getChildIndex(descendant));
187+
descendant = descendant.parentNode;
188+
}
189+
return path.reverse();
190+
}
191+
192+
function getChildIndex(node) {
193+
return Array.prototype.indexOf.call(node.parentNode.childNodes, node);
194+
}

yarn.lock

+3-3
Original file line numberDiff line numberDiff line change
@@ -271,9 +271,9 @@
271271
isoformat "^0.2.0"
272272

273273
"@observablehq/inspector@^5.0.0":
274-
version "5.0.0"
275-
resolved "https://registry.yarnpkg.com/@observablehq/inspector/-/inspector-5.0.0.tgz#7dec08d4fa20dfb79977ce62f7cc4a814b44e595"
276-
integrity sha512-Vvg/TQdsZTUaeYbH0IKxYEz37FbRO6kdowoz2PrHLQif54NC1CjEihEjg+ZMSBn587GQxTFABu0CGkFZgtR1UQ==
274+
version "5.0.1"
275+
resolved "https://registry.yarnpkg.com/@observablehq/inspector/-/inspector-5.0.1.tgz#586280d0bc5da55da8e715ade86ba438dc14b056"
276+
integrity sha512-euwWxwDa6KccU4G3D2JBD7GI/2McJh/z7HHEzJKbj2TDa7zhI37eTbTxiwE9rgTWBagvVBel+hAmnJRYBYOv2Q==
277277
dependencies:
278278
isoformat "^0.2.0"
279279

0 commit comments

Comments
 (0)