@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,8 +1,6 @@
1
1
  import React from 'react';
2
2
  import { GridBookmarkModel } from '../model';
3
- declare function ImportBookmarks({ model, assemblyName, }: {
3
+ declare const ImportBookmarks: ({ model, }: {
4
4
  model: GridBookmarkModel;
5
- assemblyName: string;
6
- }): React.JSX.Element;
7
- declare const _default: typeof ImportBookmarks;
8
- export default _default;
5
+ }) => React.JSX.Element;
6
+ export default ImportBookmarks;
@@ -28,71 +28,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  const react_1 = __importStar(require("react"));
30
30
  const mobx_react_1 = require("mobx-react");
31
- const util_1 = require("@jbrowse/core/util");
32
- const AssemblySelector_1 = __importDefault(require("@jbrowse/core/ui/AssemblySelector"));
33
- const ui_1 = require("@jbrowse/core/ui");
34
- const io_1 = require("@jbrowse/core/util/io");
35
31
  const material_1 = require("@mui/material");
36
- const ui_2 = require("@jbrowse/core/ui");
37
- const mui_1 = require("tss-react/mui");
38
32
  // icons
39
33
  const Publish_1 = __importDefault(require("@mui/icons-material/Publish"));
40
- const useStyles = (0, mui_1.makeStyles)()(() => ({
41
- dialogContainer: {
42
- margin: 15,
43
- },
44
- flexItem: {
45
- margin: 5,
46
- },
47
- }));
48
- function ImportBookmarks({ model, assemblyName, }) {
49
- const { classes } = useStyles();
50
- const session = (0, util_1.getSession)(model);
51
- const { assemblyNames } = session;
52
- const [dialogOpen, setDialogOpen] = (0, react_1.useState)(false);
53
- const [location, setLocation] = (0, react_1.useState)();
54
- const [error, setError] = (0, react_1.useState)();
55
- const [selectedAsm, setSelectedAsm] = (0, react_1.useState)(assemblyName || assemblyNames[0]);
34
+ const ImportBookmarksDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./ImportBookmarksDialog'))));
35
+ const ImportBookmarks = (0, mobx_react_1.observer)(function ({ model, }) {
36
+ const [open, setOpen] = (0, react_1.useState)(false);
56
37
  return (react_1.default.createElement(react_1.default.Fragment, null,
57
- react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(Publish_1.default, null), onClick: () => setDialogOpen(true) }, "Import"),
58
- react_1.default.createElement(ui_2.Dialog, { open: dialogOpen, onClose: () => setDialogOpen(false), maxWidth: "xl", title: "Import bookmarks" },
59
- react_1.default.createElement(material_1.DialogContent, null,
60
- react_1.default.createElement(material_1.Typography, null, "Choose a BED format file to import. The first 4 columns will be used"),
61
- react_1.default.createElement(ui_1.FileSelector, { location: location, setLocation: setLocation, name: "File" }),
62
- react_1.default.createElement(material_1.Typography, null, "Select assembly that your data belongs to"),
63
- react_1.default.createElement(AssemblySelector_1.default, { onChange: val => setSelectedAsm(val), session: session, selected: selectedAsm }),
64
- error ? (react_1.default.createElement(material_1.Typography, { color: "error", variant: "h6" }, `${error}`)) : null),
65
- react_1.default.createElement(material_1.DialogActions, null,
66
- react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => setDialogOpen(false) }, "Cancel"),
67
- react_1.default.createElement(material_1.Button, { className: classes.flexItem, "data-testid": "dialogImport", variant: "contained", color: "primary", disabled: !location, startIcon: react_1.default.createElement(Publish_1.default, null), onClick: async () => {
68
- try {
69
- if (!location) {
70
- return;
71
- }
72
- const data = await (0, io_1.openLocation)(location).readFile('utf8');
73
- const regions = data
74
- .split(/\n|\r\n|\r/)
75
- .filter(f => !!f.trim())
76
- .filter(f => !f.startsWith('#') &&
77
- !f.startsWith('track') &&
78
- !f.startsWith('browser'))
79
- .map(line => {
80
- const [refName, start, end, name] = line.split('\t');
81
- return {
82
- assemblyName: selectedAsm,
83
- refName,
84
- start: +start,
85
- end: +end,
86
- label: name === '.' ? undefined : name,
87
- };
88
- });
89
- model.importBookmarks(regions);
90
- setDialogOpen(false);
91
- }
92
- catch (e) {
93
- console.error(e);
94
- setError(e);
95
- }
96
- } }, "Import")))));
97
- }
98
- exports.default = (0, mobx_react_1.observer)(ImportBookmarks);
38
+ react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(Publish_1.default, null), onClick: () => setOpen(true) }, "Import"),
39
+ open ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(react_1.default.Fragment, null) },
40
+ react_1.default.createElement(ImportBookmarksDialog, { onClose: () => setOpen(false), model: model }))) : null));
41
+ });
42
+ exports.default = ImportBookmarks;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { GridBookmarkModel } from '../model';
3
+ declare const ImportBookmarksDialog: ({ onClose, model, }: {
4
+ onClose: () => void;
5
+ model: GridBookmarkModel;
6
+ }) => React.JSX.Element;
7
+ export default ImportBookmarksDialog;
@@ -0,0 +1,129 @@
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 util_1 = require("@jbrowse/core/util");
32
+ const types_1 = require("@jbrowse/core/util/types");
33
+ const ui_1 = require("@jbrowse/core/ui");
34
+ const material_1 = require("@mui/material");
35
+ const io_1 = require("@jbrowse/core/util/io");
36
+ const ui_2 = require("@jbrowse/core/ui");
37
+ const AssemblySelector_1 = __importDefault(require("@jbrowse/core/ui/AssemblySelector"));
38
+ const mui_1 = require("tss-react/mui");
39
+ // icons
40
+ const Publish_1 = __importDefault(require("@mui/icons-material/Publish"));
41
+ const ExpandMore_1 = __importDefault(require("@mui/icons-material/ExpandMore"));
42
+ const Help_1 = __importDefault(require("@mui/icons-material/Help"));
43
+ const utils_1 = require("../utils");
44
+ const sessionSharing_1 = require("../sessionSharing");
45
+ const useStyles = (0, mui_1.makeStyles)()(theme => {
46
+ var _a;
47
+ return ({
48
+ flexItem: {
49
+ margin: 5,
50
+ },
51
+ expandIcon: {
52
+ color: ((_a = theme.palette.tertiary) === null || _a === void 0 ? void 0 : _a.contrastText) || '#fff',
53
+ },
54
+ });
55
+ });
56
+ async function getBookmarksFromShareLink(shareLink, shareURL) {
57
+ const defaultURL = 'https://share.jbrowse.org/api/v1/';
58
+ const urlParams = new URL(shareLink);
59
+ const sessionQueryParam = urlParams.searchParams.get('bookmarks');
60
+ const password = urlParams.searchParams.get('password');
61
+ const decryptedSession = await (0, sessionSharing_1.readSessionFromDynamo)(`${shareURL !== null && shareURL !== void 0 ? shareURL : defaultURL}load`, sessionQueryParam || '', password || '');
62
+ const sharedSession = JSON.parse(await (0, utils_1.fromUrlSafeB64)(decryptedSession));
63
+ return sharedSession.sharedBookmarks;
64
+ }
65
+ async function getBookmarksFromFile(location, selectedAsm) {
66
+ const data = await (0, io_1.openLocation)(location).readFile('utf8');
67
+ return data
68
+ .split(/\n|\r\n|\r/)
69
+ .filter(f => !!f.trim())
70
+ .filter(f => !f.startsWith('#') &&
71
+ !f.startsWith('track') &&
72
+ !f.startsWith('browser'))
73
+ .map(line => {
74
+ const [refName, start, end, label, assembly] = line.split('\t');
75
+ return {
76
+ assemblyName: assembly !== null && assembly !== void 0 ? assembly : selectedAsm,
77
+ refName,
78
+ start: +start,
79
+ end: +end,
80
+ label: label === '.' ? undefined : label,
81
+ };
82
+ });
83
+ }
84
+ const ImportBookmarksDialog = (0, mobx_react_1.observer)(function ({ onClose, model, }) {
85
+ const { classes } = useStyles();
86
+ const [location, setLocation] = (0, react_1.useState)();
87
+ const [error, setError] = (0, react_1.useState)();
88
+ const [shareLink, setShareLink] = (0, react_1.useState)('');
89
+ const session = (0, util_1.getSession)(model);
90
+ const { assemblyNames } = session;
91
+ const [selectedAsm, setSelectedAsm] = (0, react_1.useState)(assemblyNames[0]);
92
+ const [expanded, setExpanded] = (0, react_1.useState)('shareLinkAccordion');
93
+ return (react_1.default.createElement(ui_2.Dialog, { open: true, onClose: onClose, maxWidth: "xl", title: "Import bookmarks" },
94
+ react_1.default.createElement(material_1.DialogContent, null,
95
+ react_1.default.createElement(material_1.Accordion, { expanded: expanded === 'shareLinkAccordion', onChange: () => setExpanded('shareLinkAccordion') },
96
+ react_1.default.createElement(material_1.AccordionSummary, { expandIcon: react_1.default.createElement(ExpandMore_1.default, { className: classes.expandIcon }) },
97
+ react_1.default.createElement(material_1.Typography, { style: { display: 'flex', alignItems: 'center', gap: '5px' } },
98
+ "Import from share link",
99
+ ' ',
100
+ react_1.default.createElement(material_1.Tooltip, { title: "The appropriate share link for sharing bookmarks is one generated via the 'Share' button in the 'Bookmarked regions' drawer. Paste it below to import shared bookmarks." },
101
+ react_1.default.createElement(Help_1.default, null)))),
102
+ react_1.default.createElement(material_1.AccordionDetails, null,
103
+ react_1.default.createElement(material_1.TextField, { label: "Enter URL", variant: "outlined", style: { width: '100%' }, value: shareLink, onChange: e => setShareLink(e.target.value) }))),
104
+ react_1.default.createElement(material_1.Accordion, { expanded: expanded === 'fileAccordion', onChange: () => setExpanded('fileAccordion') },
105
+ react_1.default.createElement(material_1.AccordionSummary, { expandIcon: react_1.default.createElement(ExpandMore_1.default, { className: classes.expandIcon }) },
106
+ react_1.default.createElement(material_1.Typography, null, "Import from file")),
107
+ react_1.default.createElement(material_1.AccordionDetails, null,
108
+ react_1.default.createElement(ui_1.FileSelector, { location: location, setLocation: setLocation, name: "File", description: "Choose a BED or TSV format file to import." }),
109
+ react_1.default.createElement(AssemblySelector_1.default, { onChange: val => setSelectedAsm(val), helperText: `Select the assembly your bookmarks belong to (BED or TSV without assembly column).`, session: session, selected: selectedAsm }))),
110
+ error ? (react_1.default.createElement(material_1.Typography, { color: "error", variant: "h6" }, `${error}`)) : null),
111
+ react_1.default.createElement(material_1.DialogActions, null,
112
+ react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: onClose }, "Cancel"),
113
+ react_1.default.createElement(material_1.Button, { className: classes.flexItem, "data-testid": "dialogImport", variant: "contained", color: "primary", disabled: !location && !shareLink, startIcon: react_1.default.createElement(Publish_1.default, null), onClick: async () => {
114
+ try {
115
+ if (location) {
116
+ model.importBookmarks(await getBookmarksFromFile(location, selectedAsm));
117
+ }
118
+ else if (shareLink && (0, types_1.isSessionWithShareURL)(session)) {
119
+ model.importBookmarks(await getBookmarksFromShareLink(shareLink, session.shareURL));
120
+ }
121
+ onClose();
122
+ }
123
+ catch (e) {
124
+ console.error(e);
125
+ setError(e);
126
+ }
127
+ } }, "Import"))));
128
+ });
129
+ exports.default = ImportBookmarksDialog;
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { GridBookmarkModel } from '../model';
3
- declare function ClearBookmarks({ model }: {
3
+ declare function ShareBookmarks({ model }: {
4
4
  model: GridBookmarkModel;
5
5
  }): React.JSX.Element;
6
- declare const _default: typeof ClearBookmarks;
7
- export default _default;
6
+ export default ShareBookmarks;
@@ -0,0 +1,37 @@
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 Icons_1 = require("@jbrowse/core/ui/Icons");
29
+ const ShareBookmarksDialog = (0, react_1.lazy)(() => Promise.resolve().then(() => __importStar(require('./ShareBookmarksDialog'))));
30
+ function ShareBookmarks({ model }) {
31
+ const [open, setOpen] = (0, react_1.useState)(false);
32
+ return (react_1.default.createElement(react_1.default.Fragment, null,
33
+ react_1.default.createElement(material_1.Button, { startIcon: react_1.default.createElement(Icons_1.ContentCopy, null), onClick: () => setOpen(true) }, "Share"),
34
+ open ? (react_1.default.createElement(react_1.Suspense, { fallback: react_1.default.createElement(react_1.default.Fragment, null) },
35
+ react_1.default.createElement(ShareBookmarksDialog, { onClose: () => setOpen(false), model: model }))) : null));
36
+ }
37
+ exports.default = ShareBookmarks;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { GridBookmarkModel } from '../model';
3
+ declare const ShareBookmarksDialog: ({ onClose, model, }: {
4
+ onClose: () => void;
5
+ model: GridBookmarkModel;
6
+ }) => React.JSX.Element;
7
+ export default ShareBookmarksDialog;
@@ -0,0 +1,106 @@
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 mobx_state_tree_1 = require("mobx-state-tree");
32
+ const material_1 = require("@mui/material");
33
+ const mui_1 = require("tss-react/mui");
34
+ const copy_to_clipboard_1 = __importDefault(require("copy-to-clipboard"));
35
+ const util_1 = require("@jbrowse/core/util");
36
+ const ui_1 = require("@jbrowse/core/ui");
37
+ const Icons_1 = require("@jbrowse/core/ui/Icons");
38
+ // locals
39
+ const sessionSharing_1 = require("../sessionSharing");
40
+ const useStyles = (0, mui_1.makeStyles)()(() => ({
41
+ flexItem: {
42
+ margin: 5,
43
+ },
44
+ }));
45
+ const ShareBookmarksDialog = (0, mobx_react_1.observer)(function ({ onClose, model, }) {
46
+ const { classes } = useStyles();
47
+ const [url, setUrl] = (0, react_1.useState)('');
48
+ const [error, setError] = (0, react_1.useState)();
49
+ const [loading, setLoading] = (0, react_1.useState)(true);
50
+ const session = (0, util_1.getSession)(model);
51
+ const { selectedBookmarks } = model;
52
+ const shareAll = selectedBookmarks.length === 0;
53
+ const bookmarksToShare = selectedBookmarks.length === 0
54
+ ? model.allBookmarksModel
55
+ : model.sharedBookmarksModel;
56
+ (0, react_1.useEffect)(() => {
57
+ let cancelled = false;
58
+ (async () => {
59
+ try {
60
+ if (!(0, util_1.isSessionWithShareURL)(session)) {
61
+ throw new Error('No shareURL configured');
62
+ }
63
+ setLoading(true);
64
+ const snap = (0, mobx_state_tree_1.getSnapshot)(bookmarksToShare);
65
+ const locationUrl = new URL(window.location.href);
66
+ const result = await (0, sessionSharing_1.shareSessionToDynamo)(snap, session.shareURL, locationUrl.href);
67
+ if (!cancelled) {
68
+ const params = new URLSearchParams(locationUrl.search);
69
+ params.set('bookmarks', `share-${result.json.sessionId}`);
70
+ params.set('password', result.password);
71
+ locationUrl.search = params.toString();
72
+ setUrl(locationUrl.href);
73
+ setLoading(false);
74
+ }
75
+ }
76
+ catch (e) {
77
+ setError(e);
78
+ }
79
+ finally {
80
+ setLoading(false);
81
+ }
82
+ })();
83
+ return () => {
84
+ cancelled = true;
85
+ };
86
+ }, [bookmarksToShare, session]);
87
+ return (react_1.default.createElement(ui_1.Dialog, { open: true, onClose: onClose, title: "Share bookmarks" },
88
+ react_1.default.createElement(material_1.DialogContent, { style: { display: 'flex', flexFlow: 'column', gap: '5px' } },
89
+ react_1.default.createElement(material_1.Alert, { severity: "info" }, shareAll ? (react_1.default.createElement(react_1.default.Fragment, null,
90
+ react_1.default.createElement("span", null, "All bookmarks will be shared."),
91
+ react_1.default.createElement("br", null),
92
+ react_1.default.createElement("span", null, "Use the checkboxes to select individual bookmarks to share."))) : ('Only selected bookmarks will be shared.')),
93
+ react_1.default.createElement(material_1.DialogContentText, null, "Copy the URL below to share your bookmarks."),
94
+ error ? (react_1.default.createElement(ui_1.ErrorMessage, { error: error })) : loading ? (react_1.default.createElement(material_1.Typography, null, "Generating short URL...")) : (react_1.default.createElement(material_1.TextField, { label: "URL", value: url, InputProps: { readOnly: true }, variant: "filled", fullWidth: true, onClick: event => {
95
+ const target = event.target;
96
+ target.select();
97
+ } })),
98
+ react_1.default.createElement(material_1.DialogContentText, null, "The URL should be pasted into the \"Import from share link\" field in the \"Import\" form found in the \"Bookmarked regions\" drawer.")),
99
+ react_1.default.createElement(material_1.DialogActions, null,
100
+ react_1.default.createElement(material_1.Button, { className: classes.flexItem, "data-testid": "dialogShare", variant: "contained", color: "primary", disabled: loading, startIcon: react_1.default.createElement(Icons_1.ContentCopy, null), onClick: async () => {
101
+ (0, copy_to_clipboard_1.default)(url);
102
+ session.notify('Copied to clipboard', 'success');
103
+ onClose();
104
+ } }, "Copy share link"))));
105
+ });
106
+ exports.default = ShareBookmarksDialog;
@@ -1,11 +1,48 @@
1
- import { Instance } from 'mobx-state-tree';
1
+ import { Instance, SnapshotIn, IMSTArray } from 'mobx-state-tree';
2
2
  import PluginManager from '@jbrowse/core/PluginManager';
3
3
  import { Region } from '@jbrowse/core/util/types';
4
- export default function f(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
4
+ declare const LabeledRegionModel: import("mobx-state-tree").IModelType<{
5
+ refName: import("mobx-state-tree").ISimpleType<string>;
6
+ start: import("mobx-state-tree").ISimpleType<number>;
7
+ end: import("mobx-state-tree").ISimpleType<number>;
8
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
9
+ } & {
10
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
11
+ } & {
12
+ label: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
13
+ }, {
14
+ setRefName(newRefName: string): void;
15
+ } & {
16
+ setLabel(label: string): void;
17
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
18
+ export interface ILabeledRegionModel extends SnapshotIn<typeof LabeledRegionModel> {
19
+ refName: string;
20
+ start: number;
21
+ end: number;
22
+ reversed: boolean;
23
+ assemblyName: string;
24
+ label: string;
25
+ setRefName: (newRefName: string) => void;
26
+ setLabel: (label: string) => void;
27
+ }
28
+ export interface IExtendedLabeledRegionModel extends ILabeledRegionModel {
29
+ id: number;
30
+ correspondingObj: ILabeledRegionModel;
31
+ }
32
+ export default function f(_pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
33
+ /**
34
+ * #property
35
+ */
5
36
  id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
37
+ /**
38
+ * #property
39
+ */
6
40
  type: import("mobx-state-tree").ISimpleType<"GridBookmarkWidget">;
7
- view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
8
- bookmarkedRegions: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
41
+ /**
42
+ * #property
43
+ * removed by postProcessSnapshot, only loaded from localStorage
44
+ */
45
+ bookmarks: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
9
46
  refName: import("mobx-state-tree").ISimpleType<string>;
10
47
  start: import("mobx-state-tree").ISimpleType<number>;
11
48
  end: import("mobx-state-tree").ISimpleType<number>;
@@ -18,18 +55,148 @@ export default function f(pluginManager: PluginManager): import("mobx-state-tree
18
55
  setRefName(newRefName: string): void;
19
56
  } & {
20
57
  setLabel(label: string): void;
21
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
22
- modelSelectedAssembly: import("mobx-state-tree").IType<string | undefined, string, string>;
58
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>, [undefined]>;
23
59
  }, {
60
+ selectedBookmarks: IExtendedLabeledRegionModel[];
61
+ selectedAssembliesPre: string[] | undefined;
62
+ } & {
63
+ readonly bookmarkAssemblies: string[];
64
+ readonly validAssemblies: Set<string>;
65
+ } & {
66
+ readonly bookmarksWithValidAssemblies: ({
67
+ refName: string;
68
+ start: number;
69
+ end: number;
70
+ reversed: boolean;
71
+ assemblyName: string;
72
+ label: string;
73
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & {
74
+ setRefName(newRefName: string): void;
75
+ } & {
76
+ setLabel(label: string): void;
77
+ } & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
78
+ refName: import("mobx-state-tree").ISimpleType<string>;
79
+ start: import("mobx-state-tree").ISimpleType<number>;
80
+ end: import("mobx-state-tree").ISimpleType<number>;
81
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
82
+ } & {
83
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
84
+ } & {
85
+ label: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
86
+ }, {
87
+ setRefName(newRefName: string): void;
88
+ } & {
89
+ setLabel(label: string): void;
90
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>)[];
91
+ } & {
92
+ readonly sharedBookmarksModel: {
93
+ sharedBookmarks: (IMSTArray<import("mobx-state-tree").IModelType<{
94
+ refName: import("mobx-state-tree").ISimpleType<string>;
95
+ start: import("mobx-state-tree").ISimpleType<number>;
96
+ end: import("mobx-state-tree").ISimpleType<number>;
97
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
98
+ } & {
99
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
100
+ } & {
101
+ label: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
102
+ }, {
103
+ setRefName(newRefName: string): void;
104
+ } & {
105
+ setLabel(label: string): void;
106
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IMaybe<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
107
+ refName: import("mobx-state-tree").ISimpleType<string>;
108
+ start: import("mobx-state-tree").ISimpleType<number>;
109
+ end: import("mobx-state-tree").ISimpleType<number>;
110
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
111
+ } & {
112
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
113
+ } & {
114
+ label: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
115
+ }, {
116
+ setRefName(newRefName: string): void;
117
+ } & {
118
+ setLabel(label: string): void;
119
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>>>) | undefined;
120
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
121
+ sharedBookmarks: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
122
+ refName: import("mobx-state-tree").ISimpleType<string>;
123
+ start: import("mobx-state-tree").ISimpleType<number>;
124
+ end: import("mobx-state-tree").ISimpleType<number>;
125
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
126
+ } & {
127
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
128
+ } & {
129
+ label: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
130
+ }, {
131
+ setRefName(newRefName: string): void;
132
+ } & {
133
+ setLabel(label: string): void;
134
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>>;
135
+ }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
136
+ readonly allBookmarksModel: {
137
+ sharedBookmarks: (IMSTArray<import("mobx-state-tree").IModelType<{
138
+ refName: import("mobx-state-tree").ISimpleType<string>;
139
+ start: import("mobx-state-tree").ISimpleType<number>;
140
+ end: import("mobx-state-tree").ISimpleType<number>;
141
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
142
+ } & {
143
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
144
+ } & {
145
+ label: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
146
+ }, {
147
+ setRefName(newRefName: string): void;
148
+ } & {
149
+ setLabel(label: string): void;
150
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>> & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IMaybe<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
151
+ refName: import("mobx-state-tree").ISimpleType<string>;
152
+ start: import("mobx-state-tree").ISimpleType<number>;
153
+ end: import("mobx-state-tree").ISimpleType<number>;
154
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
155
+ } & {
156
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
157
+ } & {
158
+ label: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
159
+ }, {
160
+ setRefName(newRefName: string): void;
161
+ } & {
162
+ setLabel(label: string): void;
163
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>>>) | undefined;
164
+ } & import("mobx-state-tree/dist/internal").NonEmptyObject & import("mobx-state-tree").IStateTreeNode<import("mobx-state-tree").IModelType<{
165
+ sharedBookmarks: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IArrayType<import("mobx-state-tree").IModelType<{
166
+ refName: import("mobx-state-tree").ISimpleType<string>;
167
+ start: import("mobx-state-tree").ISimpleType<number>;
168
+ end: import("mobx-state-tree").ISimpleType<number>;
169
+ reversed: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<boolean>, [undefined]>;
170
+ } & {
171
+ assemblyName: import("mobx-state-tree").ISimpleType<string>;
172
+ } & {
173
+ label: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
174
+ }, {
175
+ setRefName(newRefName: string): void;
176
+ } & {
177
+ setLabel(label: string): void;
178
+ }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>>;
179
+ }, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
180
+ } & {
181
+ setSelectedAssemblies(assemblies?: string[]): void;
182
+ } & {
183
+ readonly selectedAssemblies: string[];
184
+ } & {
24
185
  importBookmarks(regions: Region[]): void;
25
186
  addBookmark(region: Region): void;
26
187
  removeBookmark(index: number): void;
188
+ updateBookmarkLabel(bookmark: IExtendedLabeledRegionModel, label: string): void;
189
+ setSelectedBookmarks(bookmarks: IExtendedLabeledRegionModel[]): void;
190
+ setBookmarkedRegions(regions: IMSTArray<typeof LabeledRegionModel>): void;
191
+ } & {
27
192
  clearAllBookmarks(): void;
28
- updateBookmarkLabel(index: number, label: string): void;
29
- setSelectedAssembly(assembly: string): void;
193
+ clearSelectedBookmarks(): void;
30
194
  } & {
31
- readonly selectedAssembly: string;
32
- readonly assemblies: string[];
33
- }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
195
+ afterAttach(): void;
196
+ }, import("mobx-state-tree")._NotCustomized, {
197
+ type: "GridBookmarkWidget";
198
+ id: string;
199
+ }>;
34
200
  export type GridBookmarkStateModel = ReturnType<typeof f>;
35
201
  export type GridBookmarkModel = Instance<GridBookmarkStateModel>;
202
+ export {};