@haniffalab/cherita-react 1.3.0 → 1.3.1-dev.2025-10-29.6de4119f
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/README.md +1 -1
- package/dist/cjs/components/controls/Controls.js +38 -30
- package/dist/cjs/components/dotplot/Dotplot.js +85 -57
- package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
- package/dist/cjs/components/full-page/FullPage.js +167 -114
- package/dist/cjs/components/full-page/PlotAlert.js +45 -0
- package/dist/cjs/components/full-page/PlotTypeSelector.js +102 -0
- package/dist/cjs/components/heatmap/Heatmap.js +83 -53
- package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
- package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
- package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
- package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
- package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
- package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
- package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
- package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
- package/dist/cjs/components/matrixplot/Matrixplot.js +83 -54
- package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
- package/dist/cjs/components/obs-list/ObsItem.js +305 -216
- package/dist/cjs/components/obs-list/ObsList.js +164 -128
- package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
- package/dist/cjs/components/obsm-list/ObsmList.js +67 -28
- package/dist/cjs/components/offcanvas/index.js +62 -27
- package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
- package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
- package/dist/cjs/components/scatterplot/Scatterplot.js +223 -175
- package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
- package/dist/cjs/components/scatterplot/SpatialControls.js +143 -116
- package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
- package/dist/cjs/components/search-bar/SearchBar.js +176 -120
- package/dist/cjs/components/search-bar/SearchInfo.js +79 -85
- package/dist/cjs/components/search-bar/SearchResults.js +93 -71
- package/dist/cjs/components/toolbar/Toolbar.js +111 -0
- package/dist/cjs/components/var-list/VarItem.js +131 -103
- package/dist/cjs/components/var-list/VarList.js +96 -74
- package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
- package/dist/cjs/components/var-list/VarSet.js +126 -108
- package/dist/cjs/components/violin/Violin.js +124 -81
- package/dist/cjs/components/violin/ViolinControls.js +8 -5
- package/dist/cjs/constants/colorscales.js +19 -19
- package/dist/cjs/constants/constants.js +54 -39
- package/dist/cjs/context/DatasetContext.js +27 -17
- package/dist/cjs/context/FilterContext.js +11 -9
- package/dist/cjs/context/SettingsContext.js +339 -125
- package/dist/cjs/context/ZarrDataContext.js +6 -5
- package/dist/cjs/helpers/color-helper.js +2 -2
- package/dist/cjs/helpers/map-helper.js +2 -1
- package/dist/cjs/helpers/zarr-helper.js +3 -3
- package/dist/cjs/index.js +15 -21
- package/dist/cjs/utils/Filter.js +16 -11
- package/dist/cjs/utils/Histogram.js +35 -33
- package/dist/cjs/utils/ImageViewer.js +11 -8
- package/dist/cjs/utils/Legend.js +37 -30
- package/dist/cjs/utils/LoadingIndicators.js +15 -13
- package/dist/cjs/utils/Resolver.js +213 -0
- package/dist/cjs/utils/Skeleton.js +10 -10
- package/dist/cjs/utils/StyledTooltip.js +44 -0
- package/dist/cjs/utils/VirtualizedList.js +36 -29
- package/dist/cjs/utils/errors.js +15 -15
- package/dist/cjs/utils/requests.js +21 -9
- package/dist/cjs/utils/search.js +4 -4
- package/dist/cjs/utils/string.js +6 -6
- package/dist/cjs/utils/zarrData.js +20 -21
- package/dist/css/cherita.css +188 -65
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/controls/Controls.js +43 -35
- package/dist/esm/components/dotplot/Dotplot.js +93 -64
- package/dist/esm/components/dotplot/DotplotControls.js +106 -85
- package/dist/esm/components/full-page/FullPage.js +180 -124
- package/dist/esm/components/full-page/PlotAlert.js +39 -0
- package/dist/esm/components/full-page/PlotTypeSelector.js +95 -0
- package/dist/esm/components/heatmap/Heatmap.js +91 -60
- package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
- package/dist/esm/components/icons/DotPlotIcon.js +58 -0
- package/dist/esm/components/icons/HeatmapIcon.js +39 -0
- package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
- package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
- package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
- package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
- package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
- package/dist/esm/components/matrixplot/Matrixplot.js +91 -61
- package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
- package/dist/esm/components/obs-list/ObsItem.js +320 -228
- package/dist/esm/components/obs-list/ObsList.js +179 -142
- package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
- package/dist/esm/components/obsm-list/ObsmList.js +71 -32
- package/dist/esm/components/offcanvas/index.js +68 -33
- package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
- package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
- package/dist/esm/components/scatterplot/Scatterplot.js +243 -194
- package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
- package/dist/esm/components/scatterplot/SpatialControls.js +155 -127
- package/dist/esm/components/scatterplot/Toolbox.js +44 -32
- package/dist/esm/components/search-bar/SearchBar.js +187 -130
- package/dist/esm/components/search-bar/SearchInfo.js +86 -91
- package/dist/esm/components/search-bar/SearchResults.js +100 -77
- package/dist/esm/components/toolbar/Toolbar.js +101 -0
- package/dist/esm/components/var-list/VarItem.js +142 -113
- package/dist/esm/components/var-list/VarList.js +108 -88
- package/dist/esm/components/var-list/VarListToolbar.js +64 -58
- package/dist/esm/components/var-list/VarSet.js +134 -115
- package/dist/esm/components/violin/Violin.js +135 -91
- package/dist/esm/components/violin/ViolinControls.js +10 -6
- package/dist/esm/constants/colorscales.js +19 -19
- package/dist/esm/constants/constants.js +53 -38
- package/dist/esm/context/DatasetContext.js +34 -23
- package/dist/esm/context/FilterContext.js +11 -8
- package/dist/esm/context/SettingsContext.js +341 -126
- package/dist/esm/context/ZarrDataContext.js +8 -6
- package/dist/esm/helpers/color-helper.js +5 -5
- package/dist/esm/helpers/map-helper.js +4 -3
- package/dist/esm/helpers/zarr-helper.js +6 -6
- package/dist/esm/index.js +22 -22
- package/dist/esm/utils/Filter.js +22 -17
- package/dist/esm/utils/Histogram.js +39 -37
- package/dist/esm/utils/ImageViewer.js +12 -8
- package/dist/esm/utils/Legend.js +44 -36
- package/dist/esm/utils/LoadingIndicators.js +16 -13
- package/dist/esm/utils/Resolver.js +201 -0
- package/dist/esm/utils/Skeleton.js +11 -10
- package/dist/esm/utils/StyledTooltip.js +38 -0
- package/dist/esm/utils/VirtualizedList.js +37 -29
- package/dist/esm/utils/errors.js +15 -15
- package/dist/esm/utils/requests.js +24 -12
- package/dist/esm/utils/search.js +7 -7
- package/dist/esm/utils/string.js +7 -7
- package/dist/esm/utils/zarrData.js +27 -28
- package/package.json +24 -10
- package/scss/cherita-bootstrap.scss +2 -2
- package/scss/cherita.scss +65 -17
- package/scss/components/accordions.scss +15 -2
- package/scss/components/layouts.scss +116 -30
- package/scss/components/lists.scss +16 -5
- package/scss/components/plotly.scss +40 -23
- package/scss/components/plots.scss +14 -1
- package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
- package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useSettingsVars = exports.useSelectedVar = exports.useSelectedObs = exports.useSelectedMultiVar = exports.useResolver = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
|
+
var _requests = require("./requests");
|
|
10
|
+
var _constants = require("../constants/constants");
|
|
11
|
+
var _DatasetContext = require("../context/DatasetContext");
|
|
12
|
+
var _SettingsContext = require("../context/SettingsContext");
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
15
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
16
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
17
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
18
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
19
|
+
const cleanSettings = settings => {
|
|
20
|
+
var _settings$data$pseudo;
|
|
21
|
+
// Remove obs and vars from settings that are not in data
|
|
22
|
+
|
|
23
|
+
const selectedObs = settings.selectedObs && settings.data.obs[settings.selectedObs.name] ? settings.selectedObs : null;
|
|
24
|
+
const labelObs = _lodash.default.filter(settings.labelObs, obsName => settings.data.obs[obsName]);
|
|
25
|
+
const selectedVar = settings.selectedVar && (settings.selectedVar.isSet ? _lodash.default.every(settings.selectedVar.vars, vv => settings.data.vars[vv.name]) : settings.data.vars[settings.selectedVar.name]) ? settings.selectedVar : null;
|
|
26
|
+
const selectedMultiVar = _lodash.default.filter(settings.selectedMultiVar, v => {
|
|
27
|
+
if (v.isSet) {
|
|
28
|
+
return _lodash.default.every(v.vars, vv => settings.data.vars[vv.name]);
|
|
29
|
+
} else {
|
|
30
|
+
return settings.data.vars[v.name];
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
const vars = _lodash.default.filter(settings.vars, v => {
|
|
34
|
+
if (v.isSet) {
|
|
35
|
+
return _lodash.default.every(v.vars, vv => settings.data.vars[vv.name]);
|
|
36
|
+
} else {
|
|
37
|
+
return settings.data.vars[v.name];
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
let pseudospatial = settings.pseudospatial;
|
|
41
|
+
if (!_lodash.default.keys(settings.data.pseudospatial).length) {
|
|
42
|
+
pseudospatial = {
|
|
43
|
+
maskSet: null,
|
|
44
|
+
maskValues: null,
|
|
45
|
+
categoricalMode: _constants.PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (pseudospatial.maskSet && !_lodash.default.includes(_lodash.default.keys(settings.data.pseudospatial), pseudospatial.maskSet)) {
|
|
49
|
+
pseudospatial = _objectSpread(_objectSpread({}, pseudospatial), {}, {
|
|
50
|
+
maskSet: null
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (pseudospatial.maskValues && !!_lodash.default.difference(pseudospatial.maskValues, ((_settings$data$pseudo = settings.data.pseudospatial) === null || _settings$data$pseudo === void 0 ? void 0 : _settings$data$pseudo[pseudospatial.maskSet]) || []).length) {
|
|
54
|
+
pseudospatial = _objectSpread(_objectSpread({}, pseudospatial), {}, {
|
|
55
|
+
maskValues: null
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
59
|
+
selectedObs: selectedObs,
|
|
60
|
+
labelObs: labelObs,
|
|
61
|
+
selectedVar: selectedVar,
|
|
62
|
+
selectedMultiVar: selectedMultiVar,
|
|
63
|
+
vars: vars,
|
|
64
|
+
pseudospatial: pseudospatial
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
const useResolver = initSettings => {
|
|
68
|
+
const dataset = (0, _DatasetContext.useDataset)();
|
|
69
|
+
const {
|
|
70
|
+
isPseudospatial = false
|
|
71
|
+
} = dataset;
|
|
72
|
+
const [isPending, setisPending] = (0, _react.useState)(true);
|
|
73
|
+
const [resolvedSettings, setResolvedSettings] = (0, _react.useState)(null);
|
|
74
|
+
|
|
75
|
+
// obs
|
|
76
|
+
// all obs should be in initSettings.selectedObs and initSettings.labelObs
|
|
77
|
+
const initObs = _lodash.default.uniqBy(_lodash.default.compact([initSettings.selectedObs, ..._lodash.default.map(initSettings.labelObs, o => ({
|
|
78
|
+
name: o
|
|
79
|
+
}))]), 'name');
|
|
80
|
+
const initObsNames = _lodash.default.map(initObs, o => o.name);
|
|
81
|
+
const [obsParams] = (0, _react.useState)({
|
|
82
|
+
url: dataset.url,
|
|
83
|
+
cols: initObsNames,
|
|
84
|
+
obsParams: _lodash.default.fromPairs(_lodash.default.map(initObs, o => [o.name, {
|
|
85
|
+
bins: o.bins || {}
|
|
86
|
+
}]))
|
|
87
|
+
});
|
|
88
|
+
const {
|
|
89
|
+
fetchedData: obsData,
|
|
90
|
+
isPending: obsDataPending,
|
|
91
|
+
serverError: obsDataError
|
|
92
|
+
} = (0, _requests.useFetch)('obs/cols', obsParams, {
|
|
93
|
+
enabled: !!initObsNames.length
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// vars
|
|
97
|
+
// all vars should be in initSettings.vars from validation
|
|
98
|
+
const initVars = initSettings.vars;
|
|
99
|
+
const initVarsNames = _lodash.default.flatMap(initVars, v => v.isSet ? _lodash.default.map(v.vars, vv => vv.name) : v.name);
|
|
100
|
+
const [varParams] = (0, _react.useState)({
|
|
101
|
+
url: dataset.url,
|
|
102
|
+
col: dataset.varNamesCol,
|
|
103
|
+
names: initVarsNames
|
|
104
|
+
});
|
|
105
|
+
const {
|
|
106
|
+
fetchedData: varData,
|
|
107
|
+
isPending: varDataPending,
|
|
108
|
+
serverError: varDataError
|
|
109
|
+
} = (0, _requests.useFetch)('var/cols/names', varParams, {
|
|
110
|
+
enabled: !!varParams.names.length
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// pseudospatial
|
|
114
|
+
const [pseudospatialParams] = (0, _react.useState)({
|
|
115
|
+
url: dataset.url
|
|
116
|
+
});
|
|
117
|
+
const pseudospatialEnabled = isPseudospatial;
|
|
118
|
+
const {
|
|
119
|
+
fetchedData: pseudospatialData,
|
|
120
|
+
isPending: pseudospatialDataPending,
|
|
121
|
+
serverError: pseudospatialDataError
|
|
122
|
+
} = (0, _requests.useFetch)('masks', pseudospatialParams, {
|
|
123
|
+
enabled: pseudospatialEnabled,
|
|
124
|
+
retry: false
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// Use isPending to help set initial state to true
|
|
128
|
+
(0, _react.useEffect)(() => {
|
|
129
|
+
setisPending(obsDataPending || varDataPending || pseudospatialDataPending);
|
|
130
|
+
}, [obsDataPending, pseudospatialDataPending, varDataPending]);
|
|
131
|
+
|
|
132
|
+
// Use isPending along with other pending states
|
|
133
|
+
// to ensure they've all converged after state updates
|
|
134
|
+
(0, _react.useEffect)(() => {
|
|
135
|
+
if (isPending || obsDataPending || varDataPending || pseudospatialDataPending) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (obsDataError) {
|
|
139
|
+
console.error('Error fetching obs data:', obsDataError);
|
|
140
|
+
}
|
|
141
|
+
if (varDataError) {
|
|
142
|
+
console.error('Error fetching var data:', varDataError);
|
|
143
|
+
}
|
|
144
|
+
if (pseudospatialDataError) {
|
|
145
|
+
console.error('Error fetching pseudospatial masks data:', pseudospatialDataError);
|
|
146
|
+
}
|
|
147
|
+
const data = {
|
|
148
|
+
obs: obsData ? _lodash.default.fromPairs(_lodash.default.map(obsData, o => [o.name, o])) : {},
|
|
149
|
+
vars: varData ? _lodash.default.fromPairs(_lodash.default.map(varData, v => [v.name, v])) : {},
|
|
150
|
+
pseudospatial: pseudospatialData || {}
|
|
151
|
+
};
|
|
152
|
+
const cleanedSettings = cleanSettings(_objectSpread(_objectSpread({}, initSettings), {}, {
|
|
153
|
+
data: data
|
|
154
|
+
}));
|
|
155
|
+
setResolvedSettings(cleanedSettings);
|
|
156
|
+
}, [initSettings, isPending, obsData, obsDataError, obsDataPending, pseudospatialData, pseudospatialDataError, pseudospatialDataPending, pseudospatialEnabled, varData, varDataError, varDataPending]);
|
|
157
|
+
return resolvedSettings;
|
|
158
|
+
};
|
|
159
|
+
exports.useResolver = useResolver;
|
|
160
|
+
const useSelectedObs = () => {
|
|
161
|
+
const settings = (0, _SettingsContext.useSettings)();
|
|
162
|
+
return (0, _react.useMemo)(() => {
|
|
163
|
+
return settings.selectedObs ? _objectSpread(_objectSpread({}, settings.selectedObs), settings.data.obs[settings.selectedObs.name]) : null;
|
|
164
|
+
}, [settings.data.obs, settings.selectedObs]);
|
|
165
|
+
};
|
|
166
|
+
exports.useSelectedObs = useSelectedObs;
|
|
167
|
+
const useSelectedVar = () => {
|
|
168
|
+
const settings = (0, _SettingsContext.useSettings)();
|
|
169
|
+
return (0, _react.useMemo)(() => {
|
|
170
|
+
if (settings.selectedVar) {
|
|
171
|
+
if (settings.selectedVar.isSet) {
|
|
172
|
+
return _objectSpread(_objectSpread({}, settings.selectedVar), {}, {
|
|
173
|
+
vars: settings.selectedVar.vars.map(v => _objectSpread({}, settings.data.vars[v.name]))
|
|
174
|
+
});
|
|
175
|
+
} else {
|
|
176
|
+
return _objectSpread(_objectSpread({}, settings.selectedVar), settings.data.vars[settings.selectedVar.name]);
|
|
177
|
+
}
|
|
178
|
+
} else {
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}, [settings.data.vars, settings.selectedVar]);
|
|
182
|
+
};
|
|
183
|
+
exports.useSelectedVar = useSelectedVar;
|
|
184
|
+
const useSelectedMultiVar = () => {
|
|
185
|
+
const settings = (0, _SettingsContext.useSettings)();
|
|
186
|
+
return (0, _react.useMemo)(() => {
|
|
187
|
+
return _lodash.default.map(settings.selectedMultiVar, v => {
|
|
188
|
+
if (v.isSet) {
|
|
189
|
+
return _objectSpread(_objectSpread({}, v), {}, {
|
|
190
|
+
vars: v.vars.map(vv => _objectSpread({}, settings.data.vars[vv.name]))
|
|
191
|
+
});
|
|
192
|
+
} else {
|
|
193
|
+
return _objectSpread(_objectSpread({}, v), settings.data.vars[v.name]);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}, [settings.data.vars, settings.selectedMultiVar]);
|
|
197
|
+
};
|
|
198
|
+
exports.useSelectedMultiVar = useSelectedMultiVar;
|
|
199
|
+
const useSettingsVars = () => {
|
|
200
|
+
const settings = (0, _SettingsContext.useSettings)();
|
|
201
|
+
return (0, _react.useMemo)(() => {
|
|
202
|
+
return _lodash.default.map(settings.vars, v => {
|
|
203
|
+
if (v.isSet) {
|
|
204
|
+
return _objectSpread(_objectSpread({}, v), {}, {
|
|
205
|
+
vars: v.vars.map(vv => _objectSpread({}, settings.data.vars[vv.name]))
|
|
206
|
+
});
|
|
207
|
+
} else {
|
|
208
|
+
return _objectSpread(_objectSpread({}, v), settings.data.vars[v.name]);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
}, [settings.data.vars, settings.vars]);
|
|
212
|
+
};
|
|
213
|
+
exports.useSettingsVars = useSettingsVars;
|
|
@@ -4,18 +4,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.ObsmKeysListBtn = void 0;
|
|
7
|
-
var _react = _interopRequireDefault(require("react"));
|
|
8
7
|
var _reactBootstrap = require("react-bootstrap");
|
|
9
|
-
|
|
8
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
9
|
const ObsmKeysListBtn = () => {
|
|
11
|
-
return /*#__PURE__*/
|
|
10
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Placeholder, {
|
|
12
11
|
as: _reactBootstrap.Button,
|
|
13
|
-
animation: "glow"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
animation: "glow",
|
|
13
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Placeholder, {
|
|
14
|
+
xs: 6,
|
|
15
|
+
style: {
|
|
16
|
+
width: '40px'
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
20
|
};
|
|
21
21
|
exports.ObsmKeysListBtn = ObsmKeysListBtn;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.StyledTooltip = void 0;
|
|
7
|
+
var _material = require("@mui/material");
|
|
8
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
9
|
+
const _excluded = ["className"];
|
|
10
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
11
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
12
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
13
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
14
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
15
|
+
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
16
|
+
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
17
|
+
const StyledTooltip = exports.StyledTooltip = (0, _material.styled)(_ref => {
|
|
18
|
+
let {
|
|
19
|
+
className
|
|
20
|
+
} = _ref,
|
|
21
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
22
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, _objectSpread(_objectSpread({}, props), {}, {
|
|
23
|
+
classes: {
|
|
24
|
+
popper: className
|
|
25
|
+
}
|
|
26
|
+
}));
|
|
27
|
+
})(_ref2 => {
|
|
28
|
+
let {
|
|
29
|
+
theme
|
|
30
|
+
} = _ref2;
|
|
31
|
+
return {
|
|
32
|
+
["& .".concat(_material.tooltipClasses.tooltip)]: {
|
|
33
|
+
backgroundColor: '#000',
|
|
34
|
+
color: '#fff',
|
|
35
|
+
maxWidth: 220,
|
|
36
|
+
fontSize: 13,
|
|
37
|
+
borderRadius: 4,
|
|
38
|
+
padding: theme.spacing(0.5, 1),
|
|
39
|
+
whiteSpace: 'pre-line',
|
|
40
|
+
textAlign: 'center',
|
|
41
|
+
boxShadow: '0 0.25rem 0.75rem rgba(0, 0, 0, 0.1)'
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
});
|
|
@@ -4,11 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.VirtualizedList = VirtualizedList;
|
|
7
|
-
var _react =
|
|
7
|
+
var _react = require("react");
|
|
8
8
|
var _reactVirtual = require("@tanstack/react-virtual");
|
|
9
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
9
10
|
const _excluded = ["getDataAtIndex", "count", "ItemComponent", "estimateSize", "overscan", "maxHeight"];
|
|
10
|
-
function
|
|
11
|
-
function
|
|
11
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
12
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
13
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
14
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
15
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
12
16
|
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
13
17
|
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
14
18
|
function VirtualizedList(_ref) {
|
|
@@ -17,16 +21,16 @@ function VirtualizedList(_ref) {
|
|
|
17
21
|
getDataAtIndex,
|
|
18
22
|
count,
|
|
19
23
|
ItemComponent,
|
|
20
|
-
estimateSize = 45,
|
|
24
|
+
estimateSize = () => 45,
|
|
21
25
|
overscan = 25,
|
|
22
|
-
maxHeight =
|
|
26
|
+
maxHeight = '65vh'
|
|
23
27
|
} = _ref,
|
|
24
28
|
props = _objectWithoutProperties(_ref, _excluded);
|
|
25
29
|
const [parentNode, setParentNode] = (0, _react.useState)(null);
|
|
26
30
|
const itemVirtualizer = (0, _reactVirtual.useVirtualizer)({
|
|
27
31
|
count: count,
|
|
28
32
|
getScrollElement: () => parentNode,
|
|
29
|
-
estimateSize:
|
|
33
|
+
estimateSize: i => estimateSize(i),
|
|
30
34
|
overscan: overscan
|
|
31
35
|
});
|
|
32
36
|
const refCallback = (0, _react.useCallback)(node => {
|
|
@@ -36,31 +40,34 @@ function VirtualizedList(_ref) {
|
|
|
36
40
|
(0, _react.useEffect)(() => {
|
|
37
41
|
itemVirtualizer.measure();
|
|
38
42
|
}, [itemVirtualizer, parentNode === null || parentNode === void 0 ? void 0 : parentNode.clientHeight, getDataAtIndex]);
|
|
39
|
-
return /*#__PURE__*/
|
|
43
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
40
44
|
ref: refCallback,
|
|
41
45
|
style: {
|
|
42
|
-
overflowY:
|
|
46
|
+
overflowY: 'auto',
|
|
43
47
|
maxHeight: maxHeight
|
|
44
48
|
},
|
|
45
|
-
className: "modern-scrollbars"
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
49
|
+
className: "modern-scrollbars",
|
|
50
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
51
|
+
style: {
|
|
52
|
+
height: "".concat(itemVirtualizer.getTotalSize(), "px"),
|
|
53
|
+
width: '100%',
|
|
54
|
+
position: 'relative',
|
|
55
|
+
willChange: 'transform'
|
|
56
|
+
},
|
|
57
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
58
|
+
style: {
|
|
59
|
+
position: 'absolute',
|
|
60
|
+
top: 0,
|
|
61
|
+
left: 0,
|
|
62
|
+
width: '100%',
|
|
63
|
+
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)")
|
|
64
|
+
},
|
|
65
|
+
children: virtualItems.map(virtualItem => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
66
|
+
"data-index": virtualItem.index,
|
|
67
|
+
ref: itemVirtualizer.measureElement,
|
|
68
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ItemComponent, _objectSpread(_objectSpread({}, getDataAtIndex(virtualItem.index)), props))
|
|
69
|
+
}, virtualItem.key))
|
|
70
|
+
})
|
|
71
|
+
})
|
|
72
|
+
});
|
|
66
73
|
}
|
package/dist/cjs/utils/errors.js
CHANGED
|
@@ -12,38 +12,38 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
|
|
|
12
12
|
const parseError = err => {
|
|
13
13
|
if (err === DOMException.TIMEOUT_ERR) {
|
|
14
14
|
return {
|
|
15
|
-
message:
|
|
15
|
+
message: 'Timeout error',
|
|
16
16
|
name: err
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
switch (err === null || err === void 0 ? void 0 : err.name) {
|
|
20
|
-
case
|
|
20
|
+
case 'TypeError':
|
|
21
21
|
return _objectSpread(_objectSpread({}, err), {}, {
|
|
22
|
-
message:
|
|
22
|
+
message: 'Failed to fetch data from server'
|
|
23
23
|
});
|
|
24
|
-
case
|
|
24
|
+
case 'ReadZarrError':
|
|
25
25
|
return _objectSpread(_objectSpread({}, err), {}, {
|
|
26
|
-
message:
|
|
26
|
+
message: 'Failed to read AnnData-Zarr'
|
|
27
27
|
});
|
|
28
|
-
case
|
|
28
|
+
case 'InvalidObs':
|
|
29
29
|
return _objectSpread(_objectSpread({}, err), {}, {
|
|
30
|
-
message:
|
|
30
|
+
message: 'Observation not found in dataset'
|
|
31
31
|
});
|
|
32
|
-
case
|
|
32
|
+
case 'InvalidVar':
|
|
33
33
|
return _objectSpread(_objectSpread({}, err), {}, {
|
|
34
|
-
message:
|
|
34
|
+
message: 'Feature not found in dataset'
|
|
35
35
|
});
|
|
36
|
-
case
|
|
36
|
+
case 'InvalidKey':
|
|
37
37
|
return _objectSpread(_objectSpread({}, err), {}, {
|
|
38
|
-
message:
|
|
38
|
+
message: 'Key not found in dataset'
|
|
39
39
|
});
|
|
40
|
-
case
|
|
40
|
+
case 'BadRequest':
|
|
41
41
|
return _objectSpread(_objectSpread({}, err), {}, {
|
|
42
|
-
message:
|
|
42
|
+
message: 'Invalid request to server'
|
|
43
43
|
});
|
|
44
|
-
case
|
|
44
|
+
case 'InternalServerError':
|
|
45
45
|
return _objectSpread(_objectSpread({}, err), {}, {
|
|
46
|
-
message:
|
|
46
|
+
message: 'Server error'
|
|
47
47
|
});
|
|
48
48
|
default:
|
|
49
49
|
return err;
|
|
@@ -22,13 +22,13 @@ async function fetchData(endpoint, params) {
|
|
|
22
22
|
const timeout = setTimeout(() => {
|
|
23
23
|
controller.abort(DOMException.TIMEOUT_ERR);
|
|
24
24
|
}, ms || 300000);
|
|
25
|
-
if (signal) signal.addEventListener(
|
|
25
|
+
if (signal) signal.addEventListener('abort', () => controller.abort());
|
|
26
26
|
const response = await fetch(new URL(endpoint, apiUrl), {
|
|
27
|
-
method:
|
|
28
|
-
mode:
|
|
27
|
+
method: 'POST',
|
|
28
|
+
mode: 'cors',
|
|
29
29
|
headers: {
|
|
30
|
-
|
|
31
|
-
Accept:
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
Accept: 'application/json'
|
|
32
32
|
},
|
|
33
33
|
body: JSON.stringify(params),
|
|
34
34
|
signal: controller.signal
|
|
@@ -44,12 +44,17 @@ async function fetchData(endpoint, params) {
|
|
|
44
44
|
}
|
|
45
45
|
return await response.json();
|
|
46
46
|
}
|
|
47
|
+
|
|
48
|
+
// @TODO: update to match isLoading
|
|
47
49
|
const useFetch = function (endpoint, params) {
|
|
48
50
|
let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
|
49
51
|
refetchOnMount: false,
|
|
50
52
|
refetchOnWindowFocus: false
|
|
51
53
|
};
|
|
52
54
|
let apiUrl = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
|
|
55
|
+
const {
|
|
56
|
+
retry = null
|
|
57
|
+
} = opts;
|
|
53
58
|
const {
|
|
54
59
|
data: fetchedData = null,
|
|
55
60
|
isLoading: isPending = false,
|
|
@@ -62,13 +67,13 @@ const useFetch = function (endpoint, params) {
|
|
|
62
67
|
} = _ref;
|
|
63
68
|
return fetchData(endpoint, params, signal, apiUrl);
|
|
64
69
|
},
|
|
65
|
-
retry: (failureCount, _ref2) => {
|
|
70
|
+
retry: retry || ((failureCount, _ref2) => {
|
|
66
71
|
let {
|
|
67
72
|
error
|
|
68
73
|
} = _ref2;
|
|
69
74
|
if ([400, 401, 403, 404, 422].includes(error === null || error === void 0 ? void 0 : error.status)) return false;
|
|
70
75
|
return failureCount < 3;
|
|
71
|
-
}
|
|
76
|
+
})
|
|
72
77
|
}, opts));
|
|
73
78
|
return {
|
|
74
79
|
fetchedData,
|
|
@@ -84,12 +89,17 @@ const useDebouncedFetch = function (endpoint, params) {
|
|
|
84
89
|
refetchOnWindowFocus: false
|
|
85
90
|
};
|
|
86
91
|
let apiUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
|
|
92
|
+
// Optional isEnabled function to determine if enabled based on debouncedParams instead of params
|
|
93
|
+
const {
|
|
94
|
+
enabled = true,
|
|
95
|
+
isEnabled = () => true
|
|
96
|
+
} = opts;
|
|
87
97
|
const debouncedParams = (0, _usehooks.useDebounce)(params, delay);
|
|
88
98
|
const {
|
|
89
99
|
data: fetchedData = null,
|
|
90
100
|
isLoading: isPending = false,
|
|
91
101
|
error: serverError = null
|
|
92
|
-
} = (0, _reactQuery.useQuery)(_objectSpread({
|
|
102
|
+
} = (0, _reactQuery.useQuery)(_objectSpread(_objectSpread({
|
|
93
103
|
queryKey: [endpoint, debouncedParams],
|
|
94
104
|
queryFn: _ref3 => {
|
|
95
105
|
let {
|
|
@@ -104,7 +114,9 @@ const useDebouncedFetch = function (endpoint, params) {
|
|
|
104
114
|
if ([400, 401, 403, 404, 422].includes(error === null || error === void 0 ? void 0 : error.status)) return false;
|
|
105
115
|
return failureCount < 3;
|
|
106
116
|
}
|
|
107
|
-
}, opts)
|
|
117
|
+
}, opts), {}, {
|
|
118
|
+
enabled: enabled && isEnabled(debouncedParams)
|
|
119
|
+
}));
|
|
108
120
|
return {
|
|
109
121
|
fetchedData,
|
|
110
122
|
isPending,
|
package/dist/cjs/utils/search.js
CHANGED
|
@@ -8,12 +8,12 @@ var _react = require("react");
|
|
|
8
8
|
var _requests = require("./requests");
|
|
9
9
|
var _DatasetContext = require("../context/DatasetContext");
|
|
10
10
|
const useDiseaseSearch = () => {
|
|
11
|
-
const ENDPOINT =
|
|
11
|
+
const ENDPOINT = 'diseases';
|
|
12
12
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
13
13
|
const [params, setParams] = (0, _react.useState)({
|
|
14
14
|
url: dataset.url,
|
|
15
15
|
diseaseDatasets: dataset.diseaseDatasets,
|
|
16
|
-
text:
|
|
16
|
+
text: ''
|
|
17
17
|
});
|
|
18
18
|
const data = (0, _requests.useFetch)(ENDPOINT, params, {
|
|
19
19
|
enabled: !!params.text.length,
|
|
@@ -27,12 +27,12 @@ const useDiseaseSearch = () => {
|
|
|
27
27
|
};
|
|
28
28
|
exports.useDiseaseSearch = useDiseaseSearch;
|
|
29
29
|
const useVarSearch = () => {
|
|
30
|
-
const ENDPOINT =
|
|
30
|
+
const ENDPOINT = 'var/names';
|
|
31
31
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
32
32
|
const [params, setParams] = (0, _react.useState)({
|
|
33
33
|
url: dataset.url,
|
|
34
34
|
col: dataset.varNamesCol,
|
|
35
|
-
text:
|
|
35
|
+
text: ''
|
|
36
36
|
});
|
|
37
37
|
const data = (0, _requests.useFetch)(ENDPOINT, params, {
|
|
38
38
|
enabled: !!params.text.length,
|
package/dist/cjs/utils/string.js
CHANGED
|
@@ -9,9 +9,9 @@ exports.formatString = formatString;
|
|
|
9
9
|
var _numbro = _interopRequireDefault(require("numbro"));
|
|
10
10
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
11
|
const FORMATS = exports.FORMATS = {
|
|
12
|
-
EXPONENTIAL:
|
|
13
|
-
ABBREVIATION:
|
|
14
|
-
THOUSAND:
|
|
12
|
+
EXPONENTIAL: 'exponential',
|
|
13
|
+
ABBREVIATION: 'abbreviation',
|
|
14
|
+
THOUSAND: 'thousand'
|
|
15
15
|
};
|
|
16
16
|
function formatThousand(n) {
|
|
17
17
|
let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
|
|
@@ -41,9 +41,9 @@ function formatNumerical(n) {
|
|
|
41
41
|
let format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : FORMATS.THOUSAND;
|
|
42
42
|
let precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3;
|
|
43
43
|
if (n === 0) {
|
|
44
|
-
return
|
|
44
|
+
return '0';
|
|
45
45
|
} else if (!n || n === undefined || isNaN(n)) {
|
|
46
|
-
return
|
|
46
|
+
return 'NaN';
|
|
47
47
|
}
|
|
48
48
|
switch (format) {
|
|
49
49
|
case FORMATS.EXPONENTIAL:
|
|
@@ -64,5 +64,5 @@ function formatNumerical(n) {
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
function formatString(s) {
|
|
67
|
-
return s.trim().replace(/_/g,
|
|
67
|
+
return s.trim().replace(/_/g, ' ');
|
|
68
68
|
}
|