Skip to content

Commit 48e25b6

Browse files
authored
feat(widget): Suppress right-click event propagation (#160)
1 parent 66b8fd6 commit 48e25b6

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/higlass/_display.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@
2424
</body>
2525
<script type="module">
2626
import * as hglib from "https://esm.sh/higlass@{{ higlass_version }}?deps=react@{{ react_version }},react-dom@{{ react_version }},pixi.js@{{ pixijs_version }}";
27-
hglib.viewer(
28-
document.getElementById('{{ output_div }}'),
29-
{{ viewconf }},
30-
);
31-
</script>
27+
28+
let el = document.getElementById('{{ output_div }}');
29+
hglib.viewer(el, {{ viewconf }});
30+
31+
// prevent right click events from bubbling up to Jupyter/JupyterLab
32+
el.addEventListener("contextmenu", (event) => event.stopPropagation());
33+
</script>
3234
</html>
3335
""" # noqa
3436
)

src/higlass/widget.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,27 @@ function toPts({ xDomain, yDomain }) {
1212
return [x, xe, y, ye];
1313
}
1414

15+
/**
16+
* @param {HTMLElement} el
17+
* @returns {() => void} unlisten
18+
*/
19+
function addEventListenersTo(el) {
20+
let controller = new AbortController();
21+
22+
// prevent right click events from bubbling up to Jupyter/JupyterLab
23+
el.addEventListener("contextmenu", (event) => event.stopPropagation(), {
24+
signal: controller.signal,
25+
});
26+
27+
return () => controller.abort();
28+
}
29+
30+
/** @type {import("npm:@anywidget/[email protected]").Render} */
1531
async function render({ model, el }) {
1632
let viewconf = model.get("_viewconf");
1733
let options = model.get("_options") ?? {};
1834
let api = await hglib.viewer(el, viewconf, options);
35+
let unlisten = addEventListenersTo(el);
1936

2037
model.on("msg:custom", (msg) => {
2138
msg = JSON.parse(msg);
@@ -38,6 +55,9 @@ async function render({ model, el }) {
3855
}, view.uid);
3956
});
4057
}
58+
return () => {
59+
unlisten();
60+
};
4161
}
4262

4363
export default { render };

0 commit comments

Comments
 (0)