@haniffalab/cherita-react 0.2.0-dev.2024-09-26.f9979478 → 0.2.0-dev.2024-09-26.d9293c4c
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/App.scss +77 -8
- package/dist/components/Offcanvas/index.js +6 -2
- package/dist/components/dotplot/Dotplot.js +11 -0
- package/dist/components/heatmap/Heatmap.js +11 -0
- package/dist/components/matrixplot/Matrixplot.js +11 -0
- package/dist/components/obs-list/ObsItem.js +394 -0
- package/dist/components/obs-list/ObsList.js +116 -299
- package/dist/components/obs-list/ObsToolbar.js +76 -0
- package/dist/components/scatterplot/Legend.js +4 -3
- package/dist/components/scatterplot/Scatterplot.js +99 -39
- package/dist/components/scatterplot/Toolbox.js +3 -2
- package/dist/components/var-list/VarItem.js +313 -0
- package/dist/components/var-list/VarList.js +50 -148
- package/dist/components/violin/Violin.js +18 -1
- package/dist/constants/constants.js +2 -1
- package/dist/context/DatasetContext.js +10 -2
- package/dist/context/FilterContext.js +76 -0
- package/dist/helpers/map-helper.js +20 -15
- package/dist/index.js +7 -0
- package/dist/utils/VirtualizedList.js +69 -0
- package/dist/utils/requests.js +2 -2
- package/dist/utils/string.js +18 -0
- package/package.json +3 -2
- package/dist/components/obs-list/ObsValueList.js +0 -101
|
@@ -5,10 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.VarNamesList = VarNamesList;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
-
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
9
|
-
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
10
8
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
11
9
|
var _reactBootstrap = require("react-bootstrap");
|
|
10
|
+
var _VarItem = require("./VarItem");
|
|
12
11
|
var _constants = require("../../constants/constants");
|
|
13
12
|
var _DatasetContext = require("../../context/DatasetContext");
|
|
14
13
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
@@ -23,7 +22,7 @@ function VarNamesList(_ref) {
|
|
|
23
22
|
} = _ref;
|
|
24
23
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
25
24
|
const dispatch = (0, _DatasetContext.useDatasetDispatch)();
|
|
26
|
-
const [varButtons, setVarButtons] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? [dataset.selectedVar] : dataset.selectedMultiVar);
|
|
25
|
+
const [varButtons, setVarButtons] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? dataset.selectedVar ? [dataset.selectedVar] : [] : dataset.selectedMultiVar);
|
|
27
26
|
const [active, setActive] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? (_dataset$selectedVar = dataset.selectedVar) === null || _dataset$selectedVar === void 0 ? void 0 : _dataset$selectedVar.matrix_index : dataset.selectedMultiVar.map(i => i.matrix_index));
|
|
28
27
|
(0, _react.useEffect)(() => {
|
|
29
28
|
if (mode === _constants.SELECTION_MODES.SINGLE) {
|
|
@@ -50,167 +49,70 @@ function VarNamesList(_ref) {
|
|
|
50
49
|
setActive(dataset.selectedMultiVar.map(i => i.matrix_index));
|
|
51
50
|
}
|
|
52
51
|
}, [mode, dataset.selectedMultiVar]);
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
})
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
setVarButtons(b => {
|
|
72
|
-
return b.filter(i => i.name !== v.name);
|
|
73
|
-
});
|
|
74
|
-
if (mode === _constants.SELECTION_MODES.SINGLE) {
|
|
75
|
-
if (active === v.matrix_index) {
|
|
76
|
-
dispatch({
|
|
77
|
-
type: "deselect.var"
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
} else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
|
|
81
|
-
if (active.includes(v.matrix_index)) {
|
|
82
|
-
dispatch({
|
|
83
|
-
type: "deselect.multivar",
|
|
84
|
-
var: v
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}, [active, dispatch, mode]);
|
|
89
|
-
const makeList = (0, _react.useCallback)(vars => {
|
|
90
|
-
return vars.map(item => {
|
|
91
|
-
if (item && mode === _constants.SELECTION_MODES.SINGLE) {
|
|
92
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
|
|
93
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
94
|
-
className: "d-flex gap-1",
|
|
95
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
96
|
-
className: "flex-grow-1",
|
|
97
|
-
children: item.name
|
|
98
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
99
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
|
|
100
|
-
icon: _freeSolidSvgIcons.faCircleInfo
|
|
101
|
-
})
|
|
102
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
103
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
104
|
-
type: "button",
|
|
105
|
-
variant: dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR && active === item.matrix_index ? "primary" : "outline-primary",
|
|
106
|
-
className: "m-0 p-0 px-1",
|
|
107
|
-
onClick: () => {
|
|
108
|
-
selectVar(item);
|
|
109
|
-
},
|
|
110
|
-
disabled: item.matrix_index === -1,
|
|
111
|
-
title: item.matrix_index === -1 ? "Not present in data" : "Set as color encoding",
|
|
112
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
|
|
113
|
-
icon: _freeSolidSvgIcons.faDroplet
|
|
114
|
-
})
|
|
115
|
-
}, item.matrix_index)
|
|
116
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
117
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
118
|
-
type: "button",
|
|
119
|
-
className: "m-0 p-0 px-1",
|
|
120
|
-
variant: "outline-secondary",
|
|
121
|
-
title: "Remove from list",
|
|
122
|
-
onClick: () => removeVar(item),
|
|
123
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
|
|
124
|
-
icon: _freeSolidSvgIcons.faTrash
|
|
125
|
-
})
|
|
126
|
-
})
|
|
127
|
-
})]
|
|
128
|
-
})
|
|
129
|
-
}, item.name);
|
|
130
|
-
} else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
|
|
131
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
|
|
132
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
133
|
-
className: "d-flex",
|
|
134
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
135
|
-
className: "flex-grow-1",
|
|
136
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
137
|
-
type: "button",
|
|
138
|
-
variant: item.matrix_index !== -1 && _lodash.default.includes(active, item.matrix_index) ? "primary" : "outline-primary",
|
|
139
|
-
className: "m-0 p-0 px-1",
|
|
140
|
-
onClick: () => {
|
|
141
|
-
if (active.includes(item.matrix_index)) {
|
|
142
|
-
dispatch({
|
|
143
|
-
type: "deselect.multivar",
|
|
144
|
-
var: item
|
|
145
|
-
});
|
|
146
|
-
} else {
|
|
147
|
-
selectVar(item);
|
|
148
|
-
}
|
|
149
|
-
},
|
|
150
|
-
disabled: item.matrix_index === -1,
|
|
151
|
-
title: item.matrix_index === -1 ? "Not present in data" : "",
|
|
152
|
-
children: item.name
|
|
153
|
-
}, item.matrix_index)
|
|
154
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
155
|
-
children: [" ", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
|
|
156
|
-
icon: _freeSolidSvgIcons.faPlus
|
|
157
|
-
})]
|
|
158
|
-
})]
|
|
159
|
-
})
|
|
160
|
-
}, item.name);
|
|
161
|
-
} else {
|
|
162
|
-
return null;
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
}, [active, dataset.colorEncoding, dispatch, mode, removeVar, selectVar]);
|
|
166
|
-
const varList = (0, _react.useMemo)(() => {
|
|
167
|
-
return makeList(varButtons);
|
|
168
|
-
}, [makeList, varButtons]);
|
|
169
|
-
const diseaseVarList = (0, _react.useMemo)(() => {
|
|
170
|
-
return makeList(dataset.selectedDisease.genes);
|
|
171
|
-
}, [makeList, dataset.selectedDisease.genes]);
|
|
52
|
+
const makeListItem = function (item) {
|
|
53
|
+
let isDiseaseGene = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
54
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
|
|
55
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VarItem.VarItem, {
|
|
56
|
+
item: item,
|
|
57
|
+
active: active,
|
|
58
|
+
setVarButtons: setVarButtons,
|
|
59
|
+
mode: mode,
|
|
60
|
+
isDiseaseGene: isDiseaseGene
|
|
61
|
+
})
|
|
62
|
+
}, item.matrix_index);
|
|
63
|
+
};
|
|
64
|
+
const varList = _lodash.default.map(varButtons, item => {
|
|
65
|
+
return makeListItem(item);
|
|
66
|
+
});
|
|
67
|
+
const diseaseVarList = _lodash.default.map(dataset.selectedDisease.genes, item => {
|
|
68
|
+
return makeListItem(item, true);
|
|
69
|
+
});
|
|
172
70
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
173
71
|
className: "position-relative",
|
|
174
72
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
175
|
-
className: "overflow-auto mt-
|
|
73
|
+
className: "overflow-auto mt-3",
|
|
176
74
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
75
|
+
className: "d-flex justify-content-between",
|
|
76
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
|
|
77
|
+
children: _lodash.default.capitalize(displayName)
|
|
78
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
79
|
+
variant: "link",
|
|
80
|
+
onClick: () => {
|
|
81
|
+
setVarButtons([]);
|
|
82
|
+
dispatch({
|
|
83
|
+
type: mode === _constants.SELECTION_MODES.SINGLE ? "reset.var" : "reset.multiVar"
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
children: "clear"
|
|
87
|
+
})]
|
|
88
|
+
}), !varList.length ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
|
|
89
|
+
variant: "light",
|
|
90
|
+
children: "Search for a feature."
|
|
91
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
|
|
92
|
+
children: varList
|
|
93
|
+
}), ((_dataset$selectedDise = dataset.selectedDisease) === null || _dataset$selectedDise === void 0 ? void 0 : _dataset$selectedDise.id) && (!((_dataset$selectedDise2 = dataset.selectedDisease) !== null && _dataset$selectedDise2 !== void 0 && (_dataset$selectedDise2 = _dataset$selectedDise2.genes) !== null && _dataset$selectedDise2 !== void 0 && _dataset$selectedDise2.length) ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
|
|
94
|
+
variant: "light",
|
|
95
|
+
children: "No disease genes found."
|
|
96
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
177
97
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
178
|
-
className: "d-flex justify-content-between",
|
|
98
|
+
className: "d-flex justify-content-between mt-3",
|
|
179
99
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
|
|
180
|
-
children:
|
|
100
|
+
children: "Disease genes"
|
|
181
101
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
182
102
|
variant: "link",
|
|
183
103
|
onClick: () => {
|
|
184
|
-
setVarButtons([]);
|
|
185
104
|
dispatch({
|
|
186
|
-
type:
|
|
105
|
+
type: "reset.disease"
|
|
187
106
|
});
|
|
188
107
|
},
|
|
189
108
|
children: "clear"
|
|
190
109
|
})]
|
|
110
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
111
|
+
children: (_dataset$selectedDise3 = dataset.selectedDisease) === null || _dataset$selectedDise3 === void 0 ? void 0 : _dataset$selectedDise3.name
|
|
191
112
|
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
|
|
192
|
-
children:
|
|
113
|
+
children: diseaseVarList
|
|
193
114
|
})]
|
|
194
|
-
})
|
|
195
|
-
children: ((_dataset$selectedDise = dataset.selectedDisease) === null || _dataset$selectedDise === void 0 ? void 0 : _dataset$selectedDise.id) && ((_dataset$selectedDise2 = dataset.selectedDisease) === null || _dataset$selectedDise2 === void 0 || (_dataset$selectedDise2 = _dataset$selectedDise2.genes) === null || _dataset$selectedDise2 === void 0 ? void 0 : _dataset$selectedDise2.length) > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
196
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
197
|
-
className: "d-flex justify-content-between",
|
|
198
|
-
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
|
|
199
|
-
children: "Disease genes"
|
|
200
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
201
|
-
variant: "link",
|
|
202
|
-
onClick: () => {
|
|
203
|
-
dispatch({
|
|
204
|
-
type: "reset.disease"
|
|
205
|
-
});
|
|
206
|
-
},
|
|
207
|
-
children: "clear"
|
|
208
|
-
})]
|
|
209
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
|
|
210
|
-
children: (_dataset$selectedDise3 = dataset.selectedDisease) === null || _dataset$selectedDise3 === void 0 ? void 0 : _dataset$selectedDise3.name
|
|
211
|
-
}), diseaseVarList]
|
|
212
|
-
})
|
|
213
|
-
})]
|
|
115
|
+
}))]
|
|
214
116
|
})
|
|
215
117
|
});
|
|
216
118
|
}
|
|
@@ -7,6 +7,7 @@ exports.Violin = Violin;
|
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
9
9
|
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
10
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
10
11
|
var _reactBootstrap = require("react-bootstrap");
|
|
11
12
|
var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
|
|
12
13
|
var _constants = require("../../constants/constants");
|
|
@@ -18,6 +19,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
18
19
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
19
20
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
20
21
|
function Violin(_ref) {
|
|
22
|
+
var _dataset$selectedObs, _dataset$selectedObs2, _dataset$selectedObs3;
|
|
21
23
|
let {
|
|
22
24
|
mode = _constants.VIOLIN_MODES.MULTIKEY
|
|
23
25
|
} = _ref;
|
|
@@ -26,11 +28,21 @@ function Violin(_ref) {
|
|
|
26
28
|
const [data, setData] = (0, _react.useState)([]);
|
|
27
29
|
const [layout, setLayout] = (0, _react.useState)({});
|
|
28
30
|
const [hasSelections, setHasSelections] = (0, _react.useState)(false);
|
|
29
|
-
const [params, setParams] = (0, _react.useState)({
|
|
31
|
+
const [params, setParams] = (0, _react.useState)(mode === _constants.VIOLIN_MODES.MULTIKEY ? {
|
|
30
32
|
url: dataset.url,
|
|
31
33
|
keys: [],
|
|
32
34
|
scale: dataset.controls.standardScale,
|
|
33
35
|
varNamesCol: dataset.varNamesCol
|
|
36
|
+
} : {
|
|
37
|
+
url: dataset.url,
|
|
38
|
+
keys: dataset.selectedVar.index,
|
|
39
|
+
selectedObs: dataset.selectedObs,
|
|
40
|
+
obsValues: !((_dataset$selectedObs = dataset.selectedObs) !== null && _dataset$selectedObs !== void 0 && _dataset$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs2 = dataset.selectedObs) === null || _dataset$selectedObs2 === void 0 ? void 0 : _dataset$selectedObs2.codes), (_dataset$selectedObs3 = dataset.selectedObs) === null || _dataset$selectedObs3 === void 0 ? void 0 : _dataset$selectedObs3.omit).map(c => {
|
|
41
|
+
var _dataset$selectedObs4;
|
|
42
|
+
return (_dataset$selectedObs4 = dataset.selectedObs) === null || _dataset$selectedObs4 === void 0 ? void 0 : _dataset$selectedObs4.codesMap[c];
|
|
43
|
+
}),
|
|
44
|
+
scale: dataset.controls.standardScale,
|
|
45
|
+
varNamesCol: dataset.varNamesCol
|
|
34
46
|
});
|
|
35
47
|
// @TODO: set default scale
|
|
36
48
|
|
|
@@ -57,11 +69,16 @@ function Violin(_ref) {
|
|
|
57
69
|
setHasSelections(false);
|
|
58
70
|
}
|
|
59
71
|
setParams(p => {
|
|
72
|
+
var _dataset$selectedObs5, _dataset$selectedObs6, _dataset$selectedObs7;
|
|
60
73
|
return {
|
|
61
74
|
...p,
|
|
62
75
|
url: dataset.url,
|
|
63
76
|
keys: dataset.selectedVar.index,
|
|
64
77
|
selectedObs: dataset.selectedObs,
|
|
78
|
+
obsValues: !((_dataset$selectedObs5 = dataset.selectedObs) !== null && _dataset$selectedObs5 !== void 0 && _dataset$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs6 = dataset.selectedObs) === null || _dataset$selectedObs6 === void 0 ? void 0 : _dataset$selectedObs6.codes), (_dataset$selectedObs7 = dataset.selectedObs) === null || _dataset$selectedObs7 === void 0 ? void 0 : _dataset$selectedObs7.omit).map(c => {
|
|
79
|
+
var _dataset$selectedObs8;
|
|
80
|
+
return (_dataset$selectedObs8 = dataset.selectedObs) === null || _dataset$selectedObs8 === void 0 ? void 0 : _dataset$selectedObs8.codesMap[c];
|
|
81
|
+
}),
|
|
65
82
|
scale: dataset.controls.standardScale,
|
|
66
83
|
varNamesCol: dataset.varNamesCol
|
|
67
84
|
};
|
|
@@ -12,7 +12,8 @@ const COLOR_ENCODINGS = exports.COLOR_ENCODINGS = {
|
|
|
12
12
|
const OBS_TYPES = exports.OBS_TYPES = {
|
|
13
13
|
CATEGORICAL: "categorical",
|
|
14
14
|
DISCRETE: "discrete",
|
|
15
|
-
CONTINUOUS: "continuous"
|
|
15
|
+
CONTINUOUS: "continuous",
|
|
16
|
+
BOOLEAN: "boolean"
|
|
16
17
|
};
|
|
17
18
|
const SELECTED_POLYGON_FILLCOLOR = exports.SELECTED_POLYGON_FILLCOLOR = [107, 170, 209, 255 / 2];
|
|
18
19
|
const UNSELECTED_POLYGON_FILLCOLOR = exports.UNSELECTED_POLYGON_FILLCOLOR = [167, 191, 211, 255 / 3];
|
|
@@ -12,6 +12,7 @@ var _querySyncStoragePersister = require("@tanstack/query-sync-storage-persister
|
|
|
12
12
|
var _reactQuery = require("@tanstack/react-query");
|
|
13
13
|
var _reactQueryPersistClient = require("@tanstack/react-query-persist-client");
|
|
14
14
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
+
var _FilterContext = require("./FilterContext");
|
|
15
16
|
var _constants = require("../constants/constants");
|
|
16
17
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
18
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -32,7 +33,7 @@ const queryClient = new _reactQuery.QueryClient({
|
|
|
32
33
|
})
|
|
33
34
|
});
|
|
34
35
|
// Type of queries to store responses
|
|
35
|
-
const persistKeys = ["obs/cols", "var/names", "obsm/keys"];
|
|
36
|
+
const persistKeys = ["obs/cols", "var/names", "obsm/keys", "var/histograms", "obs/bins", "obs/distribution"];
|
|
36
37
|
const persistOptions = {
|
|
37
38
|
persister: (0, _querySyncStoragePersister.createSyncStoragePersister)({
|
|
38
39
|
storage: window.localStorage
|
|
@@ -123,7 +124,9 @@ function DatasetProvider(_ref2) {
|
|
|
123
124
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactQueryPersistClient.PersistQueryClientProvider, {
|
|
124
125
|
client: queryClient,
|
|
125
126
|
persistOptions: persistOptions,
|
|
126
|
-
children:
|
|
127
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FilterContext.FilterProvider, {
|
|
128
|
+
children: children
|
|
129
|
+
})
|
|
127
130
|
})
|
|
128
131
|
})
|
|
129
132
|
});
|
|
@@ -145,6 +148,11 @@ function datasetReducer(dataset, action) {
|
|
|
145
148
|
controls: {
|
|
146
149
|
...dataset.controls,
|
|
147
150
|
range: ((_action$obs = action.obs) === null || _action$obs === void 0 ? void 0 : _action$obs.type) === _constants.OBS_TYPES.CATEGORICAL ? [0, 1] : dataset.controls.range
|
|
151
|
+
},
|
|
152
|
+
colorEncoding: dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && !action.obs ? null : dataset.colorEncoding,
|
|
153
|
+
sliceBy: {
|
|
154
|
+
...dataset.sliceBy,
|
|
155
|
+
obs: action.obs ? dataset.sliceBy.obs : false
|
|
148
156
|
}
|
|
149
157
|
};
|
|
150
158
|
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.FilterProvider = FilterProvider;
|
|
7
|
+
exports.FilteredDataDispatchContext = exports.FilteredDataContext = void 0;
|
|
8
|
+
exports.useFilteredData = useFilteredData;
|
|
9
|
+
exports.useFilteredDataDispatch = useFilteredDataDispatch;
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
|
+
const FilteredDataContext = exports.FilteredDataContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
15
|
+
const FilteredDataDispatchContext = exports.FilteredDataDispatchContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
16
|
+
const initialFilterData = {
|
|
17
|
+
obsIndices: [],
|
|
18
|
+
varIndices: []
|
|
19
|
+
};
|
|
20
|
+
function FilterProvider(_ref) {
|
|
21
|
+
let {
|
|
22
|
+
children
|
|
23
|
+
} = _ref;
|
|
24
|
+
const [filteredData, dispatch] = (0, _react.useReducer)(filterReducer, {
|
|
25
|
+
...initialFilterData
|
|
26
|
+
});
|
|
27
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(FilteredDataContext.Provider, {
|
|
28
|
+
value: filteredData,
|
|
29
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(FilteredDataDispatchContext.Provider, {
|
|
30
|
+
value: dispatch,
|
|
31
|
+
children: children
|
|
32
|
+
})
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function useFilteredData() {
|
|
36
|
+
return (0, _react.useContext)(FilteredDataContext);
|
|
37
|
+
}
|
|
38
|
+
function useFilteredDataDispatch() {
|
|
39
|
+
return (0, _react.useContext)(FilteredDataDispatchContext);
|
|
40
|
+
}
|
|
41
|
+
function filterReducer(filteredData, action) {
|
|
42
|
+
switch (action.type) {
|
|
43
|
+
case "set.obs.indices":
|
|
44
|
+
{
|
|
45
|
+
return {
|
|
46
|
+
...filteredData,
|
|
47
|
+
obsIndices: action.indices
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
case "reset.obs.indices":
|
|
51
|
+
{
|
|
52
|
+
return {
|
|
53
|
+
...filteredData,
|
|
54
|
+
obsIndices: []
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
case "set.var.indices":
|
|
58
|
+
{
|
|
59
|
+
return {
|
|
60
|
+
...filteredData,
|
|
61
|
+
varIndices: action.indices
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
case "reset.var.indices":
|
|
65
|
+
{
|
|
66
|
+
return {
|
|
67
|
+
...filteredData,
|
|
68
|
+
varIndices: []
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
default:
|
|
72
|
+
{
|
|
73
|
+
throw Error("Unknown action: " + action.type);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -7,28 +7,33 @@ exports.MapHelper = void 0;
|
|
|
7
7
|
var _core = require("@deck.gl/core");
|
|
8
8
|
class MapHelper {
|
|
9
9
|
fitBounds(coords) {
|
|
10
|
+
let {
|
|
11
|
+
width = 400,
|
|
12
|
+
height = 600
|
|
13
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
14
|
+
width: 400,
|
|
15
|
+
height: 600
|
|
16
|
+
};
|
|
10
17
|
let view = new _core.WebMercatorViewport({
|
|
11
|
-
width:
|
|
12
|
-
height:
|
|
13
|
-
longitude:
|
|
14
|
-
latitude:
|
|
15
|
-
zoom: 12
|
|
16
|
-
pitch: 30,
|
|
17
|
-
bearing: 15
|
|
18
|
+
width: width,
|
|
19
|
+
height: height,
|
|
20
|
+
longitude: 0,
|
|
21
|
+
latitude: 0,
|
|
22
|
+
zoom: 12
|
|
18
23
|
});
|
|
19
|
-
let latMin =
|
|
20
|
-
let latMax = -
|
|
21
|
-
let lonMin =
|
|
22
|
-
let lonMax = -
|
|
24
|
+
let latMin = Infinity;
|
|
25
|
+
let latMax = -Infinity;
|
|
26
|
+
let lonMin = Infinity;
|
|
27
|
+
let lonMax = -Infinity;
|
|
28
|
+
const RECT_LON_INDEX = 0;
|
|
29
|
+
const RECT_LAT_INDEX = 1;
|
|
23
30
|
coords.forEach(function (coord) {
|
|
24
|
-
const RECT_LAT_INDEX = "0";
|
|
25
|
-
const RECT_LON_INDEX = "1";
|
|
26
31
|
if (coord[RECT_LAT_INDEX] < latMin) latMin = coord[RECT_LAT_INDEX];
|
|
27
32
|
if (coord[RECT_LAT_INDEX] > latMax) latMax = coord[RECT_LAT_INDEX];
|
|
28
33
|
if (coord[RECT_LON_INDEX] < lonMin) lonMin = coord[RECT_LON_INDEX];
|
|
29
34
|
if (coord[RECT_LON_INDEX] > lonMax) lonMax = coord[RECT_LON_INDEX];
|
|
30
35
|
});
|
|
31
|
-
const bounds = [[lonMin,
|
|
36
|
+
const bounds = [[lonMin, latMin], [lonMax, latMax]];
|
|
32
37
|
const {
|
|
33
38
|
longitude,
|
|
34
39
|
latitude,
|
|
@@ -36,7 +41,7 @@ class MapHelper {
|
|
|
36
41
|
} = view.fitBounds(bounds, {
|
|
37
42
|
padding: {
|
|
38
43
|
top: 50,
|
|
39
|
-
bottom:
|
|
44
|
+
bottom: 70,
|
|
40
45
|
left: 50,
|
|
41
46
|
right: 50
|
|
42
47
|
}
|
package/dist/index.js
CHANGED
|
@@ -27,6 +27,12 @@ Object.defineProperty(exports, "DotplotControls", {
|
|
|
27
27
|
return _DotplotControls.DotplotControls;
|
|
28
28
|
}
|
|
29
29
|
});
|
|
30
|
+
Object.defineProperty(exports, "FilterProvider", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function () {
|
|
33
|
+
return _FilterContext.FilterProvider;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
30
36
|
Object.defineProperty(exports, "Heatmap", {
|
|
31
37
|
enumerable: true,
|
|
32
38
|
get: function () {
|
|
@@ -158,4 +164,5 @@ var _ViolinControls = require("./components/violin/ViolinControls");
|
|
|
158
164
|
var _constants = require("./constants/constants");
|
|
159
165
|
var _colorscales = require("./constants/colorscales");
|
|
160
166
|
var _DatasetContext = require("./context/DatasetContext");
|
|
167
|
+
var _FilterContext = require("./context/FilterContext");
|
|
161
168
|
var _Offcanvas = require("./components/Offcanvas");
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.VirtualizedList = VirtualizedList;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactVirtual = require("@tanstack/react-virtual");
|
|
9
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
11
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
12
|
+
function VirtualizedList(_ref) {
|
|
13
|
+
var _virtualItems$0$start, _virtualItems$;
|
|
14
|
+
let {
|
|
15
|
+
getDataAtIndex,
|
|
16
|
+
count,
|
|
17
|
+
ItemComponent,
|
|
18
|
+
estimateSize = 44,
|
|
19
|
+
overscan = 25,
|
|
20
|
+
maxHeight = "80vh",
|
|
21
|
+
...props
|
|
22
|
+
} = _ref;
|
|
23
|
+
const [parentNode, setParentNode] = (0, _react.useState)(null);
|
|
24
|
+
const itemVirtualizer = (0, _reactVirtual.useVirtualizer)({
|
|
25
|
+
count: count,
|
|
26
|
+
getScrollElement: () => parentNode,
|
|
27
|
+
estimateSize: () => estimateSize,
|
|
28
|
+
overscan: overscan
|
|
29
|
+
});
|
|
30
|
+
const refCallback = (0, _react.useCallback)(node => {
|
|
31
|
+
setParentNode(node);
|
|
32
|
+
}, []);
|
|
33
|
+
const virtualItems = itemVirtualizer.getVirtualItems();
|
|
34
|
+
(0, _react.useEffect)(() => {
|
|
35
|
+
itemVirtualizer.measure();
|
|
36
|
+
}, [itemVirtualizer, parentNode === null || parentNode === void 0 ? void 0 : parentNode.clientHeight]);
|
|
37
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
38
|
+
ref: refCallback,
|
|
39
|
+
style: {
|
|
40
|
+
overflowY: "auto",
|
|
41
|
+
maxHeight: maxHeight
|
|
42
|
+
},
|
|
43
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
44
|
+
style: {
|
|
45
|
+
height: "".concat(itemVirtualizer.getTotalSize(), "px"),
|
|
46
|
+
width: "100%",
|
|
47
|
+
position: "relative",
|
|
48
|
+
willChange: "transform"
|
|
49
|
+
},
|
|
50
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
51
|
+
style: {
|
|
52
|
+
position: "absolute",
|
|
53
|
+
top: 0,
|
|
54
|
+
left: 0,
|
|
55
|
+
width: "100%",
|
|
56
|
+
transform: "translateY(".concat((_virtualItems$0$start = (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.start) !== null && _virtualItems$0$start !== void 0 ? _virtualItems$0$start : 0, "px)")
|
|
57
|
+
},
|
|
58
|
+
children: virtualItems.map(virtualItem => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
59
|
+
"data-index": virtualItem.index,
|
|
60
|
+
ref: itemVirtualizer.measureElement,
|
|
61
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ItemComponent, {
|
|
62
|
+
...getDataAtIndex(virtualItem.index),
|
|
63
|
+
...props
|
|
64
|
+
})
|
|
65
|
+
}, virtualItem.key))
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
});
|
|
69
|
+
}
|
package/dist/utils/requests.js
CHANGED
|
@@ -40,7 +40,7 @@ async function fetchData(endpoint, params) {
|
|
|
40
40
|
return await response.json();
|
|
41
41
|
}
|
|
42
42
|
const useFetch = function (endpoint, params) {
|
|
43
|
-
let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] :
|
|
43
|
+
let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
44
44
|
let apiUrl = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
|
|
45
45
|
const {
|
|
46
46
|
enabled = true
|
|
@@ -72,7 +72,7 @@ const useFetch = function (endpoint, params) {
|
|
|
72
72
|
exports.useFetch = useFetch;
|
|
73
73
|
const useDebouncedFetch = function (endpoint, params) {
|
|
74
74
|
let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 500;
|
|
75
|
-
let opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] :
|
|
75
|
+
let opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
76
76
|
let apiUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
|
|
77
77
|
const {
|
|
78
78
|
enabled = true
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.prettyNumerical = prettyNumerical;
|
|
7
|
+
function prettyNumerical(n) {
|
|
8
|
+
let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
|
|
9
|
+
if (n === 0) {
|
|
10
|
+
return "0";
|
|
11
|
+
} else if (n < 1 / 10 ** precision) {
|
|
12
|
+
return n.toExponential(precision);
|
|
13
|
+
} else {
|
|
14
|
+
return n.toLocaleString(undefined, {
|
|
15
|
+
maximumFractionDigits: precision
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haniffalab/cherita-react",
|
|
3
|
-
"version": "0.2.0-dev.2024-09-26.
|
|
3
|
+
"version": "0.2.0-dev.2024-09-26.d9293c4c",
|
|
4
4
|
"author": "",
|
|
5
5
|
"license": "",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"@fortawesome/react-fontawesome": "^0.2.0",
|
|
17
17
|
"@mui/icons-material": "^5.15.20",
|
|
18
18
|
"@mui/material": "^5.15.19",
|
|
19
|
+
"@mui/x-charts": "^7.7.1",
|
|
19
20
|
"@nebula.gl/editor": "^1.0.4",
|
|
20
21
|
"@nebula.gl/layers": "^1.0.4",
|
|
21
22
|
"@tanstack/query-sync-storage-persister": "^4.36.1",
|
|
@@ -84,5 +85,5 @@
|
|
|
84
85
|
"url": "https://github.com/haniffalab/cherita-react/issues"
|
|
85
86
|
},
|
|
86
87
|
"homepage": "https://github.com/haniffalab/cherita-react#readme",
|
|
87
|
-
"prereleaseSha": "
|
|
88
|
+
"prereleaseSha": "d9293c4c3c66bc0c5d0c5012ccc39c0913e7bb93"
|
|
88
89
|
}
|