Skip to content

Commit

Permalink
[skip ci] Example of using customElement + ShadowDOM for @jbrowse/rea…
Browse files Browse the repository at this point in the history
…ct-linear-genome-view (#3999)
  • Loading branch information
AcaDemIQ committed Oct 25, 2023
1 parent a516c2b commit e11d061
Show file tree
Hide file tree
Showing 7 changed files with 159 additions and 2 deletions.
Expand Up @@ -55,7 +55,7 @@ const Tooltip = observer(
model: BaseLinearDisplayModel
clientMouseCoord: Coord
}) => {
const { classes } = useStyles()
const { theme, classes } = useStyles()
const { featureUnderMouse } = model
const [width, setWidth] = useState(0)
const [popperElt, setPopperElt] = useState<HTMLDivElement | null>(null)
Expand Down Expand Up @@ -87,8 +87,9 @@ const Tooltip = observer(
? getConf(model, 'mouseover', { feature: featureUnderMouse })
: undefined

const popperTheme = theme?.components?.MuiPopper
return featureUnderMouse && contents ? (
<Portal>
<Portal container={popperTheme?.defaultProps?.container}>
<div
ref={setPopperElt}
className={classes.tooltip}
Expand Down
2 changes: 2 additions & 0 deletions products/jbrowse-react-linear-genome-view/package.json
Expand Up @@ -68,6 +68,8 @@
"@jbrowse/product-core": "^2.7.1",
"@mui/icons-material": "^5.0.0",
"@mui/material": "^5.10.17",
"buffer": "^6.0.3",
"@r2wc/react-to-web-component": "^2.0.3",
"mobx": "^6.6.0",
"mobx-react": "^9.0.0",
"mobx-state-tree": "^5.0.0",
Expand Down
Expand Up @@ -5,6 +5,7 @@ export {
NextstrainExample,
OneLinearGenomeView,
UsingLocObject,
ShadowDOMOneLinearGenomeView,
WithAggregateTextSearching,
WithCustomTheme,
WithExternalPlugin,
Expand Down
15 changes: 15 additions & 0 deletions products/jbrowse-react-linear-genome-view/stories/ShadowDOM.mdx
@@ -0,0 +1,15 @@
import { Meta, Story } from '@storybook/blocks'
import {
ShadowDOMOneLinearGenomeView,
UsingLocObject,
DisableAddTrack,
WithShowTrack,
} from './JBrowseLinearGenomeView.stories'

<Meta title="ShadowDOM" />

# Using ShadowDOM!

This is an example of using the @jbrowse/react-linear-genome-view component

<Story of={ShadowDOMOneLinearGenomeView} />
@@ -0,0 +1,125 @@
/* eslint-disable no-console */
import React, { Fragment, useRef, useState, useEffect } from 'react'
import { Buffer } from 'buffer'
import { createPortal } from 'react-dom';
import { CacheProvider } from '@emotion/react';
import createCache from '@emotion/cache';
// in your code:
// import {createViewState, JBrowseLinearGenomeView} from '@jbrowse/react-linear-genome-view'
import { createViewState, JBrowseLinearGenomeView } from '../../src'
import { getVolvoxConfig } from './util'
import r2wc from '@r2wc/react-to-web-component'


const ShadowComponent = () => {
const node = useRef(null);
const nodeForPin = useRef(null);
const [rootNode, setRootNode] = useState(null);
const [cacheNode, setCacheNode] = useState(null);
const [config, setConfig] = useState(null);
useEffect(() => {
if (node.current) {
const { assembly, tracks } = getVolvoxConfig()
const root = node.current.attachShadow({ mode: 'open' });
setRootNode(root);
setCacheNode(
createCache({
key: 'react-shadow',
prepend: true, container: root
})
);
setConfig(createViewState({
assembly: assembly,
tracks: tracks,
location: 'ctgA:1105..1221',
onChange: patch => {
console.log('patch', patch)
},

configuration: {
theme: {
palette: {
primary: {
main: "#4400a6"
}
},
components: {
MuiPopover: {
defaultProps: {
container: () => {
return nodeForPin.current
},
}

},
MuiPopper: {
defaultProps: {
container: () => {
return nodeForPin.current
}
},
},
MuiTooltip: {
defaultProps: {
popperprops: {
container: () => nodeForPin.current
}

}
},
MuiModal: {
defaultProps: {
container: () => {
return nodeForPin.current
},
},
},
MuiMenu: {
defaultProps: {
container: () => {
return nodeForPin.current
},
},
},
MuiPaper: {
defaultProps: {
component: nodeForPin.current
},
},
},
}
}
}))
}
}, []);
return (
<Fragment>
<div ref={node}>
{rootNode &&
createPortal(
<CacheProvider value={cacheNode}>
<JBrowseLinearGenomeView viewState={config} ></JBrowseLinearGenomeView>
<div ref={nodeForPin}/>
</CacheProvider>,
rootNode
)}
</div>
</Fragment>
);

};

const JBrowseCustom = () => {
return React.createElement(ShadowComponent, null, null);
}

export const ShadowDOMOneLinearGenomeView = () => {
window.Buffer = Buffer;
if (customElements.get('jbrowse-linear-view') === undefined)
customElements.define('jbrowse-linear-view', r2wc(JBrowseCustom))
return (
<Fragment>
<jbrowse-linear-view></jbrowse-linear-view>
</Fragment>
)
}
Expand Up @@ -18,3 +18,4 @@ export * from './WithShowTrack'
export * from './WithWebWorker'
export * from './WithTwoLinearGenomeViews'
export * from './WithErrorHandler'
export * from './ShadowDOMOneLinearGenomeView'
12 changes: 12 additions & 0 deletions yarn.lock
Expand Up @@ -2929,6 +2929,18 @@
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==

"@r2wc/core@^1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@r2wc/core/-/core-1.0.1.tgz#5f1c55b3f0ef63787034382a27204959818c8011"
integrity sha512-3Q/IEvGoJ8E+wy8Y6vo+Hot35z89Ei0Ghr7WAhprxz1LhuCAaA2BIYXY8GjaCvJLGhiOLuiPMWb8DKfbrUzEMg==

"@r2wc/react-to-web-component@^2.0.3":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@r2wc/react-to-web-component/-/react-to-web-component-2.0.3.tgz#3253067dbedf3f9d80cdaac3081c508729e5af57"
integrity sha512-nlDJ0LHiWLG/EFB5tBtA+9KLF2oMBeDSAXL08NUzAuj/ac+V0NkMl/RvCFdDFnyrPQqpzpD9uOvOY2E5IFpdCQ==
dependencies:
"@r2wc/core" "^1.0.0"

"@radix-ui/number@1.0.1":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@radix-ui/number/-/number-1.0.1.tgz#644161a3557f46ed38a042acf4a770e826021674"
Expand Down

0 comments on commit e11d061

Please sign in to comment.