Skip to content

Commit 1bf450b

Browse files
authored
Fix widget loading inside shadowRoot (holoviz panel) (#25)
1 parent 604f650 commit 1bf450b

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

js/widget.js

+9-8
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ async function render({ model, el }) {
1616
// CRITICAL: We must ensure the div exists before proceeding
1717
// This prevents the "__graphviz__" error that occurs when trying to
1818
// initialize d3-graphviz on a non-existent element
19-
await new Promise((resolve, reject) => {
19+
const widgetElem = await new Promise((resolve, reject) => {
2020
let attempts = 0;
2121
const checkElement = () => {
22-
const div = document.getElementById(widgetId);
22+
// document.queryElementById() and friends don't work with shadowRoot, so we use element reference
23+
const div = document.getElementById(widgetId) || el.querySelector(`#${widgetId}`);
2324
if (div) {
2425
Logger.debug(`Widget ${widgetId}: DOM element initialized`);
25-
resolve();
26+
resolve(div);
2627
} else if (attempts < 10) {
2728
Logger.debug(`Widget ${widgetId}: DOM element not found, attempt ${attempts + 1}/10`);
2829
attempts++;
@@ -36,7 +37,7 @@ async function render({ model, el }) {
3637
});
3738

3839
// Initialize d3-graphviz and wait for it to be ready
39-
const d3graphvizInstance = d3graphviz(`#${widgetId}`, { useWorker: false });
40+
const d3graphvizInstance = d3graphviz(widgetElem, { useWorker: false });
4041

4142
// Wait for initialization
4243
await new Promise((resolve) => {
@@ -61,7 +62,7 @@ async function render({ model, el }) {
6162
// Initialize the jquery-graphviz plugin and wait for it to be ready
6263
// This sets up the interactive features like highlighting
6364
await new Promise((resolve) => {
64-
$(`#${widgetId}`).graphviz({
65+
$(widgetElem).graphviz({
6566
shrink: null,
6667
zoom: false,
6768
ready: function () {
@@ -95,13 +96,13 @@ async function render({ model, el }) {
9596
.zoom(zoomEnabled)
9697
.on("end", () => {
9798
Logger.debug(`Widget ${widgetId}: Render complete`);
98-
const svg = $(`#${widgetId}`).data("graphviz.svg");
99+
const svg = $(widgetElem).data("graphviz.svg");
99100
if (svg) {
100101
svg.setup();
101102
// If zoom is disabled, remove zoom behavior completely
102103
if (!zoomEnabled) {
103104
// Remove zoom behavior from the SVG
104-
d3.select(`#${widgetId} svg`).on(".zoom", null);
105+
d3.select(widgetElem.querySelector('svg')).on(".zoom", null);
105106
}
106107
Logger.info(`Widget ${widgetId}: Setup successful`);
107108
} else {
@@ -161,7 +162,7 @@ async function render({ model, el }) {
161162

162163
model.on("change:freeze_scroll", async () => {
163164
const freezeScroll = model.get("freeze_scroll");
164-
const svg = d3.select(`#${widgetId} svg`);
165+
const svg = d3.select(widgetElem.querySelector('svg'));
165166
const zoomEnabled = model.get("enable_zoom");
166167

167168
if (freezeScroll) {

0 commit comments

Comments
 (0)