@jbrowse/plugin-grid-bookmark 2.6.3 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/GridBookmarkWidget/components/AssemblySelector.d.ts +3 -4
  2. package/dist/GridBookmarkWidget/components/AssemblySelector.js +27 -37
  3. package/dist/GridBookmarkWidget/components/BookmarkGrid.d.ts +6 -0
  4. package/dist/GridBookmarkWidget/components/BookmarkGrid.js +120 -0
  5. package/dist/GridBookmarkWidget/components/{ClearBookmarks.d.ts → DeleteBookmarks.d.ts} +2 -3
  6. package/dist/GridBookmarkWidget/components/DeleteBookmarks.js +41 -0
  7. package/dist/GridBookmarkWidget/components/DeleteBookmarksDialog.d.ts +7 -0
  8. package/dist/GridBookmarkWidget/components/DeleteBookmarksDialog.js +29 -0
  9. package/dist/GridBookmarkWidget/components/EditBookmarkLabelDialog.d.ts +8 -0
  10. package/dist/GridBookmarkWidget/components/EditBookmarkLabelDialog.js +50 -0
  11. package/dist/GridBookmarkWidget/components/ExportBookmarks.d.ts +6 -0
  12. package/dist/GridBookmarkWidget/components/{ClearBookmarks.js → ExportBookmarks.js} +9 -19
  13. package/dist/GridBookmarkWidget/components/ExportBookmarksDialog.d.ts +7 -0
  14. package/dist/GridBookmarkWidget/components/{DownloadBookmarks.js → ExportBookmarksDialog.js} +22 -20
  15. package/dist/GridBookmarkWidget/components/GridBookmarkWidget.d.ts +3 -4
  16. package/dist/GridBookmarkWidget/components/GridBookmarkWidget.js +28 -102
  17. package/dist/GridBookmarkWidget/components/ImportBookmarks.d.ts +3 -5
  18. package/dist/GridBookmarkWidget/components/ImportBookmarks.js +8 -64
  19. package/dist/GridBookmarkWidget/components/ImportBookmarksDialog.d.ts +7 -0
  20. package/dist/GridBookmarkWidget/components/ImportBookmarksDialog.js +129 -0
  21. package/{esm/GridBookmarkWidget/components/ClearBookmarks.d.ts → dist/GridBookmarkWidget/components/ShareBookmarks.d.ts} +2 -3
  22. package/dist/GridBookmarkWidget/components/ShareBookmarks.js +37 -0
  23. package/dist/GridBookmarkWidget/components/ShareBookmarksDialog.d.ts +7 -0
  24. package/dist/GridBookmarkWidget/components/ShareBookmarksDialog.js +106 -0
  25. package/dist/GridBookmarkWidget/model.d.ts +178 -11
  26. package/dist/GridBookmarkWidget/model.js +105 -27
  27. package/dist/GridBookmarkWidget/sessionSharing.d.ts +6 -0
  28. package/dist/GridBookmarkWidget/sessionSharing.js +96 -0
  29. package/dist/GridBookmarkWidget/utils.d.ts +19 -3
  30. package/dist/GridBookmarkWidget/utils.js +132 -40
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +100 -75
  33. package/esm/GridBookmarkWidget/components/AssemblySelector.d.ts +3 -4
  34. package/esm/GridBookmarkWidget/components/AssemblySelector.js +28 -38
  35. package/esm/GridBookmarkWidget/components/BookmarkGrid.d.ts +6 -0
  36. package/esm/GridBookmarkWidget/components/BookmarkGrid.js +92 -0
  37. package/{dist/GridBookmarkWidget/components/DownloadBookmarks.d.ts → esm/GridBookmarkWidget/components/DeleteBookmarks.d.ts} +2 -3
  38. package/esm/GridBookmarkWidget/components/DeleteBookmarks.js +13 -0
  39. package/esm/GridBookmarkWidget/components/DeleteBookmarksDialog.d.ts +7 -0
  40. package/esm/GridBookmarkWidget/components/DeleteBookmarksDialog.js +24 -0
  41. package/esm/GridBookmarkWidget/components/EditBookmarkLabelDialog.d.ts +8 -0
  42. package/esm/GridBookmarkWidget/components/EditBookmarkLabelDialog.js +25 -0
  43. package/esm/GridBookmarkWidget/components/ExportBookmarks.d.ts +6 -0
  44. package/esm/GridBookmarkWidget/components/ExportBookmarks.js +13 -0
  45. package/esm/GridBookmarkWidget/components/ExportBookmarksDialog.d.ts +7 -0
  46. package/esm/GridBookmarkWidget/components/ExportBookmarksDialog.js +35 -0
  47. package/esm/GridBookmarkWidget/components/GridBookmarkWidget.d.ts +3 -4
  48. package/esm/GridBookmarkWidget/components/GridBookmarkWidget.js +28 -79
  49. package/esm/GridBookmarkWidget/components/ImportBookmarks.d.ts +3 -5
  50. package/esm/GridBookmarkWidget/components/ImportBookmarks.js +10 -66
  51. package/esm/GridBookmarkWidget/components/ImportBookmarksDialog.d.ts +7 -0
  52. package/esm/GridBookmarkWidget/components/ImportBookmarksDialog.js +101 -0
  53. package/esm/GridBookmarkWidget/components/{DownloadBookmarks.d.ts → ShareBookmarks.d.ts} +2 -3
  54. package/esm/GridBookmarkWidget/components/ShareBookmarks.js +12 -0
  55. package/esm/GridBookmarkWidget/components/ShareBookmarksDialog.d.ts +7 -0
  56. package/esm/GridBookmarkWidget/components/ShareBookmarksDialog.js +78 -0
  57. package/esm/GridBookmarkWidget/model.d.ts +178 -11
  58. package/esm/GridBookmarkWidget/model.js +106 -28
  59. package/esm/GridBookmarkWidget/sessionSharing.d.ts +6 -0
  60. package/esm/GridBookmarkWidget/sessionSharing.js +68 -0
  61. package/esm/GridBookmarkWidget/utils.d.ts +19 -3
  62. package/esm/GridBookmarkWidget/utils.js +105 -39
  63. package/esm/index.d.ts +1 -1
  64. package/esm/index.js +101 -76
  65. package/package.json +4 -3
  66. package/dist/GridBookmarkWidget/components/DeleteBookmark.d.ts +0 -9
  67. package/dist/GridBookmarkWidget/components/DeleteBookmark.js +0 -31
  68. package/esm/GridBookmarkWidget/components/ClearBookmarks.js +0 -23
  69. package/esm/GridBookmarkWidget/components/DeleteBookmark.d.ts +0 -9
  70. package/esm/GridBookmarkWidget/components/DeleteBookmark.js +0 -26
  71. package/esm/GridBookmarkWidget/components/DownloadBookmarks.js +0 -33
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { GridBookmarkModel } from '../model';
3
- declare function AssemblySelector({ model }: {
3
+ declare const AssemblySelector: ({ model, }: {
4
4
  model: GridBookmarkModel;
5
- }): React.JSX.Element;
6
- declare const _default: typeof AssemblySelector;
7
- export default _default;
5
+ }) => React.JSX.Element;
6
+ export default AssemblySelector;
@@ -6,40 +6,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
7
  const mobx_react_1 = require("mobx-react");
8
8
  const material_1 = require("@mui/material");
9
- const mui_1 = require("tss-react/mui");
10
- const useStyles = (0, mui_1.makeStyles)()(() => ({
11
- container: {
12
- display: 'flex',
13
- flexDirection: 'row',
14
- margin: 5,
15
- },
16
- selectText: {
17
- marginRight: 8,
18
- marginTop: 10,
19
- },
20
- flexItem: {
21
- marginRight: 8,
22
- },
23
- }));
24
- function AssemblySelector({ model }) {
25
- const { classes } = useStyles();
26
- const { assemblies, selectedAssembly, setSelectedAssembly } = model;
27
- const noAssemblies = assemblies.length === 0 ? true : false;
28
- const determineCurrentValue = (selectedAssembly) => {
29
- if (selectedAssembly === 'all') {
30
- return 'all';
31
- }
32
- else if (assemblies.includes(selectedAssembly)) {
33
- return selectedAssembly;
34
- }
35
- return 'none';
36
- };
37
- return (react_1.default.createElement("div", { className: classes.container },
38
- react_1.default.createElement(material_1.Typography, { className: classes.selectText }, "Select assembly:"),
39
- react_1.default.createElement(material_1.FormControl, { className: classes.flexItem, disabled: noAssemblies },
40
- react_1.default.createElement(material_1.Select, { value: determineCurrentValue(selectedAssembly), onChange: event => setSelectedAssembly(event.target.value) },
41
- react_1.default.createElement(material_1.MenuItem, { value: "none" }, "none"),
42
- react_1.default.createElement(material_1.MenuItem, { value: "all" }, "all"),
43
- assemblies.map(assembly => (react_1.default.createElement(material_1.MenuItem, { value: assembly, key: assembly }, assembly)))))));
44
- }
45
- exports.default = (0, mobx_react_1.observer)(AssemblySelector);
9
+ const AssemblySelector = (0, mobx_react_1.observer)(function ({ model, }) {
10
+ const { validAssemblies, selectedAssemblies } = model;
11
+ const noAssemblies = validAssemblies.size === 0 ? true : false;
12
+ const label = 'Select assemblies';
13
+ const id = 'select-assemblies-label';
14
+ const selectedSet = new Set(selectedAssemblies);
15
+ const isAllSelected = [...validAssemblies].every(e => selectedSet.has(e));
16
+ return (react_1.default.createElement(material_1.FormControl, { disabled: noAssemblies, fullWidth: true },
17
+ react_1.default.createElement(material_1.InputLabel, { id: id }, label),
18
+ react_1.default.createElement(material_1.Select, { labelId: id, multiple: true, value: selectedAssemblies, onChange: event => model.setSelectedAssemblies([...event.target.value]), input: react_1.default.createElement(material_1.OutlinedInput, { label: label }), renderValue: selected => selected.join(', ') },
19
+ react_1.default.createElement(material_1.MenuItem, { onClickCapture: event => {
20
+ // onClickCapture allows us to avoid the parent Select onChange from triggering
21
+ if (isAllSelected) {
22
+ model.setSelectedAssemblies([]);
23
+ }
24
+ else {
25
+ model.setSelectedAssemblies(undefined);
26
+ }
27
+ event.preventDefault();
28
+ } },
29
+ react_1.default.createElement(material_1.Checkbox, { checked: isAllSelected, indeterminate: !isAllSelected && selectedAssemblies.length > 0 }),
30
+ react_1.default.createElement(material_1.ListItemText, { primary: "Select all" })),
31
+ [...validAssemblies].map(name => (react_1.default.createElement(material_1.MenuItem, { key: name, value: name },
32
+ react_1.default.createElement(material_1.Checkbox, { checked: selectedAssemblies.includes(name) }),
33
+ react_1.default.createElement(material_1.ListItemText, { primary: name })))))));
34
+ });
35
+ exports.default = AssemblySelector;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { GridBookmarkModel } from '../model';
3
+ declare const BookmarkGrid: ({ model, }: {
4
+ model: GridBookmarkModel;
5
+ }) => React.JSX.Element;
6
+ export default BookmarkGrid;
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importStar(require("react"));
30
+ const mobx_react_1 = require("mobx-react");
31
+ const material_1 = require("@mui/material");
32
+ const mui_1 = require("tss-react/mui");
33
+ const x_data_grid_1 = require("@mui/x-data-grid");
34
+ const util_1 = require("@jbrowse/core/util");
35
+ // locals
36
+ const utils_1 = require("../utils");
37
+ const useResizeBar_1 = require("@jbrowse/core/ui/useResizeBar");
38
+ const ResizeBar_1 = __importDefault(require("@jbrowse/core/ui/ResizeBar"));
39
+ const EditBookmarkLabelDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./EditBookmarkLabelDialog'))));
40
+ const useStyles = (0, mui_1.makeStyles)()(() => ({
41
+ link: {
42
+ cursor: 'pointer',
43
+ },
44
+ cell: {
45
+ whiteSpace: 'nowrap',
46
+ overflow: 'hidden',
47
+ textOverflow: 'ellipsis',
48
+ },
49
+ }));
50
+ const BookmarkGrid = (0, mobx_react_1.observer)(function ({ model, }) {
51
+ const { classes, cx } = useStyles();
52
+ const [dialogRow, setDialogRow] = (0, react_1.useState)();
53
+ const { ref, scrollLeft } = (0, useResizeBar_1.useResizeBar)();
54
+ const { bookmarks, bookmarksWithValidAssemblies, selectedAssemblies, selectedBookmarks, } = model;
55
+ const session = (0, util_1.getSession)(model);
56
+ const selectedSet = new Set(selectedAssemblies);
57
+ const rows = bookmarks
58
+ .filter(r => selectedSet.has(r.assemblyName))
59
+ .map((region, index) => {
60
+ const { assemblyName, ...rest } = region;
61
+ return {
62
+ ...region,
63
+ id: index,
64
+ assemblyName,
65
+ locString: (0, util_1.assembleLocString)(rest),
66
+ correspondingObj: region,
67
+ };
68
+ });
69
+ // reset selections if bookmarked regions change
70
+ // needed especially if bookmarked regions are deleted, then
71
+ const [widths, setWidths] = (0, react_1.useState)([
72
+ 40,
73
+ Math.max((0, util_1.measureText)('Bookmark link'), (0, util_1.measureGridWidth)(rows.map(row => row.locString))),
74
+ Math.max((0, util_1.measureText)('Label'), (0, util_1.measureGridWidth)(rows.map(row => row.label))),
75
+ Math.max((0, util_1.measureText)('Assembly'), (0, util_1.measureGridWidth)(rows.map(row => row.assemblyName))),
76
+ ]);
77
+ return (react_1.default.createElement(react_1.default.Fragment, null,
78
+ react_1.default.createElement("div", { ref: ref },
79
+ react_1.default.createElement(ResizeBar_1.default, { widths: widths, setWidths: setWidths, scrollLeft: scrollLeft }),
80
+ react_1.default.createElement(x_data_grid_1.DataGrid, { autoHeight: true, density: "compact", rows: rows, columns: [
81
+ {
82
+ ...x_data_grid_1.GRID_CHECKBOX_SELECTION_COL_DEF,
83
+ width: widths[0],
84
+ },
85
+ {
86
+ field: 'locString',
87
+ headerName: 'Bookmark link',
88
+ width: widths[1],
89
+ renderCell: ({ value, row }) => (react_1.default.createElement(material_1.Link, { className: cx(classes.link, classes.cell), href: "#", onClick: async (event) => {
90
+ event.preventDefault();
91
+ const { views } = session;
92
+ await (0, utils_1.navToBookmark)(value, row.assemblyName, views, model);
93
+ } }, value)),
94
+ },
95
+ {
96
+ field: 'label',
97
+ headerName: 'Label',
98
+ width: widths[2],
99
+ editable: true,
100
+ },
101
+ {
102
+ field: 'assemblyName',
103
+ headerName: 'Assembly',
104
+ width: widths[3],
105
+ },
106
+ ], onCellDoubleClick: ({ row }) => setDialogRow(row), processRowUpdate: row => {
107
+ const target = rows[row.id];
108
+ model.updateBookmarkLabel(target, row.label);
109
+ return row;
110
+ }, onProcessRowUpdateError: e => session.notify(e.message, 'error'), checkboxSelection: true, onRowSelectionModelChange: newRowSelectionModel => {
111
+ if (bookmarksWithValidAssemblies.length > 0) {
112
+ model.setSelectedBookmarks(newRowSelectionModel.map(value => ({
113
+ ...rows[value],
114
+ })));
115
+ }
116
+ }, rowSelectionModel: selectedBookmarks.map(r => r.id), disableRowSelectionOnClick: true })),
117
+ dialogRow ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(react_1.default.Fragment, null) },
118
+ react_1.default.createElement(EditBookmarkLabelDialog, { onClose: () => setDialogRow(undefined), model: model, dialogRow: dialogRow }))) : null));
119
+ });
120
+ exports.default = BookmarkGrid;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { GridBookmarkModel } from '../model';
3
- declare function ClearBookmarks({ model }: {
3
+ declare function DeleteBookmarks({ model }: {
4
4
  model: GridBookmarkModel;
5
5
  }): React.JSX.Element;
6
- declare const _default: typeof ClearBookmarks;
7
- export default _default;
6
+ export default DeleteBookmarks;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ const react_1 = __importStar(require("react"));
30
+ const material_1 = require("@mui/material");
31
+ // icons
32
+ const Delete_1 = __importDefault(require("@mui/icons-material/Delete"));
33
+ const DeleteBookmarksDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./DeleteBookmarksDialog'))));
34
+ function DeleteBookmarks({ model }) {
35
+ const [open, setOpen] = (0, react_1.useState)(false);
36
+ return (react_1.default.createElement(react_1.default.Fragment, null,
37
+ react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(Delete_1.default, null), "aria-label": "clear bookmarks", onClick: () => setOpen(true) }, "Delete"),
38
+ open ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(react_1.default.Fragment, null) },
39
+ react_1.default.createElement(DeleteBookmarksDialog, { model: model, onClose: () => setOpen(false) }))) : null));
40
+ }
41
+ exports.default = DeleteBookmarks;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { GridBookmarkModel } from '../model';
3
+ declare const DeleteBookmarksDialog: ({ onClose, model, }: {
4
+ onClose: () => void;
5
+ model: GridBookmarkModel;
6
+ }) => React.JSX.Element;
7
+ export default DeleteBookmarksDialog;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const react_1 = __importDefault(require("react"));
7
+ const mobx_react_1 = require("mobx-react");
8
+ const material_1 = require("@mui/material");
9
+ const ui_1 = require("@jbrowse/core/ui");
10
+ const DeleteBookmarksDialog = (0, mobx_react_1.observer)(function ({ onClose, model, }) {
11
+ const { selectedBookmarks } = model;
12
+ const deleteAll = selectedBookmarks.length === 0;
13
+ return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: onClose, title: "Delete bookmarks" },
14
+ react_1.default.createElement(material_1.DialogContent, null,
15
+ react_1.default.createElement(material_1.Alert, { severity: "warning" }, deleteAll ? (react_1.default.createElement(react_1.default.Fragment, null,
16
+ react_1.default.createElement("span", null, "All bookmarks will be deleted."),
17
+ react_1.default.createElement("br", null),
18
+ react_1.default.createElement("span", null, "Use the checkboxes to select individual bookmarks to delete."))) : ('Only selected bookmarks will be deleted.'))),
19
+ react_1.default.createElement(material_1.DialogActions, null,
20
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => onClose() }, "Cancel"),
21
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", onClick: () => {
22
+ if (deleteAll) {
23
+ model.clearAllBookmarks();
24
+ }
25
+ model.clearSelectedBookmarks();
26
+ onClose();
27
+ } }, "Confirm"))));
28
+ });
29
+ exports.default = DeleteBookmarksDialog;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import { GridBookmarkModel, IExtendedLabeledRegionModel } from '../model';
3
+ declare const EditBookmarkLabelDialog: ({ model, onClose, dialogRow, }: {
4
+ model: GridBookmarkModel;
5
+ dialogRow: IExtendedLabeledRegionModel;
6
+ onClose: () => void;
7
+ }) => React.JSX.Element;
8
+ export default EditBookmarkLabelDialog;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const react_1 = __importStar(require("react"));
27
+ const material_1 = require("@mui/material");
28
+ const ui_1 = require("@jbrowse/core/ui");
29
+ const mobx_react_1 = require("mobx-react");
30
+ const util_1 = require("@jbrowse/core/util");
31
+ const EditBookmarkLabelDialog = (0, mobx_react_1.observer)(function ({ model, onClose, dialogRow, }) {
32
+ const [newLabel, setNewLabel] = (0, react_1.useState)(dialogRow.label || '');
33
+ return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: onClose, title: "Edit bookmark label" },
34
+ react_1.default.createElement(material_1.DialogContent, null,
35
+ react_1.default.createElement(material_1.Alert, null,
36
+ "Editing label for bookmark",
37
+ ' ',
38
+ react_1.default.createElement("strong", null, (0, util_1.assembleLocString)(dialogRow.correspondingObj)),
39
+ ":"),
40
+ react_1.default.createElement(material_1.TextField, { fullWidth: true, inputProps: { 'data-testid': 'edit-bookmark-label-field' }, variant: "outlined", value: newLabel, onChange: e => setNewLabel(e.target.value), autoFocus: true })),
41
+ react_1.default.createElement(material_1.DialogActions, null,
42
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", onClick: () => {
43
+ if (newLabel && dialogRow) {
44
+ model.updateBookmarkLabel(dialogRow, newLabel);
45
+ }
46
+ setNewLabel('');
47
+ onClose();
48
+ } }, "Confirm"))));
49
+ });
50
+ exports.default = EditBookmarkLabelDialog;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { GridBookmarkModel } from '../model';
3
+ declare const ExportBookmarks: ({ model, }: {
4
+ model: GridBookmarkModel;
5
+ }) => React.JSX.Element;
6
+ export default ExportBookmarks;
@@ -29,23 +29,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
30
  const mobx_react_1 = require("mobx-react");
31
31
  const material_1 = require("@mui/material");
32
- const ui_1 = require("@jbrowse/core/ui");
33
- // icons
34
- const ClearAll_1 = __importDefault(require("@mui/icons-material/ClearAll"));
35
- function ClearBookmarks({ model }) {
36
- const [dialogOpen, setDialogOpen] = (0, react_1.useState)(false);
32
+ const GetApp_1 = __importDefault(require("@mui/icons-material/GetApp"));
33
+ const ExportBookmarksDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./ExportBookmarksDialog'))));
34
+ const ExportBookmarks = (0, mobx_react_1.observer)(function ExportBookmarks({ model, }) {
35
+ const [open, setOpen] = (0, react_1.useState)(false);
37
36
  return (react_1.default.createElement(react_1.default.Fragment, null,
38
- react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(ClearAll_1.default, null), "aria-label": "clear bookmarks", onClick: () => setDialogOpen(true) }, "Clear"),
39
- react_1.default.createElement(ui_1.Dialog, { open: dialogOpen, onClose: () => setDialogOpen(false), title: "Clear bookmarks" },
40
- react_1.default.createElement(material_1.DialogContent, null,
41
- react_1.default.createElement(material_1.Typography, null, "Clear all bookmarks? Note this will clear bookmarks for all assemblies")),
42
- react_1.default.createElement(material_1.DialogActions, null,
43
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
44
- setDialogOpen(false);
45
- } }, "Cancel"),
46
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "primary", onClick: () => {
47
- model.clearAllBookmarks();
48
- setDialogOpen(false);
49
- } }, "Confirm")))));
50
- }
51
- exports.default = (0, mobx_react_1.observer)(ClearBookmarks);
37
+ react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(GetApp_1.default, null), onClick: () => setOpen(true), "data-testid": "export_button" }, "Export"),
38
+ open ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(react_1.default.Fragment, null) },
39
+ react_1.default.createElement(ExportBookmarksDialog, { onClose: () => setOpen(false), model: model }))) : null));
40
+ });
41
+ exports.default = ExportBookmarks;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { GridBookmarkModel } from '../model';
3
+ declare const ExportBookmarksDialog: ({ model, onClose, }: {
4
+ model: GridBookmarkModel;
5
+ onClose: (arg: boolean) => void;
6
+ }) => React.JSX.Element;
7
+ export default ExportBookmarksDialog;
@@ -29,33 +29,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
30
  const mobx_react_1 = require("mobx-react");
31
31
  const material_1 = require("@mui/material");
32
- const ui_1 = require("@jbrowse/core/ui");
33
- const mui_1 = require("tss-react/mui");
34
32
  const GetApp_1 = __importDefault(require("@mui/icons-material/GetApp"));
33
+ const mui_1 = require("tss-react/mui");
34
+ const ui_1 = require("@jbrowse/core/ui");
35
35
  const utils_1 = require("../utils");
36
36
  const useStyles = (0, mui_1.makeStyles)()(() => ({
37
37
  flexItem: {
38
38
  margin: 5,
39
39
  },
40
40
  }));
41
- function DownloadBookmarks({ model }) {
41
+ const ExportBookmarksDialog = (0, mobx_react_1.observer)(function ExportBookmarksDialog({ model, onClose, }) {
42
42
  const { classes } = useStyles();
43
- const [dialogOpen, setDialogOpen] = (0, react_1.useState)(false);
44
43
  const [fileType, setFileType] = (0, react_1.useState)('BED');
45
- const { bookmarkedRegions } = model;
46
- return (react_1.default.createElement(react_1.default.Fragment, null,
47
- react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(GetApp_1.default, null), onClick: () => setDialogOpen(true) }, "Download"),
48
- react_1.default.createElement(ui_1.Dialog, { open: dialogOpen, onClose: () => setDialogOpen(false), title: "Download bookmarks" },
49
- react_1.default.createElement(material_1.DialogContent, null,
50
- react_1.default.createElement(material_1.Typography, null, "Format to download"),
51
- react_1.default.createElement(material_1.Select, { className: classes.flexItem, "data-testid": "selectFileType", value: fileType, onChange: event => setFileType(event.target.value) },
44
+ const { selectedBookmarks } = model;
45
+ const exportAll = selectedBookmarks.length === 0;
46
+ return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: onClose, title: "Export bookmarks" },
47
+ react_1.default.createElement(material_1.DialogContent, { style: { display: 'flex', flexFlow: 'column', gap: '5px' } },
48
+ react_1.default.createElement(material_1.Alert, { severity: "info" }, exportAll ? (react_1.default.createElement(react_1.default.Fragment, null,
49
+ react_1.default.createElement("span", null, "All bookmarks will be exported."),
50
+ react_1.default.createElement("br", null),
51
+ react_1.default.createElement("span", null, "Use the checkboxes to select individual bookmarks to export."))) : ('Only selected bookmarks will be exported.')),
52
+ react_1.default.createElement("div", { style: { display: 'flex', alignItems: 'center' } },
53
+ react_1.default.createElement(material_1.Typography, null, "Format to download:"),
54
+ react_1.default.createElement(material_1.Select, { size: "small", className: classes.flexItem, "data-testid": "selectFileType", value: fileType, onChange: event => setFileType(event.target.value) },
52
55
  react_1.default.createElement(material_1.MenuItem, { value: "BED" }, "BED"),
53
- react_1.default.createElement(material_1.MenuItem, { value: "TSV" }, "TSV"))),
54
- react_1.default.createElement(material_1.DialogActions, null,
55
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => setDialogOpen(false) }, "Cancel"),
56
- react_1.default.createElement(material_1.Button, { className: classes.flexItem, "data-testid": "dialogDownload", variant: "contained", color: "primary", startIcon: react_1.default.createElement(GetApp_1.default, null), onClick: () => {
57
- (0, utils_1.downloadBookmarkFile)(bookmarkedRegions, fileType, model);
58
- setDialogOpen(false);
59
- } }, "Download")))));
60
- }
61
- exports.default = (0, mobx_react_1.observer)(DownloadBookmarks);
56
+ react_1.default.createElement(material_1.MenuItem, { value: "TSV" }, "TSV")))),
57
+ react_1.default.createElement(material_1.DialogActions, null,
58
+ react_1.default.createElement(material_1.Button, { className: classes.flexItem, "data-testid": "dialogDownload", variant: "contained", color: "primary", startIcon: react_1.default.createElement(GetApp_1.default, null), onClick: () => {
59
+ (0, utils_1.downloadBookmarkFile)(fileType, model);
60
+ onClose(false);
61
+ } }, "Download"))));
62
+ });
63
+ exports.default = ExportBookmarksDialog;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { GridBookmarkModel } from '../model';
3
- declare function GridBookmarkWidget({ model }: {
3
+ declare const GridBookmarkWidget: ({ model, }: {
4
4
  model: GridBookmarkModel;
5
- }): React.JSX.Element;
6
- declare const _default: typeof GridBookmarkWidget;
7
- export default _default;
5
+ }) => React.JSX.Element | null;
6
+ export default GridBookmarkWidget;
@@ -1,116 +1,42 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
4
  };
28
5
  Object.defineProperty(exports, "__esModule", { value: true });
29
- const react_1 = __importStar(require("react"));
6
+ const react_1 = __importDefault(require("react"));
30
7
  const mobx_react_1 = require("mobx-react");
31
8
  const material_1 = require("@mui/material");
32
9
  const mui_1 = require("tss-react/mui");
33
- const x_data_grid_1 = require("@mui/x-data-grid");
34
- const util_1 = require("@jbrowse/core/util");
35
- // icons
36
- const Delete_1 = __importDefault(require("@mui/icons-material/Delete"));
37
10
  // locals
38
- const AssemblySelector_1 = __importDefault(require("./AssemblySelector"));
39
- const DeleteBookmark_1 = __importDefault(require("./DeleteBookmark"));
40
- const DownloadBookmarks_1 = __importDefault(require("./DownloadBookmarks"));
11
+ const BookmarkGrid_1 = __importDefault(require("./BookmarkGrid"));
12
+ const DeleteBookmarks_1 = __importDefault(require("./DeleteBookmarks"));
13
+ const ExportBookmarks_1 = __importDefault(require("./ExportBookmarks"));
41
14
  const ImportBookmarks_1 = __importDefault(require("./ImportBookmarks"));
42
- const ClearBookmarks_1 = __importDefault(require("./ClearBookmarks"));
43
- const utils_1 = require("../utils");
44
- const useStyles = (0, mui_1.makeStyles)()(theme => ({
45
- link: {
46
- cursor: 'pointer',
47
- },
48
- margin: {
49
- margin: theme.spacing(2),
15
+ const AssemblySelector_1 = __importDefault(require("./AssemblySelector"));
16
+ const ShareBookmarks_1 = __importDefault(require("./ShareBookmarks"));
17
+ const useStyles = (0, mui_1.makeStyles)()({
18
+ card: {
19
+ marginTop: 5,
50
20
  },
51
- }));
52
- const BookmarkGrid = (0, mobx_react_1.observer)(({ model }) => {
53
- const { classes } = useStyles();
54
- const [dialogRowNumber, setDialogRowNumber] = (0, react_1.useState)();
55
- const { bookmarkedRegions, selectedAssembly } = model;
56
- const session = (0, util_1.getSession)(model);
57
- const bookmarkRows = bookmarkedRegions
58
- .filter(r => selectedAssembly === 'all' || r.assemblyName === selectedAssembly)
59
- .map((region, index) => {
60
- const { assemblyName, ...rest } = region;
61
- return {
62
- ...region,
63
- id: index,
64
- delete: index,
65
- locString: (0, util_1.assembleLocString)(selectedAssembly === 'all' ? region : rest),
66
- };
67
- });
68
- return (react_1.default.createElement(react_1.default.Fragment, null,
69
- react_1.default.createElement(x_data_grid_1.DataGrid, { density: "compact", rows: bookmarkRows, columns: [
70
- {
71
- field: 'locString',
72
- headerName: 'bookmark link',
73
- width: (0, util_1.measureGridWidth)(bookmarkRows.map(row => row.locString)),
74
- renderCell: params => (react_1.default.createElement(material_1.Link, { className: classes.link, href: "#", onClick: async (event) => {
75
- event.preventDefault();
76
- await (0, utils_1.navToBookmark)(params.value, session.views, model);
77
- } }, params.value)),
78
- },
79
- {
80
- field: 'label',
81
- width: (0, util_1.measureGridWidth)(bookmarkRows.map(row => row.label)),
82
- editable: true,
83
- },
84
- {
85
- field: 'delete',
86
- width: 100,
87
- renderCell: params => (react_1.default.createElement(material_1.IconButton, { "data-testid": "deleteBookmark", "aria-label": "delete", onClick: () => {
88
- if (params.value != null) {
89
- setDialogRowNumber(+params.value);
90
- }
91
- } },
92
- react_1.default.createElement(Delete_1.default, null))),
93
- },
94
- ], processRowUpdate: row => {
95
- model.updateBookmarkLabel(row.id, row.label);
96
- return row;
97
- }, onProcessRowUpdateError: e => {
98
- session.notify(e.message, 'error');
99
- }, disableRowSelectionOnClick: true }),
100
- react_1.default.createElement(DeleteBookmark_1.default, { rowNumber: dialogRowNumber, model: model, onClose: () => setDialogRowNumber(undefined) })));
101
21
  });
102
- function GridBookmarkWidget({ model }) {
103
- const { selectedAssembly } = model;
22
+ const GridBookmarkWidget = (0, mobx_react_1.observer)(function GridBookmarkWidget({ model, }) {
104
23
  const { classes } = useStyles();
105
- return (react_1.default.createElement(react_1.default.Fragment, null,
24
+ if (!model) {
25
+ return null;
26
+ }
27
+ return (react_1.default.createElement("div", { className: classes.card },
28
+ react_1.default.createElement("div", null,
29
+ react_1.default.createElement(ExportBookmarks_1.default, { model: model }),
30
+ react_1.default.createElement(ImportBookmarks_1.default, { model: model }),
31
+ react_1.default.createElement(ShareBookmarks_1.default, { model: model }),
32
+ react_1.default.createElement(DeleteBookmarks_1.default, { model: model })),
33
+ react_1.default.createElement(material_1.Alert, { severity: "info" },
34
+ "Click and type within the ",
35
+ react_1.default.createElement("strong", null, "label"),
36
+ " field to annotate your bookmark. Double click the ",
37
+ react_1.default.createElement("strong", null, "label"),
38
+ " field to do so within a dialog."),
106
39
  react_1.default.createElement(AssemblySelector_1.default, { model: model }),
107
- react_1.default.createElement(DownloadBookmarks_1.default, { model: model }),
108
- react_1.default.createElement(ImportBookmarks_1.default, { model: model, assemblyName: selectedAssembly }),
109
- react_1.default.createElement(ClearBookmarks_1.default, { model: model }),
110
- react_1.default.createElement(material_1.Typography, { className: classes.margin },
111
- "Note: you can double click the ",
112
- react_1.default.createElement("code", null, "label"),
113
- " field to add your own custom notes"),
114
- react_1.default.createElement(BookmarkGrid, { model: model })));
115
- }
116
- exports.default = (0, mobx_react_1.observer)(GridBookmarkWidget);
40
+ react_1.default.createElement(BookmarkGrid_1.default, { model: model })));
41
+ });
42
+ exports.default = GridBookmarkWidget;