diff x/static/js/3474.8c1888be.chunk.js.map @ 125:49f3d3878413 draft

planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 5ea1f9c1eef1de76232e69aa6d34cda77d90d566
author fubar
date Sat, 05 Oct 2024 23:58:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/x/static/js/3474.8c1888be.chunk.js.map	Sat Oct 05 23:58:05 2024 +0000
@@ -0,0 +1,1 @@
+{"version":3,"file":"static/js/3474.8c1888be.chunk.js","mappings":"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","sources":["../../../plugins/dotplot-view/src/DotplotView/components/Axes.tsx","../../../plugins/dotplot-view/src/DotplotView/components/ImportForm/ImportCustomTrack.tsx","../../../plugins/dotplot-view/src/DotplotView/components/ImportForm/util.ts","../../../plugins/dotplot-view/src/DotplotView/components/ImportForm/ImportSyntenyTrackSelector.tsx","../../../plugins/dotplot-view/src/DotplotView/components/ImportForm/index.tsx","../../../plugins/dotplot-view/src/DotplotView/components/DotplotWarnings.tsx","../../../plugins/dotplot-view/src/DotplotView/components/PanButtons.tsx","../../../plugins/dotplot-view/src/DotplotView/components/CursorIcon.tsx","../../../plugins/dotplot-view/src/DotplotView/components/DotplotControls.tsx","../../../plugins/dotplot-view/src/DotplotView/components/Header.tsx","../../../plugins/dotplot-view/src/DotplotView/components/DotplotView.tsx","../../../plugins/dotplot-view/src/DotplotView/components/Grid.tsx"],"sourcesContent":["import React from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { getSnapshot } from 'mobx-state-tree'\nimport {\n  getFillProps,\n  getStrokeProps,\n  getTickDisplayStr,\n} from '@jbrowse/core/util'\nimport { bpToPx } from '@jbrowse/core/util/Base1DUtils'\nimport { useTheme } from '@mui/material'\n\n// locals\nimport { getBlockLabelKeysToHide } from './util'\nimport { DotplotViewModel } from '../model'\n\nconst useStyles = makeStyles()(() => ({\n  vtext: {\n    gridColumn: '1/2',\n    gridRow: '1/2',\n    pointerEvents: 'none',\n    userSelect: 'none',\n  },\n  htext: {\n    gridColumn: '2/2',\n    gridRow: '2/2',\n    pointerEvents: 'none',\n    userSelect: 'none',\n  },\n}))\nexport const HorizontalAxis = observer(function ({\n  model,\n}: {\n  model: DotplotViewModel\n}) {\n  const { viewWidth, borderY } = model\n  const { classes } = useStyles()\n  return (\n    <svg width={viewWidth} height={borderY} className={classes.htext}>\n      <HorizontalAxisRaw model={model} />\n    </svg>\n  )\n})\n\nexport const HorizontalAxisRaw = observer(function ({\n  model,\n}: {\n  model: DotplotViewModel\n}) {\n  const { viewWidth, borderX, borderY, hview, htextRotation, hticks } = model\n  const { offsetPx, width, dynamicBlocks, bpPerPx } = hview\n  const dblocks = dynamicBlocks.contentBlocks\n  const hide = getBlockLabelKeysToHide(dblocks, viewWidth, offsetPx)\n  const theme = useTheme()\n  const hviewSnap = {\n    ...getSnapshot(hview),\n    width,\n    staticBlocks: hview.staticBlocks,\n  }\n\n  const ticks = hticks\n    .map(\n      tick =>\n        [\n          tick,\n          bpToPx({\n            refName: tick.refName,\n            coord: tick.base,\n            self: hviewSnap,\n          })?.offsetPx,\n        ] as const,\n    )\n    .filter(f => f[1] !== undefined)\n    .map(f => [f[0], f[1]! - offsetPx] as const)\n\n  return (\n    <>\n      {dblocks\n        .filter(region => !hide.has(region.key))\n        .map(region => {\n          const x = region.offsetPx\n          const y = 0\n          const xoff = Math.floor(x - hview.offsetPx)\n\n          return (\n            <text\n              transform={`rotate(${htextRotation},${xoff},${y})`}\n              key={JSON.stringify(region)}\n              x={xoff}\n              y={y + 1}\n              fontSize={11}\n              dominantBaseline=\"hanging\"\n              textAnchor=\"end\"\n              {...getFillProps(theme.palette.text.primary)}\n            >\n              {region.refName}\n            </text>\n          )\n        })}\n      {ticks.map(([tick, x]) =>\n        x > 0 && x < width ? (\n          <line\n            key={`line-${JSON.stringify(tick)}`}\n            x1={x}\n            x2={x}\n            y1={0}\n            y2={tick.type === 'major' ? 6 : 4}\n            strokeWidth={1}\n            {...getFillProps(theme.palette.text.primary)}\n          />\n        ) : null,\n      )}\n      {ticks\n        .filter(t => t[0].type === 'major')\n        .map(([tick, x]) =>\n          x > 10 && x < width ? (\n            <text\n              x={x - 7}\n              y={0}\n              transform={`rotate(${htextRotation},${x},0)`}\n              key={`text-${JSON.stringify(tick)}`}\n              fontSize={11}\n              dominantBaseline=\"middle\"\n              textAnchor=\"end\"\n              {...getFillProps(theme.palette.text.primary)}\n            >\n              {getTickDisplayStr(tick.base + 1, bpPerPx)}\n            </text>\n          ) : null,\n        )}\n      <text\n        y={borderY - 12}\n        x={(viewWidth - borderX) / 2}\n        textAnchor=\"middle\"\n        fontSize={11}\n        dominantBaseline=\"hanging\"\n        {...getFillProps(theme.palette.text.primary)}\n      >\n        {hview.assemblyNames.join(',')}\n      </text>\n    </>\n  )\n})\nexport const VerticalAxis = observer(function ({\n  model,\n}: {\n  model: DotplotViewModel\n}) {\n  const { borderX, viewHeight } = model\n  const { classes } = useStyles()\n  return (\n    <svg className={classes.vtext} width={borderX} height={viewHeight}>\n      <VerticalAxisRaw model={model} />\n    </svg>\n  )\n})\n\nexport const VerticalAxisRaw = observer(function ({\n  model,\n}: {\n  model: DotplotViewModel\n}) {\n  const { viewHeight, borderX, borderY, vview, vtextRotation, vticks } = model\n  const { offsetPx, width, dynamicBlocks, bpPerPx } = vview\n  const dblocks = dynamicBlocks.contentBlocks\n  const hide = getBlockLabelKeysToHide(dblocks, viewHeight, offsetPx)\n  const theme = useTheme()\n  const vviewSnap = {\n    ...getSnapshot(vview),\n    width,\n    staticBlocks: vview.staticBlocks,\n  }\n  const ticks = vticks\n    .map(\n      tick =>\n        [\n          tick,\n          bpToPx({\n            refName: tick.refName,\n            coord: tick.base,\n            self: vviewSnap,\n          })?.offsetPx,\n        ] as const,\n    )\n    .filter(f => f[1] !== undefined)\n    .map(f => [f[0], f[1]! - offsetPx] as const)\n\n  return (\n    <>\n      {dblocks\n        .filter(region => !hide.has(region.key))\n        .map(region => {\n          const y = region.offsetPx\n          const x = borderX\n          const yoff = Math.floor(viewHeight - y + offsetPx)\n\n          return (\n            <text\n              transform={`rotate(${vtextRotation},${x},${y})`}\n              key={JSON.stringify(region)}\n              x={x}\n              y={yoff}\n              fontSize={11}\n              textAnchor=\"end\"\n              {...getFillProps(theme.palette.text.primary)}\n            >\n              {region.refName}\n            </text>\n          )\n        })}\n      {ticks.map(([tick, y]) =>\n        y > 0 ? (\n          <line\n            key={`line-${JSON.stringify(tick)}`}\n            y1={viewHeight - y}\n            y2={viewHeight - y}\n            x1={borderX}\n            x2={borderX - (tick.type === 'major' ? 6 : 4)}\n            strokeWidth={1}\n            {...getStrokeProps(theme.palette.grey[400])}\n          />\n        ) : null,\n      )}\n      {ticks\n        .filter(t => t[0].type === 'major')\n        .map(([tick, y]) =>\n          y > 10 && y < viewHeight ? (\n            <text\n              y={viewHeight - y - 3}\n              x={borderX - 7}\n              key={`text-${JSON.stringify(tick)}`}\n              textAnchor=\"end\"\n              dominantBaseline=\"hanging\"\n              fontSize={11}\n              {...getFillProps(theme.palette.text.primary)}\n            >\n              {getTickDisplayStr(tick.base + 1, bpPerPx)}\n            </text>\n          ) : null,\n        )}\n      <text\n        y={(viewHeight - borderY) / 2}\n        x={12}\n        transform={`rotate(-90,12,${(viewHeight - borderY) / 2})`}\n        textAnchor=\"middle\"\n        fontSize={11}\n        {...getFillProps(theme.palette.text.primary)}\n      >\n        {vview.assemblyNames.join(',')}\n      </text>\n    </>\n  )\n})\n","import React, { useState, useEffect } from 'react'\nimport { SnapshotIn } from 'mobx-state-tree'\nimport {\n  FormControlLabel,\n  Grid,\n  Paper,\n  Radio,\n  RadioGroup,\n  Typography,\n} from '@mui/material'\nimport { ErrorMessage, FileSelector } from '@jbrowse/core/ui'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport { observer } from 'mobx-react'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { basename, extName, getName, stripGz } from './util'\n\nfunction getAdapter({\n  radioOption,\n  assembly1,\n  assembly2,\n  fileLocation,\n  indexFileLocation,\n  bed1Location,\n  bed2Location,\n}: {\n  radioOption: string\n  assembly1: string\n  assembly2: string\n  fileLocation?: FileLocation\n  indexFileLocation?: FileLocation\n  bed1Location?: FileLocation\n  bed2Location?: FileLocation\n}) {\n  if (radioOption === '.paf') {\n    return {\n      type: 'PAFAdapter',\n      pafLocation: fileLocation,\n      queryAssembly: assembly1,\n      targetAssembly: assembly2,\n    }\n  } else if (radioOption === '.out') {\n    return {\n      type: 'MashMapAdapter',\n      outLocation: fileLocation,\n      queryAssembly: assembly1,\n      targetAssembly: assembly2,\n    }\n  } else if (radioOption === '.delta') {\n    return {\n      type: 'DeltaAdapter',\n      deltaLocation: fileLocation,\n      queryAssembly: assembly1,\n      targetAssembly: assembly2,\n    }\n  } else if (radioOption === '.chain') {\n    return {\n      type: 'ChainAdapter',\n      chainLocation: fileLocation,\n      queryAssembly: assembly1,\n      targetAssembly: assembly2,\n    }\n  } else if (radioOption === '.anchors') {\n    return {\n      type: 'MCScanAnchorsAdapter',\n      mcscanAnchorsLocation: fileLocation,\n      bed1Location,\n      bed2Location,\n      assemblyNames: [assembly1, assembly2],\n    }\n  } else if (radioOption === '.anchors.simple') {\n    return {\n      type: 'MCScanSimpleAnchorsAdapter',\n      mcscanSimpleAnchorsLocation: fileLocation,\n      bed1Location,\n      bed2Location,\n      assemblyNames: [assembly1, assembly2],\n    }\n  } else if (radioOption === '.pif.gz') {\n    return {\n      type: 'PairwiseIndexedPAFAdapter',\n      pifGzLocation: fileLocation,\n      index: { location: indexFileLocation },\n      assemblyNames: [assembly1, assembly2],\n    }\n  } else {\n    throw new Error(\n      `Unknown to detect type ${radioOption} from filename (select radio button to clarify)`,\n    )\n  }\n}\n\ntype Conf = SnapshotIn<AnyConfigurationModel>\n\nconst ImportCustomTrack = observer(function ({\n  assembly1,\n  assembly2,\n  setSessionTrackData,\n}: {\n  sessionTrackData: Conf\n  assembly1: string\n  assembly2: string\n  setSessionTrackData: (arg: Conf) => void\n}) {\n  const [bed2Location, setBed2Location] = useState<FileLocation>()\n  const [bed1Location, setBed1Location] = useState<FileLocation>()\n  const [fileLocation, setFileLocation] = useState<FileLocation>()\n  const [indexFileLocation, setIndexFileLocation] = useState<FileLocation>()\n  const [value, setValue] = useState('')\n  const [error, setError] = useState<unknown>()\n  const fileName = getName(fileLocation)\n\n  const radioOption = value || (fileName ? extName(stripGz(fileName)) : '')\n\n  useEffect(() => {\n    try {\n      if (fileLocation) {\n        const fn = fileName ? basename(fileName) : 'MyTrack'\n        const trackId = `${fn}-${Date.now()}`\n        setError(undefined)\n\n        setSessionTrackData({\n          trackId,\n          name: fn,\n          assemblyNames: [assembly2, assembly1],\n          type: 'SyntenyTrack',\n          adapter: getAdapter({\n            radioOption,\n            assembly1,\n            assembly2,\n            fileLocation,\n            indexFileLocation,\n            bed1Location,\n            bed2Location,\n          }),\n        })\n      }\n    } catch (e) {\n      console.error(e)\n      setError(e)\n    }\n  }, [\n    fileName,\n    assembly1,\n    assembly2,\n    bed1Location,\n    bed2Location,\n    fileLocation,\n    indexFileLocation,\n    radioOption,\n    setSessionTrackData,\n  ])\n  return (\n    <Paper style={{ padding: 12 }}>\n      {error ? <ErrorMessage error={error} /> : null}\n      <Typography style={{ textAlign: 'center' }}>\n        Add a .paf, .out (MashMap), .delta (Mummer), .chain, .anchors or\n        .anchors.simple (MCScan) file to view. These file types can also be\n        gzipped. The first assembly should be the query sequence (e.g. left\n        column of the PAF) and the second assembly should be the target sequence\n        (e.g. right column of the PAF)\n      </Typography>\n      <RadioGroup\n        value={radioOption}\n        onChange={event => {\n          setValue(event.target.value)\n        }}\n      >\n        <Grid container justifyContent=\"center\">\n          <Grid item>\n            <FormControlLabel value=\".paf\" control={<Radio />} label=\".paf\" />\n          </Grid>\n          <Grid item>\n            <FormControlLabel value=\".out\" control={<Radio />} label=\".out\" />\n          </Grid>\n\n          <Grid item>\n            <FormControlLabel\n              value=\".delta\"\n              control={<Radio />}\n              label=\".delta\"\n            />\n          </Grid>\n          <Grid item>\n            <FormControlLabel\n              value=\".chain\"\n              control={<Radio />}\n              label=\".chain\"\n            />\n          </Grid>\n          <Grid item>\n            <FormControlLabel\n              value=\".anchors\"\n              control={<Radio />}\n              label=\".anchors\"\n            />\n          </Grid>\n          <Grid item>\n            <FormControlLabel\n              value=\".anchors.simple\"\n              control={<Radio />}\n              label=\".anchors.simple\"\n            />\n          </Grid>\n          <Grid item>\n            <FormControlLabel\n              value=\".pif.gz\"\n              control={<Radio />}\n              label=\".pif.gz\"\n            />\n          </Grid>\n        </Grid>\n      </RadioGroup>\n      <Grid container justifyContent=\"center\">\n        <Grid item>\n          {value === '.anchors' || value === '.anchors.simple' ? (\n            <div>\n              <div style={{ margin: 20 }}>\n                Open the {value} and .bed files for both genome assemblies from\n                the MCScan (Python version) pipeline{' '}\n                <a href=\"https://github.com/tanghaibao/jcvi/wiki/MCscan-(Python-version)\">\n                  (more info)\n                </a>\n              </div>\n              <div style={{ display: 'flex' }}>\n                <div>\n                  <FileSelector\n                    name=\".anchors file\"\n                    description=\"\"\n                    location={fileLocation}\n                    setLocation={loc => {\n                      setFileLocation(loc)\n                    }}\n                  />\n                </div>\n                <div>\n                  <FileSelector\n                    name=\"genome 1 .bed (left column of anchors file)\"\n                    description=\"\"\n                    location={bed1Location}\n                    setLocation={loc => {\n                      setBed1Location(loc)\n                    }}\n                  />\n                </div>\n                <div>\n                  <FileSelector\n                    name=\"genome 2 .bed (right column of anchors file)\"\n                    description=\"\"\n                    location={bed2Location}\n                    setLocation={loc => {\n                      setBed2Location(loc)\n                    }}\n                  />\n                </div>\n              </div>\n            </div>\n          ) : value === '.pif.gz' ? (\n            <div style={{ display: 'flex' }}>\n              <div>\n                <FileSelector\n                  name={`${value} location`}\n                  description=\"\"\n                  location={fileLocation}\n                  setLocation={loc => {\n                    setFileLocation(loc)\n                  }}\n                />\n              </div>\n              <div>\n                <FileSelector\n                  name={`${value} index location`}\n                  description=\"\"\n                  location={indexFileLocation}\n                  setLocation={loc => {\n                    setIndexFileLocation(loc)\n                  }}\n                />\n              </div>\n            </div>\n          ) : (\n            <FileSelector\n              name={value ? `${value} location` : ''}\n              description=\"\"\n              location={fileLocation}\n              setLocation={loc => {\n                setFileLocation(loc)\n              }}\n            />\n          )}\n        </Grid>\n      </Grid>\n    </Paper>\n  )\n})\n\nexport default ImportCustomTrack\n","export function getName(\n  sessionTrackData?: { uri: string } | { localPath: string } | { name: string },\n) {\n  return sessionTrackData\n    ? // @ts-expect-error\n      sessionTrackData.uri ||\n        // @ts-expect-error\n        sessionTrackData.localPath ||\n        // @ts-expect-error\n        sessionTrackData.name\n    : undefined\n}\n\nexport function stripGz(fileName: string) {\n  return fileName.endsWith('.gz') ? fileName.slice(0, -3) : fileName\n}\n\nexport function basename(str: string) {\n  return str.split('#')[0]!.split('?')[0]!.split('/').pop()\n}\nexport function extName(str: string) {\n  const r = str.split('.').pop()\n  return r ? `.${r}` : ''\n}\n","import React, { useState, useEffect } from 'react'\nimport { Select, MenuItem, Paper, Typography } from '@mui/material'\nimport { getTrackName } from '@jbrowse/core/util/tracks'\nimport { getSession } from '@jbrowse/core/util'\nimport { ErrorMessage } from '@jbrowse/core/ui'\nimport {\n  AnyConfigurationModel,\n  readConfObject,\n} from '@jbrowse/core/configuration'\nimport { observer } from 'mobx-react'\n\n// icons\nimport { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons'\n\n// locals\nimport { DotplotViewModel } from '../../model'\n\nfunction f(track: AnyConfigurationModel, assembly1: string, assembly2: string) {\n  const assemblyNames = readConfObject(track, 'assemblyNames')\n  return (\n    assemblyNames.includes(assembly1) &&\n    assemblyNames.includes(assembly2) &&\n    track.type.includes('Synteny')\n  )\n}\n\nconst Selector = observer(\n  ({\n    model,\n    assembly1,\n    assembly2,\n    setShowTrackId,\n  }: {\n    model: DotplotViewModel\n    assembly1: string\n    assembly2: string\n    setShowTrackId: (arg: string) => void\n  }) => {\n    const session = getSession(model)\n    const { tracks, sessionTracks } = session\n    const allTracks = [\n      ...tracks,\n      ...(sessionTracks || []),\n    ] as AnyConfigurationModel[]\n    const filteredTracks = allTracks.filter(t => f(t, assembly2, assembly1))\n    const resetTrack = filteredTracks[0]?.trackId || ''\n    const [value, setValue] = useState(resetTrack)\n    useEffect(() => {\n      // if assembly1/assembly2 changes, then we will want to use this effect to change\n      // the state of the useState because it otherwise gets locked to a stale value\n      setValue(resetTrack)\n    }, [resetTrack])\n\n    useEffect(() => {\n      // sets track data in a useEffect because the initial load is needed as well as\n      // onChange's to the select box\n      setShowTrackId(value)\n    }, [value, setShowTrackId])\n\n    return (\n      <Paper style={{ padding: 12 }}>\n        <Typography paragraph>\n          Select a track from the select box below, the track will be shown when\n          you hit \"Launch\".\n        </Typography>\n\n        <Typography paragraph>\n          Note: there is a track selector <i>inside</i> the DotplotView, which\n          can turn on one or more SyntenyTracks (more than one can be displayed\n          at once). Look for the track selector icon <TrackSelectorIcon />\n        </Typography>\n        {filteredTracks.length ? (\n          <Select\n            value={value}\n            onChange={event => {\n              setValue(event.target.value)\n            }}\n          >\n            {filteredTracks.map(track => (\n              <MenuItem key={track.trackId} value={track.trackId}>\n                {getTrackName(track, session)}\n              </MenuItem>\n            ))}\n          </Select>\n        ) : (\n          <ErrorMessage\n            error={`No synteny tracks found for ${assembly1},${assembly2}`}\n          />\n        )}\n      </Paper>\n    )\n  },\n)\n\nexport default Selector\n","import React, { useState, useEffect } from 'react'\nimport {\n  Button,\n  Container,\n  FormControl,\n  FormLabel,\n  FormControlLabel,\n  Grid,\n  Paper,\n  Radio,\n  RadioGroup,\n  Typography,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { transaction } from 'mobx'\nimport { SnapshotIn } from 'mobx-state-tree'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { getSession, isSessionWithAddTracks } from '@jbrowse/core/util'\nimport { ErrorMessage, AssemblySelector } from '@jbrowse/core/ui'\n\n// locals\nimport { DotplotViewModel } from '../../model'\nimport ImportCustomTrack from './ImportCustomTrack'\nimport ImportSyntenyTrackSelector from './ImportSyntenyTrackSelector'\n\nconst useStyles = makeStyles()(theme => ({\n  importFormContainer: {\n    padding: theme.spacing(4),\n    margin: '0 auto',\n  },\n  assemblySelector: {\n    width: '75%',\n    margin: '0 auto',\n  },\n}))\n\ntype Conf = SnapshotIn<AnyConfigurationModel>\n\nfunction TrackSelector({\n  setSessionTrackData,\n  setShowTrackId,\n  sessionTrackData,\n  assembly1,\n  assembly2,\n  model,\n}: {\n  sessionTrackData: Conf\n  setSessionTrackData: (arg: Conf) => void\n  setShowTrackId: (arg?: string) => void\n  model: DotplotViewModel\n  assembly1: string\n  assembly2: string\n}) {\n  const [choice, setChoice] = useState('tracklist')\n\n  useEffect(() => {\n    if (choice === 'none') {\n      setSessionTrackData(undefined)\n      setShowTrackId(undefined)\n    }\n  }, [choice, setSessionTrackData, setShowTrackId])\n  return (\n    <>\n      <FormControl>\n        <FormLabel id=\"group-label\">\n          (Optional) Select or add a synteny track\n        </FormLabel>\n        <RadioGroup\n          row\n          value={choice}\n          onChange={event => {\n            setChoice(event.target.value)\n          }}\n          aria-labelledby=\"group-label\"\n        >\n          <FormControlLabel value=\"none\" control={<Radio />} label=\"None\" />\n          <FormControlLabel\n            value=\"tracklist\"\n            control={<Radio />}\n            label=\"Existing track\"\n          />\n          <FormControlLabel\n            value=\"custom\"\n            control={<Radio />}\n            label=\"New track\"\n          />\n        </RadioGroup>\n      </FormControl>\n      {choice === 'custom' ? (\n        <ImportCustomTrack\n          setSessionTrackData={setSessionTrackData}\n          sessionTrackData={sessionTrackData}\n          assembly2={assembly2}\n          assembly1={assembly1}\n        />\n      ) : null}\n      {choice === 'tracklist' ? (\n        <ImportSyntenyTrackSelector\n          model={model}\n          assembly1={assembly1}\n          assembly2={assembly2}\n          setShowTrackId={setShowTrackId}\n        />\n      ) : null}\n    </>\n  )\n}\n\nconst DotplotImportForm = observer(({ model }: { model: DotplotViewModel }) => {\n  const { classes } = useStyles()\n  const session = getSession(model)\n  const { assemblyNames } = session\n  const [assembly2, setAssembly2] = useState(assemblyNames[0] || '')\n  const [assembly1, setAssembly1] = useState(assemblyNames[0] || '')\n  const [error, setError] = useState<unknown>()\n  const [sessionTrackData, setSessionTrackData] = useState<Conf>()\n  const [showTrackId, setShowTrackId] = useState<string>()\n\n  function onOpenClick() {\n    try {\n      if (!isSessionWithAddTracks(session)) {\n        return\n      }\n      setError(undefined)\n      model.setError(undefined)\n      transaction(() => {\n        if (sessionTrackData) {\n          session.addTrackConf(sessionTrackData)\n          model.toggleTrack(sessionTrackData.trackId)\n        } else if (showTrackId) {\n          model.showTrack(showTrackId)\n        }\n\n        model.setViews([\n          { bpPerPx: 0.1, offsetPx: 0 },\n          { bpPerPx: 0.1, offsetPx: 0 },\n        ])\n        model.setAssemblyNames(assembly2, assembly1)\n      })\n    } catch (e) {\n      console.error(e)\n      setError(e)\n    }\n  }\n\n  // this is a combination of any displayed error message we have\n  const displayError = error || model.error\n  return (\n    <Container className={classes.importFormContainer}>\n      {displayError ? <ErrorMessage error={displayError} /> : null}\n      <Grid\n        container\n        spacing={1}\n        justifyContent=\"center\"\n        alignItems=\"center\"\n        className={classes.assemblySelector}\n      >\n        <Grid item>\n          <Paper style={{ padding: 12 }}>\n            <Typography style={{ textAlign: 'center' }}>\n              Select assemblies for dotplot view\n            </Typography>\n            <Grid\n              container\n              spacing={1}\n              justifyContent=\"center\"\n              alignItems=\"center\"\n            >\n              <Grid item>\n                <AssemblySelector\n                  selected={assembly1}\n                  onChange={val => {\n                    setAssembly1(val)\n                  }}\n                  session={session}\n                />\n              </Grid>\n              <Grid item>\n                <AssemblySelector\n                  selected={assembly2}\n                  onChange={val => {\n                    setAssembly2(val)\n                  }}\n                  session={session}\n                />\n              </Grid>\n              <Grid item>\n                <FormControl>\n                  <Button\n                    onClick={onOpenClick}\n                    variant=\"contained\"\n                    color=\"primary\"\n                  >\n                    Launch\n                  </Button>\n                </FormControl>\n              </Grid>\n            </Grid>\n          </Paper>\n          <TrackSelector\n            setShowTrackId={setShowTrackId}\n            assembly2={assembly2}\n            assembly1={assembly1}\n            setSessionTrackData={setSessionTrackData}\n            sessionTrackData={sessionTrackData}\n            model={model}\n          />\n        </Grid>\n      </Grid>\n    </Container>\n  )\n})\n\nexport default DotplotImportForm\n","import React, { lazy, useState } from 'react'\nimport { Alert, Button } from '@mui/material'\nimport { observer } from 'mobx-react'\n\n// locals\nimport { DotplotViewModel } from '../model'\n// lazy components\nconst WarningDialog = lazy(() => import('./WarningDialog'))\n\nconst DotplotWarnings = observer(function ({\n  model,\n}: {\n  model: DotplotViewModel\n}) {\n  const trackWarnings = model.tracks.filter(t => t.displays[0].warnings?.length)\n  const [shown, setShown] = useState(false)\n  const [hide, setHide] = useState(false)\n  return trackWarnings.length && !hide ? (\n    <Alert severity=\"warning\">\n      Warnings during render{' '}\n      <Button\n        onClick={() => {\n          setShown(true)\n        }}\n      >\n        More info\n      </Button>\n      {shown ? (\n        <WarningDialog\n          trackWarnings={trackWarnings}\n          handleClose={() => {\n            setShown(false)\n          }}\n        />\n      ) : null}\n      <Button\n        variant=\"contained\"\n        onClick={() => {\n          setHide(true)\n        }}\n      >\n        Dismiss\n      </Button>\n    </Alert>\n  ) : null\n})\n\nexport default DotplotWarnings\n","import React from 'react'\nimport { IconButton, Paper } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\n// icons\nimport ArrowDropDown from '@mui/icons-material/ArrowDropDown'\nimport ArrowDropUp from '@mui/icons-material/ArrowDropUp'\nimport ArrowLeft from '@mui/icons-material/ArrowLeft'\nimport ArrowRight from '@mui/icons-material/ArrowRight'\nimport ZoomIn from '@mui/icons-material/ZoomIn'\nimport ZoomOut from '@mui/icons-material/ZoomOut'\n\n// locals\nimport { DotplotViewModel } from '../model'\n\nconst useStyles = makeStyles()({\n  dpad: {\n    display: 'grid',\n    gridTemplateColumns: 'repeat(3, 1fr)',\n    margin: 0,\n    position: 'absolute',\n    right: 50,\n    zIndex: 1000,\n    top: 50,\n  },\n  icon: {\n    padding: 0,\n    margin: 0,\n  },\n})\n\nconst PanButtons = observer(function PanButtons({\n  model,\n}: {\n  model: DotplotViewModel\n}) {\n  const { classes } = useStyles()\n  return (\n    <Paper className={classes.dpad} elevation={6}>\n      <div />\n      <IconButton\n        className={classes.icon}\n        onClick={() => model.vview.scroll(100)}\n      >\n        <ArrowDropUp />\n      </IconButton>\n      <div />\n\n      <IconButton\n        className={classes.icon}\n        onClick={() => model.hview.scroll(-100)}\n      >\n        <ArrowLeft />\n      </IconButton>\n      <div />\n      <IconButton\n        className={classes.icon}\n        onClick={() => model.hview.scroll(100)}\n      >\n        <ArrowRight />\n      </IconButton>\n\n      <div />\n      <IconButton\n        className={classes.icon}\n        onClick={() => model.vview.scroll(-100)}\n      >\n        <ArrowDropDown />\n      </IconButton>\n      <div />\n      <IconButton\n        className={classes.icon}\n        onClick={() => {\n          model.hview.zoomIn()\n          model.vview.zoomIn()\n        }}\n      >\n        <ZoomIn />\n      </IconButton>\n      <div />\n      <IconButton\n        className={classes.icon}\n        onClick={() => {\n          model.hview.zoomOut()\n          model.vview.zoomOut()\n        }}\n      >\n        <ZoomOut />\n      </IconButton>\n    </Paper>\n  )\n})\n\nexport default PanButtons\n","import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon'\nimport React from 'react'\n\nexport function CursorMove(props: SvgIconProps) {\n  return (\n    <SvgIcon {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M13,6V11H18V7.75L22.25,12L18,16.25V13H13V18H16.25L12,22.25L7.75,18H11V13H6V16.25L1.75,12L6,7.75V11H11V6H7.75L12,1.75L16.25,6H13Z\"\n      />\n    </SvgIcon>\n  )\n}\n\nexport function CursorMouse(props: SvgIconProps) {\n  return (\n    <SvgIcon {...props}>\n      <path\n        fill=\"currentColor\"\n        d=\"M10.07,14.27C10.57,14.03 11.16,14.25 11.4,14.75L13.7,19.74L15.5,18.89L13.19,13.91C12.95,13.41 13.17,12.81 13.67,12.58L13.95,12.5L16.25,12.05L8,5.12V15.9L9.82,14.43L10.07,14.27M13.64,21.97C13.14,22.21 12.54,22 12.31,21.5L10.13,16.76L7.62,18.78C7.45,18.92 7.24,19 7,19A1,1 0 0,1 6,18V3A1,1 0 0,1 7,2C7.24,2 7.47,2.09 7.64,2.23L7.65,2.22L19.14,11.86C19.57,12.22 19.62,12.85 19.27,13.27C19.12,13.45 18.91,13.57 18.7,13.61L15.54,14.23L17.74,18.96C18,19.46 17.76,20.05 17.26,20.28L13.64,21.97Z\"\n      />\n    </SvgIcon>\n  )\n}\n","import React from 'react'\nimport { IconButton } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'\n\n// icons\nimport ZoomOut from '@mui/icons-material/ZoomOut'\nimport ZoomIn from '@mui/icons-material/ZoomIn'\nimport MoreVert from '@mui/icons-material/MoreVert'\nimport { CursorMouse, CursorMove } from './CursorIcon'\nimport { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons'\n\n// locals\nimport { DotplotViewModel } from '../model'\n\nconst DotplotControls = observer(function ({\n  model,\n}: {\n  model: DotplotViewModel\n}) {\n  return (\n    <div>\n      <IconButton onClick={model.zoomOutButton}>\n        <ZoomOut />\n      </IconButton>\n\n      <IconButton onClick={model.zoomInButton}>\n        <ZoomIn />\n      </IconButton>\n\n      <IconButton\n        onClick={() => model.activateTrackSelector()}\n        title=\"Open track selector\"\n      >\n        <TrackSelectorIcon />\n      </IconButton>\n\n      <CascadingMenuButton\n        menuItems={[\n          {\n            onClick: () => {\n              model.squareView()\n            },\n            label: 'Square view - same base pairs per pixel',\n          },\n          {\n            onClick: () => {\n              model.squareViewProportional()\n            },\n            label: 'Rectanglularize view - same total bp',\n          },\n          {\n            onClick: () => {\n              model.showAllRegions()\n            },\n            label: 'Show all regions',\n          },\n          {\n            onClick: () => {\n              model.setDrawCigar(!model.drawCigar)\n            },\n            type: 'checkbox',\n            label: 'Draw CIGAR',\n            checked: model.drawCigar,\n          },\n          {\n            onClick: () => {\n              model.setShowPanButtons(!model.showPanButtons)\n            },\n            label: 'Show pan buttons',\n            type: 'checkbox',\n            checked: model.showPanButtons,\n          },\n          {\n            label: 'Click and drag mode',\n            subMenu: [\n              {\n                onClick: () => {\n                  model.setCursorMode('move')\n                },\n                label:\n                  'Pan by default, select region when ctrl/cmd key is held',\n                icon: CursorMove,\n                type: 'radio',\n                checked: model.cursorMode === 'move',\n              },\n              {\n                onClick: () => {\n                  model.setCursorMode('crosshair')\n                },\n                label:\n                  'Select region by default, pan when ctrl/cmd key is held',\n                icon: CursorMouse,\n                type: 'radio',\n                checked: model.cursorMode === 'crosshair',\n              },\n            ],\n          },\n          {\n            label: 'Wheel scroll mode',\n            subMenu: [\n              {\n                onClick: () => {\n                  model.setWheelMode('pan')\n                },\n                label: 'Pans view',\n                type: 'radio',\n                checked: model.wheelMode === 'pan',\n              },\n              {\n                onClick: () => {\n                  model.setWheelMode('zoom')\n                },\n                label: 'Zooms view',\n                type: 'radio',\n                checked: model.wheelMode === 'zoom',\n              },\n              {\n                onClick: () => {\n                  model.setWheelMode('none')\n                },\n                label: 'Disable',\n                type: 'radio',\n                checked: model.wheelMode === 'none',\n              },\n            ],\n          },\n        ]}\n      >\n        <MoreVert />\n      </CascadingMenuButton>\n    </div>\n  )\n})\n\nexport default DotplotControls\n","import React from 'react'\nimport { Typography } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { getBpDisplayStr } from '@jbrowse/core/util'\n\n// locals\nimport { DotplotViewModel } from '../model'\nimport DotplotWarnings from './DotplotWarnings'\nimport PanButtons from './PanButtons'\nimport DotplotControls from './DotplotControls'\n\nconst useStyles = makeStyles()({\n  bp: {\n    display: 'flex',\n    alignItems: 'center',\n    marginLeft: 10,\n  },\n  spacer: {\n    flexGrow: 1,\n  },\n  headerBar: {\n    display: 'flex',\n    position: 'relative',\n  },\n})\n\nconst DotplotHeader = observer(function ({\n  model,\n  selection,\n}: {\n  model: DotplotViewModel\n  selection?: { width: number; height: number }\n}) {\n  const { classes } = useStyles()\n  const { hview, vview, showPanButtons } = model\n  return (\n    <div className={classes.headerBar}>\n      <DotplotControls model={model} />\n      <Typography className={classes.bp} variant=\"body2\" color=\"textSecondary\">\n        x: {hview.assemblyNames.join(',')} {getBpDisplayStr(hview.currBp)}\n        <br />\n        y: {vview.assemblyNames.join(',')} {getBpDisplayStr(vview.currBp)}\n      </Typography>\n      {selection ? (\n        <Typography\n          className={classes.bp}\n          variant=\"body2\"\n          color=\"textSecondary\"\n        >\n          {`width:${getBpDisplayStr(hview.bpPerPx * selection.width)}`} <br />\n          {`height:${getBpDisplayStr(vview.bpPerPx * selection.height)}`}\n        </Typography>\n      ) : null}\n      <div className={classes.spacer} />\n      <DotplotWarnings model={model} />\n      {showPanButtons ? <PanButtons model={model} /> : null}\n    </div>\n  )\n})\n\nexport default DotplotHeader\n","import React, { useState, useEffect, useRef, lazy, Suspense } from 'react'\nimport { LoadingEllipses, Menu, ResizeHandle } from '@jbrowse/core/ui'\nimport { observer } from 'mobx-react'\nimport { transaction } from 'mobx'\nimport { makeStyles } from 'tss-react/mui'\n\n// locals\nimport { DotplotViewModel } from '../model'\nimport ImportForm from './ImportForm'\nimport Header from './Header'\nimport Grid from './Grid'\nimport { VerticalAxis, HorizontalAxis } from './Axes'\n\nconst TooltipWhereClicked = lazy(() => import('./DotplotTooltipClick'))\nconst TooltipWhereMouseovered = lazy(() => import('./DotplotTooltipMouseover'))\n\nconst blank = { left: 0, top: 0, width: 0, height: 0 }\n\nconst useStyles = makeStyles()(theme => ({\n  spacer: {\n    gridColumn: '1/2',\n    gridRow: '2/2',\n  },\n  root: {\n    position: 'relative',\n    marginBottom: theme.spacing(1),\n    overflow: 'hidden',\n  },\n\n  container: {\n    display: 'grid',\n    padding: 5,\n    position: 'relative',\n  },\n  overlay: {\n    pointerEvents: 'none',\n    overflow: 'hidden',\n    display: 'flex',\n    width: '100%',\n    gridRow: '1/2',\n    gridColumn: '2/2',\n    zIndex: 100, // needs to be below controls\n    '& path': {\n      cursor: 'crosshair',\n      fill: 'none',\n    },\n  },\n\n  content: {\n    position: 'relative',\n    gridColumn: '2/2',\n    gridRow: '1/2',\n  },\n\n  resizeHandle: {\n    height: 4,\n    background: '#ccc',\n    boxSizing: 'border-box',\n    borderTop: '1px solid #fafafa',\n  },\n}))\n\ntype Coord = [number, number] | undefined\ninterface Rect {\n  left: number\n  top: number\n}\n\n// produces offsetX/offsetY coordinates from a clientX and an element's\n// getBoundingClientRect\nfunction getOffset(coord: Coord, rect: Rect) {\n  return coord && ([coord[0] - rect.left, coord[1] - rect.top] as Coord)\n}\n\nconst RenderedComponent = observer(({ model }: { model: DotplotViewModel }) => {\n  const { classes } = useStyles()\n  return (\n    <div className={classes.overlay}>\n      {model.tracks.map(track => {\n        const [display] = track.displays\n        const { RenderingComponent } = display\n        return RenderingComponent ? (\n          <RenderingComponent\n            key={track.configuration.trackId}\n            model={display}\n          />\n        ) : null\n      })}\n    </div>\n  )\n})\n\nconst DotplotViewInternal = observer(function ({\n  model,\n}: {\n  model: DotplotViewModel\n}) {\n  const { classes } = useStyles()\n  const [mousecurrClient, setMouseCurrClient] = useState<Coord>()\n  const [mousedownClient, setMouseDownClient] = useState<Coord>()\n  const [mouseOvered, setMouseOvered] = useState(false)\n  const [mouseupClient, setMouseUpClient] = useState<Coord>()\n  const ref = useRef<HTMLDivElement>(null)\n  const root = useRef<HTMLDivElement>(null)\n  const distanceX = useRef(0)\n  const distanceY = useRef(0)\n  const scheduled = useRef(false)\n  const [ctrlKeyWasUsed, setCtrlKeyWasUsed] = useState(false)\n  const [ctrlKeyDown, setCtrlKeyDown] = useState(false)\n  const svg = ref.current?.getBoundingClientRect() || blank\n  const rootRect = ref.current?.getBoundingClientRect() || blank\n  const mousedown = getOffset(mousedownClient, svg)\n  const mousecurr = getOffset(mousecurrClient, svg)\n  const mouseup = getOffset(mouseupClient, svg)\n  const mouserect = mouseup || mousecurr\n  const mouserectClient = mouseupClient || mousecurrClient\n  const xdistance = mousedown && mouserect ? mouserect[0] - mousedown[0] : 0\n  const ydistance = mousedown && mouserect ? mouserect[1] - mousedown[1] : 0\n  const { hview, vview, wheelMode, cursorMode } = model\n\n  const validPan =\n    (cursorMode === 'move' && !ctrlKeyWasUsed) ||\n    (cursorMode === 'crosshair' && ctrlKeyWasUsed)\n\n  const validSelect =\n    (cursorMode === 'move' && ctrlKeyWasUsed) ||\n    (cursorMode === 'crosshair' && !ctrlKeyWasUsed)\n\n  // use non-React wheel handler to properly prevent body scrolling\n  useEffect(() => {\n    function onWheel(event: WheelEvent) {\n      event.preventDefault()\n\n      distanceX.current += event.deltaX\n      distanceY.current -= event.deltaY\n      if (!scheduled.current) {\n        scheduled.current = true\n\n        window.requestAnimationFrame(() => {\n          transaction(() => {\n            if (wheelMode === 'pan') {\n              hview.scroll(distanceX.current / 3)\n              vview.scroll(distanceY.current / 10)\n            } else if (wheelMode === 'zoom') {\n              if (\n                Math.abs(distanceY.current) > Math.abs(distanceX.current) * 2 &&\n                mousecurr\n              ) {\n                const val = distanceY.current < 0 ? 1.1 : 0.9\n                hview.zoomTo(hview.bpPerPx * val, mousecurr[0])\n                vview.zoomTo(\n                  vview.bpPerPx * val,\n                  rootRect.height - mousecurr[1],\n                )\n              }\n            }\n          })\n          scheduled.current = false\n          distanceX.current = 0\n          distanceY.current = 0\n        })\n      }\n    }\n    if (ref.current) {\n      const curr = ref.current\n      curr.addEventListener('wheel', onWheel)\n      return () => {\n        curr.removeEventListener('wheel', onWheel)\n      }\n    }\n    return () => {}\n  }, [hview, vview, wheelMode, mousecurr, rootRect.height])\n\n  useEffect(() => {\n    function globalMouseMove(event: MouseEvent) {\n      setMouseCurrClient([event.clientX, event.clientY])\n\n      if (mousecurrClient && mousedownClient && validPan && !mouseupClient) {\n        hview.scroll(-event.clientX + mousecurrClient[0])\n        vview.scroll(event.clientY - mousecurrClient[1])\n      }\n    }\n\n    window.addEventListener('mousemove', globalMouseMove)\n    return () => {\n      window.removeEventListener('mousemove', globalMouseMove)\n    }\n  }, [validPan, mousecurrClient, mousedownClient, mouseupClient, hview, vview])\n\n  useEffect(() => {\n    function globalCtrlKeyDown(event: KeyboardEvent) {\n      if (event.metaKey || event.ctrlKey) {\n        setCtrlKeyDown(true)\n      }\n    }\n    function globalCtrlKeyUp(event: KeyboardEvent) {\n      if (!event.metaKey && !event.ctrlKey) {\n        setCtrlKeyDown(false)\n      }\n    }\n    window.addEventListener('keydown', globalCtrlKeyDown)\n    window.addEventListener('keyup', globalCtrlKeyUp)\n    return () => {\n      window.removeEventListener('keydown', globalCtrlKeyDown)\n      window.addEventListener('keyup', globalCtrlKeyUp)\n    }\n  }, [])\n\n  // detect a mouseup after a mousedown was submitted, autoremoves mouseup once\n  // that single mouseup is set\n  useEffect(() => {\n    function globalMouseUp(event: MouseEvent) {\n      if (Math.abs(xdistance) > 3 && Math.abs(ydistance) > 3 && validSelect) {\n        setMouseUpClient([event.clientX, event.clientY])\n      } else {\n        setMouseDownClient(undefined)\n      }\n    }\n    if (mousedown && !mouseup) {\n      window.addEventListener('mouseup', globalMouseUp, true)\n      return () => {\n        window.removeEventListener('mouseup', globalMouseUp, true)\n      }\n    }\n    return () => {}\n  }, [validSelect, mousedown, mouseup, xdistance, ydistance])\n\n  return (\n    <div>\n      <Header\n        model={model}\n        selection={\n          !validSelect || !(mousedown && mouserect)\n            ? undefined\n            : {\n                width: Math.abs(xdistance),\n                height: Math.abs(ydistance),\n              }\n        }\n      />\n      <div\n        ref={root}\n        className={classes.root}\n        onMouseLeave={() => {\n          setMouseOvered(false)\n        }}\n        onMouseEnter={() => {\n          setMouseOvered(true)\n        }}\n      >\n        <div className={classes.container}>\n          <VerticalAxis model={model} />\n          <HorizontalAxis model={model} />\n          <div ref={ref} className={classes.content}>\n            {mouseOvered && validSelect ? (\n              <Suspense fallback={null}>\n                <TooltipWhereMouseovered\n                  model={model}\n                  mouserect={mouserect}\n                  mouserectClient={mouserectClient}\n                  xdistance={xdistance}\n                />\n              </Suspense>\n            ) : null}\n            {validSelect ? (\n              <Suspense fallback={null}>\n                <TooltipWhereClicked\n                  model={model}\n                  mousedown={mousedown}\n                  mousedownClient={mousedownClient}\n                  xdistance={xdistance}\n                  ydistance={ydistance}\n                />\n              </Suspense>\n            ) : null}\n            <div\n              style={{ cursor: ctrlKeyDown ? 'pointer' : cursorMode }}\n              onMouseDown={event => {\n                if (event.button === 0) {\n                  const { clientX, clientY } = event\n                  setMouseDownClient([clientX, clientY])\n                  setMouseCurrClient([clientX, clientY])\n                  setCtrlKeyWasUsed(ctrlKeyDown)\n                }\n              }}\n            >\n              <Grid model={model}>\n                {validSelect && mousedown && mouserect ? (\n                  <rect\n                    fill=\"rgba(255,0,0,0.3)\"\n                    x={Math.min(mouserect[0], mousedown[0])}\n                    y={Math.min(mouserect[1], mousedown[1])}\n                    width={Math.abs(xdistance)}\n                    height={Math.abs(ydistance)}\n                  />\n                ) : null}\n              </Grid>\n            </div>\n            <div className={classes.spacer} />\n          </div>\n          <RenderedComponent model={model} />\n          <Menu\n            open={Boolean(mouseup)}\n            onMenuItemClick={(_, callback) => {\n              callback()\n              setMouseUpClient(undefined)\n              setMouseDownClient(undefined)\n            }}\n            onClose={() => {\n              setMouseUpClient(undefined)\n              setMouseDownClient(undefined)\n            }}\n            anchorReference=\"anchorPosition\"\n            anchorPosition={\n              mouseupClient\n                ? {\n                    top: mouseupClient[1] + 50,\n                    left: mouseupClient[0] + 50,\n                  }\n                : undefined\n            }\n            style={{ zIndex: 10000 }}\n            menuItems={[\n              {\n                label: 'Zoom in',\n                onClick: () => {\n                  if (mousedown && mouseup) {\n                    model.zoomIn(mousedown, mouseup)\n                  }\n                  // below line is needed to prevent tooltip from sticking\n                  setMouseOvered(false)\n                },\n              },\n              {\n                label: 'Open linear synteny view',\n                onClick: () => {\n                  if (mousedown && mouseup) {\n                    model.onDotplotView(mousedown, mouseup)\n                  }\n                  // below line is needed to prevent tooltip from sticking\n                  setMouseOvered(false)\n                },\n              },\n            ]}\n          />\n        </div>\n        <ResizeHandle\n          onDrag={n => model.setHeight(model.height + n)}\n          className={classes.resizeHandle}\n        />\n      </div>\n    </div>\n  )\n})\nconst DotplotView = observer(function ({ model }: { model: DotplotViewModel }) {\n  const { initialized, loading, error } = model\n\n  if ((!initialized && !loading) || error) {\n    return <ImportForm model={model} />\n  }\n\n  if (loading) {\n    return <LoadingEllipses variant=\"h6\" />\n  }\n\n  return <DotplotViewInternal model={model} />\n})\n\nexport default DotplotView\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { useTheme } from '@mui/material'\n\n// locals\nimport { DotplotViewModel } from '../model'\nimport { getFillProps, getStrokeProps } from '@jbrowse/core/util'\n\nexport const GridRaw = observer(function ({\n  model,\n  children,\n}: {\n  model: DotplotViewModel\n  children?: React.ReactNode\n}) {\n  const { viewWidth, viewHeight, hview, vview } = model\n  const hblocks = hview.dynamicBlocks.contentBlocks\n  const vblocks = vview.dynamicBlocks.contentBlocks\n  if (!hblocks.length || !vblocks.length) {\n    return null\n  }\n  const htop = hview.displayedRegionsTotalPx - hview.offsetPx\n  const vtop = vview.displayedRegionsTotalPx - vview.offsetPx\n  const hbottom = hblocks[0]!.offsetPx - hview.offsetPx\n  const vbottom = vblocks[0]!.offsetPx - vview.offsetPx\n  const theme = useTheme()\n  const stroke = theme.palette.divider\n\n  // Uses math.max/min avoid making very large SVG rect offscreen element,\n  // which can sometimes fail to draw\n  const rx = Math.max(hbottom, 0)\n  const ry = Math.max(viewHeight - vtop, 0)\n  const w = Math.min(htop - hbottom, viewWidth)\n  const h = Math.min(viewHeight - vbottom - ry, viewHeight)\n\n  let lastx = Number.POSITIVE_INFINITY\n  let lasty = Number.POSITIVE_INFINITY\n  return (\n    <>\n      <rect\n        x={rx}\n        y={ry}\n        width={w}\n        height={h}\n        {...getFillProps(theme.palette.background.default)}\n      />\n      <g>\n        {hblocks.map(region => {\n          const x = region.offsetPx - hview.offsetPx\n          const render = Math.floor(x) !== Math.floor(lastx)\n          if (render) {\n            lastx = x\n          }\n          return render ? (\n            <line\n              key={JSON.stringify(region)}\n              x1={x}\n              y1={0}\n              x2={x}\n              y2={viewHeight}\n              {...getStrokeProps(stroke)}\n            />\n          ) : null\n        })}\n        {vblocks.map(region => {\n          const y = viewHeight - (region.offsetPx - vview.offsetPx)\n          const render = Math.floor(y) !== Math.floor(lasty)\n          if (render) {\n            lasty = y\n          }\n          return render ? (\n            <line\n              key={JSON.stringify(region)}\n              x1={0}\n              y1={y}\n              x2={viewWidth}\n              y2={y}\n              {...getStrokeProps(stroke)}\n            />\n          ) : null\n        })}\n        <line\n          x1={htop}\n          y1={0}\n          x2={htop}\n          y2={viewHeight}\n          {...getStrokeProps(stroke)}\n        />\n        <line\n          x1={0}\n          y1={viewHeight - vtop}\n          x2={viewWidth}\n          y2={viewHeight - vtop}\n          {...getStrokeProps(stroke)}\n        />\n      </g>\n      {children}\n    </>\n  )\n})\n\nexport default function Grid({\n  model,\n  children,\n}: {\n  model: DotplotViewModel\n  children?: React.ReactNode\n}) {\n  const { viewWidth, viewHeight } = model\n  return (\n    <svg\n      width={viewWidth}\n      height={viewHeight}\n      style={{ background: 'rgba(0,0,0,0.12)' }}\n    >\n      <GridRaw model={model}>{children}</GridRaw>\n    </svg>\n  )\n}\n"],"names":["useStyles","makeStyles","vtext","gridColumn","gridRow","pointerEvents","userSelect","htext","HorizontalAxis","observer","model","viewWidth","borderY","classes","React","width","height","className","HorizontalAxisRaw","borderX","hview","htextRotation","hticks","offsetPx","dynamicBlocks","bpPerPx","dblocks","contentBlocks","hide","getBlockLabelKeysToHide","theme","useTheme","hviewSnap","getSnapshot","staticBlocks","ticks","map","tick","bpToPx","refName","coord","base","self","filter","f","undefined","region","has","key","x","xoff","Math","floor","_extends","transform","JSON","stringify","y","fontSize","dominantBaseline","textAnchor","getFillProps","palette","text","primary","x1","x2","y1","y2","type","strokeWidth","t","getTickDisplayStr","assemblyNames","join","VerticalAxis","viewHeight","VerticalAxisRaw","vview","vtextRotation","vticks","vviewSnap","yoff","getStrokeProps","grey","getAdapter","radioOption","assembly1","assembly2","fileLocation","indexFileLocation","bed1Location","bed2Location","pafLocation","queryAssembly","targetAssembly","outLocation","deltaLocation","chainLocation","mcscanAnchorsLocation","mcscanSimpleAnchorsLocation","pifGzLocation","index","location","Error","setSessionTrackData","setBed2Location","useState","setBed1Location","setFileLocation","setIndexFileLocation","value","setValue","error","setError","fileName","sessionTrackData","uri","localPath","name","str","r","split","pop","extName","endsWith","slice","stripGz","useEffect","fn","trackId","Date","now","adapter","e","console","Paper","style","padding","ErrorMessage","Typography","textAlign","RadioGroup","onChange","event","target","Grid","container","justifyContent","item","FormControlLabel","control","Radio","label","margin","href","display","FileSelector","description","setLocation","loc","setShowTrackId","session","getSession","tracks","sessionTracks","filteredTracks","track","readConfObject","includes","resetTrack","paragraph","TrackSelectorIcon","length","Select","MenuItem","getTrackName","importFormContainer","spacing","assemblySelector","TrackSelector","choice","setChoice","FormControl","FormLabel","id","row","ImportCustomTrack","ImportSyntenyTrackSelector","setAssembly2","setAssembly1","showTrackId","displayError","Container","alignItems","AssemblySelector","selected","val","Button","onClick","isSessionWithAddTracks","transaction","addTrackConf","toggleTrack","showTrack","setViews","setAssemblyNames","variant","color","WarningDialog","lazy","trackWarnings","displays","warnings","shown","setShown","setHide","Alert","severity","handleClose","dpad","gridTemplateColumns","position","right","zIndex","top","icon","elevation","IconButton","scroll","ArrowDropUp","ArrowLeft","ArrowRight","ArrowDropDown","zoomIn","ZoomIn","zoomOut","ZoomOut","CursorMove","props","SvgIcon","fill","d","CursorMouse","zoomOutButton","zoomInButton","activateTrackSelector","title","CascadingMenuButton","menuItems","squareView","squareViewProportional","showAllRegions","setDrawCigar","drawCigar","checked","setShowPanButtons","showPanButtons","subMenu","setCursorMode","cursorMode","setWheelMode","wheelMode","MoreVert","bp","marginLeft","spacer","flexGrow","headerBar","selection","DotplotControls","getBpDisplayStr","currBp","DotplotWarnings","PanButtons","TooltipWhereClicked","TooltipWhereMouseovered","blank","left","root","marginBottom","overflow","overlay","cursor","content","resizeHandle","background","boxSizing","borderTop","getOffset","rect","RenderedComponent","RenderingComponent","configuration","DotplotViewInternal","mousecurrClient","setMouseCurrClient","mousedownClient","setMouseDownClient","mouseOvered","setMouseOvered","mouseupClient","setMouseUpClient","ref","useRef","distanceX","distanceY","scheduled","ctrlKeyWasUsed","setCtrlKeyWasUsed","ctrlKeyDown","setCtrlKeyDown","svg","current","getBoundingClientRect","rootRect","mousedown","mousecurr","mouseup","mouserect","mouserectClient","xdistance","ydistance","validPan","validSelect","onWheel","preventDefault","deltaX","deltaY","window","requestAnimationFrame","abs","zoomTo","curr","addEventListener","removeEventListener","globalMouseMove","clientX","clientY","globalCtrlKeyDown","metaKey","ctrlKey","globalCtrlKeyUp","globalMouseUp","Header","onMouseLeave","onMouseEnter","Suspense","fallback","onMouseDown","button","min","Menu","open","Boolean","onMenuItemClick","_","callback","onClose","anchorReference","anchorPosition","onDotplotView","ResizeHandle","onDrag","n","setHeight","initialized","loading","ImportForm","LoadingEllipses","GridRaw","children","hblocks","vblocks","htop","displayedRegionsTotalPx","vtop","hbottom","vbottom","stroke","divider","rx","max","ry","w","h","lastx","Number","POSITIVE_INFINITY","lasty","default","render"],"sourceRoot":""}
\ No newline at end of file