@jbrowse/plugin-grid-bookmark 2.6.2 → 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.
- package/dist/GridBookmarkWidget/components/AssemblySelector.d.ts +3 -4
- package/dist/GridBookmarkWidget/components/AssemblySelector.js +27 -37
- package/dist/GridBookmarkWidget/components/BookmarkGrid.d.ts +6 -0
- package/dist/GridBookmarkWidget/components/BookmarkGrid.js +120 -0
- package/dist/GridBookmarkWidget/components/{ClearBookmarks.d.ts → DeleteBookmarks.d.ts} +2 -3
- package/dist/GridBookmarkWidget/components/DeleteBookmarks.js +41 -0
- package/dist/GridBookmarkWidget/components/DeleteBookmarksDialog.d.ts +7 -0
- package/dist/GridBookmarkWidget/components/DeleteBookmarksDialog.js +29 -0
- package/dist/GridBookmarkWidget/components/EditBookmarkLabelDialog.d.ts +8 -0
- package/dist/GridBookmarkWidget/components/EditBookmarkLabelDialog.js +50 -0
- package/dist/GridBookmarkWidget/components/ExportBookmarks.d.ts +6 -0
- package/dist/GridBookmarkWidget/components/{ClearBookmarks.js → ExportBookmarks.js} +9 -19
- package/dist/GridBookmarkWidget/components/ExportBookmarksDialog.d.ts +7 -0
- package/dist/GridBookmarkWidget/components/{DownloadBookmarks.js → ExportBookmarksDialog.js} +22 -20
- package/dist/GridBookmarkWidget/components/GridBookmarkWidget.d.ts +3 -4
- package/dist/GridBookmarkWidget/components/GridBookmarkWidget.js +28 -97
- package/dist/GridBookmarkWidget/components/ImportBookmarks.d.ts +3 -5
- package/dist/GridBookmarkWidget/components/ImportBookmarks.js +8 -64
- package/dist/GridBookmarkWidget/components/ImportBookmarksDialog.d.ts +7 -0
- package/dist/GridBookmarkWidget/components/ImportBookmarksDialog.js +129 -0
- package/{esm/GridBookmarkWidget/components/ClearBookmarks.d.ts → dist/GridBookmarkWidget/components/ShareBookmarks.d.ts} +2 -3
- package/dist/GridBookmarkWidget/components/ShareBookmarks.js +37 -0
- package/dist/GridBookmarkWidget/components/ShareBookmarksDialog.d.ts +7 -0
- package/dist/GridBookmarkWidget/components/ShareBookmarksDialog.js +106 -0
- package/dist/GridBookmarkWidget/model.d.ts +178 -11
- package/dist/GridBookmarkWidget/model.js +105 -27
- package/dist/GridBookmarkWidget/sessionSharing.d.ts +6 -0
- package/dist/GridBookmarkWidget/sessionSharing.js +96 -0
- package/dist/GridBookmarkWidget/utils.d.ts +19 -3
- package/dist/GridBookmarkWidget/utils.js +132 -40
- package/dist/index.d.ts +1 -1
- package/dist/index.js +100 -75
- package/esm/GridBookmarkWidget/components/AssemblySelector.d.ts +3 -4
- package/esm/GridBookmarkWidget/components/AssemblySelector.js +28 -38
- package/esm/GridBookmarkWidget/components/BookmarkGrid.d.ts +6 -0
- package/esm/GridBookmarkWidget/components/BookmarkGrid.js +92 -0
- package/{dist/GridBookmarkWidget/components/DownloadBookmarks.d.ts → esm/GridBookmarkWidget/components/DeleteBookmarks.d.ts} +2 -3
- package/esm/GridBookmarkWidget/components/DeleteBookmarks.js +13 -0
- package/esm/GridBookmarkWidget/components/DeleteBookmarksDialog.d.ts +7 -0
- package/esm/GridBookmarkWidget/components/DeleteBookmarksDialog.js +24 -0
- package/esm/GridBookmarkWidget/components/EditBookmarkLabelDialog.d.ts +8 -0
- package/esm/GridBookmarkWidget/components/EditBookmarkLabelDialog.js +25 -0
- package/esm/GridBookmarkWidget/components/ExportBookmarks.d.ts +6 -0
- package/esm/GridBookmarkWidget/components/ExportBookmarks.js +13 -0
- package/esm/GridBookmarkWidget/components/ExportBookmarksDialog.d.ts +7 -0
- package/esm/GridBookmarkWidget/components/ExportBookmarksDialog.js +35 -0
- package/esm/GridBookmarkWidget/components/GridBookmarkWidget.d.ts +3 -4
- package/esm/GridBookmarkWidget/components/GridBookmarkWidget.js +28 -74
- package/esm/GridBookmarkWidget/components/ImportBookmarks.d.ts +3 -5
- package/esm/GridBookmarkWidget/components/ImportBookmarks.js +10 -66
- package/esm/GridBookmarkWidget/components/ImportBookmarksDialog.d.ts +7 -0
- package/esm/GridBookmarkWidget/components/ImportBookmarksDialog.js +101 -0
- package/esm/GridBookmarkWidget/components/{DownloadBookmarks.d.ts → ShareBookmarks.d.ts} +2 -3
- package/esm/GridBookmarkWidget/components/ShareBookmarks.js +12 -0
- package/esm/GridBookmarkWidget/components/ShareBookmarksDialog.d.ts +7 -0
- package/esm/GridBookmarkWidget/components/ShareBookmarksDialog.js +78 -0
- package/esm/GridBookmarkWidget/model.d.ts +178 -11
- package/esm/GridBookmarkWidget/model.js +106 -28
- package/esm/GridBookmarkWidget/sessionSharing.d.ts +6 -0
- package/esm/GridBookmarkWidget/sessionSharing.js +68 -0
- package/esm/GridBookmarkWidget/utils.d.ts +19 -3
- package/esm/GridBookmarkWidget/utils.js +105 -39
- package/esm/index.d.ts +1 -1
- package/esm/index.js +101 -76
- package/package.json +4 -3
- package/dist/GridBookmarkWidget/components/DeleteBookmark.d.ts +0 -9
- package/dist/GridBookmarkWidget/components/DeleteBookmark.js +0 -31
- package/esm/GridBookmarkWidget/components/ClearBookmarks.js +0 -23
- package/esm/GridBookmarkWidget/components/DeleteBookmark.d.ts +0 -9
- package/esm/GridBookmarkWidget/components/DeleteBookmark.js +0 -26
- 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
|
|
3
|
+
declare const ImportBookmarks: ({ model, }: {
|
|
4
4
|
model: GridBookmarkModel;
|
|
5
|
-
|
|
6
|
-
|
|
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
|
|
41
|
-
|
|
42
|
-
|
|
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: () =>
|
|
58
|
-
react_1.default.createElement(
|
|
59
|
-
react_1.default.createElement(
|
|
60
|
-
|
|
61
|
-
|
|
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,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
|
|
3
|
+
declare function ShareBookmarks({ model }: {
|
|
4
4
|
model: GridBookmarkModel;
|
|
5
5
|
}): React.JSX.Element;
|
|
6
|
-
|
|
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,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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
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
|
-
|
|
29
|
-
setSelectedAssembly(assembly: string): void;
|
|
193
|
+
clearSelectedBookmarks(): void;
|
|
30
194
|
} & {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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 {};
|