@@ -58,8 +65,8 @@ function DeleteBookmarkDialog({
variant="contained"
color="primary"
onClick={() => {
- if (locString) {
- removeBookmark(locString)
+ if (rowNumber !== undefined) {
+ removeBookmark(rowNumber)
onClose()
}
}}
diff --git a/plugins/grid-bookmark/src/GridBookmarkWidget/components/GridBookmarkWidget.test.js b/plugins/grid-bookmark/src/GridBookmarkWidget/components/GridBookmarkWidget.test.js
index 7d29c036ad..a58a91ef7e 100644
--- a/plugins/grid-bookmark/src/GridBookmarkWidget/components/GridBookmarkWidget.test.js
+++ b/plugins/grid-bookmark/src/GridBookmarkWidget/components/GridBookmarkWidget.test.js
@@ -53,7 +53,7 @@ describe('
', () => {
const { findByText } = render(
)
- expect(findByText('chr1:1-12')).toBeTruthy()
+ expect(await findByText('chr1:2..12')).toBeTruthy()
})
it('deletes individual bookmarks correctly', async () => {
@@ -84,7 +84,7 @@ describe('
', () => {
const { findByText } = render(
)
- fireEvent.click(await findByText('Clear bookmarks'))
+ fireEvent.click(await findByText('Clear'))
fireEvent.click(await findByText('Confirm'))
expect(await findByText('No rows')).toBeTruthy()
diff --git a/plugins/grid-bookmark/src/GridBookmarkWidget/components/GridBookmarkWidget.tsx b/plugins/grid-bookmark/src/GridBookmarkWidget/components/GridBookmarkWidget.tsx
index 5796ca57aa..8b501b5b0d 100644
--- a/plugins/grid-bookmark/src/GridBookmarkWidget/components/GridBookmarkWidget.tsx
+++ b/plugins/grid-bookmark/src/GridBookmarkWidget/components/GridBookmarkWidget.tsx
@@ -1,66 +1,74 @@
import React, { useState } from 'react'
import { observer } from 'mobx-react'
-
-import { Link, IconButton, Typography, Button } from '@material-ui/core'
+import {
+ Link,
+ IconButton,
+ Typography,
+ Button,
+ makeStyles,
+} from '@material-ui/core'
import { DataGrid, GridCellParams } from '@material-ui/data-grid'
-
import { getSession, assembleLocString, measureText } from '@jbrowse/core/util'
-
-import { GridBookmarkModel } from '../model'
-import { navToBookmark } from '../utils'
-
import DeleteIcon from '@material-ui/icons/Delete'
import ViewCompactIcon from '@material-ui/icons/ViewCompact'
+
import AssemblySelector from './AssemblySelector'
import DeleteBookmarkDialog from './DeleteBookmark'
import DownloadBookmarks from './DownloadBookmarks'
import ImportBookmarks from './ImportBookmarks'
import ClearBookmarks from './ClearBookmarks'
+import { GridBookmarkModel } from '../model'
+import { navToBookmark } from '../utils'
+
+const useStyles = makeStyles(() => ({
+ link: {
+ cursor: 'pointer',
+ },
+}))
-// creates a coarse measurement of column width, similar to code in BaseFeatureDetails
+// creates a coarse measurement of column width, similar to code in
+// BaseFeatureDetails
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const measure = (row: any, col: string) =>
Math.min(Math.max(measureText(String(row[col]), 14) + 20, 80), 1000)
const BookmarkGrid = observer(
({ compact, model }: { model: GridBookmarkModel; compact: boolean }) => {
- const [dialogOpen, setDialogOpen] = useState
()
- const { bookmarkedRegions, updateBookmarkLabel, selectedAssembly } = model
+ const classes = useStyles()
+ const [dialogRowNumber, setDialogRowNumber] = useState()
+ const { bookmarkedRegions, selectedAssembly } = model
const { views } = getSession(model)
const bookmarkRows = bookmarkedRegions
.toJS()
- .map(region => {
- const { assemblyName, ...rest } = region
- const displayedId = assembleLocString(
- selectedAssembly === 'all' ? region : rest,
- )
- const id = assembleLocString(region)
- return {
- ...region,
- displayedId,
- id,
- delete: id,
- }
- })
.filter(
region =>
selectedAssembly === 'all' ||
region.assemblyName === selectedAssembly,
)
+ .map((region, index) => {
+ const { assemblyName, ...rest } = region
+ return {
+ ...region,
+ id: index,
+ delete: index,
+ locString: assembleLocString(
+ selectedAssembly === 'all' ? region : rest,
+ ),
+ }
+ })
const columns = [
{
- field: 'displayedId',
+ field: 'locString',
headerName: 'bookmark link',
- width: Math.max(...bookmarkRows.map(row => measure(row, 'id'))),
+ width: Math.max(...bookmarkRows.map(row => measure(row, 'locString'))),
renderCell: (params: GridCellParams) => {
const { value } = params
return (
{
- navToBookmark(value as string, views, model)
- }}
+ className={classes.link}
+ onClick={() => navToBookmark(value as string, views, model)}
>
{value}
@@ -84,8 +92,11 @@ const BookmarkGrid = observer(
setDialogOpen(value as string)}
- style={{ padding: 0 }}
+ onClick={() => {
+ if (value !== null && value !== undefined) {
+ setDialogRowNumber(+value)
+ }
+ }}
>
@@ -103,21 +114,15 @@ const BookmarkGrid = observer(
columns={columns}
onCellEditCommit={args => {
const { value, id } = args
- bookmarkRows.forEach(row => {
- if (row.id === id) {
- updateBookmarkLabel(id, value as string)
- }
- })
+ model.updateBookmarkLabel(id as number, value as string)
}}
disableSelectionOnClick
/>
{
- setDialogOpen(undefined)
- }}
+ onClose={() => setDialogRowNumber(undefined)}
/>
>
)
@@ -125,19 +130,18 @@ const BookmarkGrid = observer(
)
function GridBookmarkWidget({ model }: { model: GridBookmarkModel }) {
+ const { selectedAssembly } = model
const [compact, setCompact] = useState(false)
return (
<>
-
+
}
- onClick={() => {
- setCompact(!compact)
- }}
+ onClick={() => setCompact(!compact)}
>
Compact
diff --git a/plugins/grid-bookmark/src/GridBookmarkWidget/components/ImportBookmarks.tsx b/plugins/grid-bookmark/src/GridBookmarkWidget/components/ImportBookmarks.tsx
index 58b01255f7..8dbf82e826 100644
--- a/plugins/grid-bookmark/src/GridBookmarkWidget/components/ImportBookmarks.tsx
+++ b/plugins/grid-bookmark/src/GridBookmarkWidget/components/ImportBookmarks.tsx
@@ -1,20 +1,26 @@
import React, { useState } from 'react'
import { observer } from 'mobx-react'
-
+import { getSession } from '@jbrowse/core/util'
+import AssemblySelector from '@jbrowse/core/ui/AssemblySelector'
+import { FileLocation } from '@jbrowse/core/util/types'
+import { FileSelector } from '@jbrowse/core/ui'
+import { openLocation } from '@jbrowse/core/util/io'
import {
IconButton,
Button,
Dialog,
DialogTitle,
+ DialogContent,
+ DialogActions,
+ Grid,
Select,
MenuItem,
makeStyles,
+ Typography,
} from '@material-ui/core'
import CloseIcon from '@material-ui/icons/Close'
import ImportIcon from '@material-ui/icons/Publish'
-
import { GridBookmarkModel } from '../model'
-import { downloadBookmarkFile } from '../utils'
const useStyles = makeStyles(() => ({
closeDialog: {
@@ -28,30 +34,35 @@ const useStyles = makeStyles(() => ({
flexItem: {
margin: 5,
},
- flexContainer: {
- display: 'flex',
- justifyContent: 'space-evenly',
- width: 200,
- },
}))
-function ImportBookmarks({ model }: { model: GridBookmarkModel }) {
+function ImportBookmarks({
+ model,
+ assemblyName,
+}: {
+ model: GridBookmarkModel
+ assemblyName: string
+}) {
const classes = useStyles()
const [dialogOpen, setDialogOpen] = useState(false)
+ const [location, setLocation] = useState()
+ const [error, setError] = useState()
const [fileType, setFileType] = useState('BED')
-
- const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {
- setFileType(event.target.value as string)
- }
-
- const { bookmarkedRegions } = model
+ const session = getSession(model)
+ const [selectedAsm, setSelectedAsm] = useState(
+ assemblyName || session.assemblyNames[0],
+ )
return (
<>
} onClick={() => setDialogOpen(true)}>
Import
-