@haniffalab/cherita-react 1.3.0 → 1.4.0-dev.2025-06-09.7cd38232
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/assets/images/plots/dotplot.svg +152 -0
- package/dist/assets/images/plots/heatmap.svg +193 -0
- package/dist/assets/images/plots/matrixplot.svg +275 -0
- package/dist/assets/images/plots/scatterplot.svg +198 -0
- package/dist/assets/images/plots/violin.svg +50 -0
- package/dist/cjs/components/dotplot/Dotplot.js +35 -5
- package/dist/cjs/components/full-page/FullPage.js +109 -50
- package/dist/cjs/components/full-page/PlotTypeSelector.js +57 -0
- package/dist/cjs/components/heatmap/Heatmap.js +35 -5
- package/dist/cjs/components/matrixplot/Matrixplot.js +35 -5
- package/dist/cjs/components/obs-list/ObsItem.js +49 -22
- package/dist/cjs/components/obs-list/ObsList.js +9 -5
- package/dist/cjs/components/scatterplot/Scatterplot.js +115 -95
- package/dist/cjs/components/scatterplot/SpatialControls.js +3 -3
- package/dist/cjs/components/search-bar/SearchInfo.js +3 -35
- package/dist/cjs/components/toolbar/Toolbar.js +102 -0
- package/dist/cjs/components/var-list/VarList.js +11 -3
- package/dist/cjs/components/violin/Violin.js +37 -6
- package/dist/cjs/constants/constants.js +14 -2
- package/dist/cjs/context/DatasetContext.js +5 -3
- package/dist/cjs/context/SettingsContext.js +77 -46
- package/dist/cjs/helpers/map-helper.js +2 -1
- package/dist/cjs/index.js +15 -21
- package/dist/css/cherita.css +76 -23
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/dotplot/Dotplot.js +36 -6
- package/dist/esm/components/full-page/FullPage.js +111 -50
- package/dist/esm/components/full-page/PlotTypeSelector.js +50 -0
- package/dist/esm/components/heatmap/Heatmap.js +36 -6
- package/dist/esm/components/matrixplot/Matrixplot.js +36 -6
- package/dist/esm/components/obs-list/ObsItem.js +49 -22
- package/dist/esm/components/obs-list/ObsList.js +9 -5
- package/dist/esm/components/scatterplot/Scatterplot.js +115 -95
- package/dist/esm/components/scatterplot/SpatialControls.js +3 -3
- package/dist/esm/components/search-bar/SearchInfo.js +1 -33
- package/dist/esm/components/toolbar/Toolbar.js +91 -0
- package/dist/esm/components/var-list/VarList.js +10 -5
- package/dist/esm/components/violin/Violin.js +39 -8
- package/dist/esm/constants/constants.js +13 -1
- package/dist/esm/context/DatasetContext.js +5 -3
- package/dist/esm/context/SettingsContext.js +77 -46
- package/dist/esm/helpers/map-helper.js +2 -1
- package/dist/esm/index.js +4 -4
- package/package.json +7 -4
- package/scss/cherita.scss +0 -1
- package/scss/components/layouts.scss +69 -1
- package/scss/components/plotly.scss +19 -14
- package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
- package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
|
@@ -49,8 +49,9 @@ const persistOptions = {
|
|
|
49
49
|
}
|
|
50
50
|
return false;
|
|
51
51
|
}
|
|
52
|
-
}
|
|
53
|
-
|
|
52
|
+
},
|
|
53
|
+
buster: "1.4.0-dev.2025-06-09.7cd38232" || "0.0.0"
|
|
54
|
+
// @TODO: add maxAge and api version numbers as buster
|
|
54
55
|
};
|
|
55
56
|
const initialDataset = {
|
|
56
57
|
url: null,
|
|
@@ -59,7 +60,8 @@ const initialDataset = {
|
|
|
59
60
|
obsGroups: null,
|
|
60
61
|
imageUrl: null,
|
|
61
62
|
defaultSettings: {},
|
|
62
|
-
canOverrideSettings: true
|
|
63
|
+
canOverrideSettings: true,
|
|
64
|
+
useUnsColors: false
|
|
63
65
|
};
|
|
64
66
|
export function DatasetProvider(_ref2) {
|
|
65
67
|
let {
|
|
@@ -8,6 +8,11 @@ import _ from "lodash";
|
|
|
8
8
|
import { COLOR_ENCODINGS, DOTPLOT_SCALES, LOCAL_STORAGE_KEY, MATRIXPLOT_SCALES, OBS_TYPES, PSEUDOSPATIAL_CATEGORICAL_MODES, VAR_SORT, VAR_SORT_ORDER, VIOLINPLOT_SCALES } from "../constants/constants";
|
|
9
9
|
export const SettingsContext = /*#__PURE__*/createContext(null);
|
|
10
10
|
export const SettingsDispatchContext = /*#__PURE__*/createContext(null);
|
|
11
|
+
|
|
12
|
+
// @TODO: consider splitting constant values and dataset-resolved values
|
|
13
|
+
// e.g. store only obs name in selectedObs, and resolved obs data (counts, values, etc.) elsewhere
|
|
14
|
+
// e.g. store only var name in selectedVar, and resolved var data (index, matrix_index) elsewhere
|
|
15
|
+
// would simplify passing and validating defaultSettings and localSettings
|
|
11
16
|
const initialSettings = {
|
|
12
17
|
selectedObs: null,
|
|
13
18
|
selectedVar: null,
|
|
@@ -56,13 +61,51 @@ const initialSettings = {
|
|
|
56
61
|
categoricalMode: PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
|
|
57
62
|
}
|
|
58
63
|
};
|
|
64
|
+
|
|
65
|
+
// validate on initialization and reducer
|
|
66
|
+
const validateSettings = settings => {
|
|
67
|
+
// make sure selectedVar is in vars
|
|
68
|
+
if (settings.selectedVar) {
|
|
69
|
+
const inVars = _.some(settings.vars, v => v.name === settings.selectedVar.name);
|
|
70
|
+
if (!inVars) {
|
|
71
|
+
settings.vars = [...settings.vars, settings.selectedVar];
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// make sure selectedMultiVar are in vars
|
|
76
|
+
if (settings.selectedMultiVar) {
|
|
77
|
+
const notInVars = _.differenceBy(settings.selectedMultiVar, settings.vars, "name");
|
|
78
|
+
if (notInVars.length) {
|
|
79
|
+
settings.vars = [...settings.vars, ...notInVars];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// make sure there's a selectedVar if colorEncoding is VAR
|
|
84
|
+
if (settings.colorEncoding === COLOR_ENCODINGS.VAR) {
|
|
85
|
+
if (!settings.selectedVar) {
|
|
86
|
+
settings.colorEncoding = null;
|
|
87
|
+
} else if (settings.selectedVar.isSet && !settings.selectedVar.vars.length) {
|
|
88
|
+
settings.selectedVar = null;
|
|
89
|
+
settings.colorEncoding = null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// make sure there's a selectedObs if colorEncoding is OBS
|
|
94
|
+
if (settings.colorEncoding === COLOR_ENCODINGS.OBS) {
|
|
95
|
+
if (!settings.selectedObs) {
|
|
96
|
+
settings.colorEncoding = null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return settings;
|
|
100
|
+
};
|
|
59
101
|
const initializer = _ref => {
|
|
60
102
|
let {
|
|
61
103
|
canOverrideSettings,
|
|
62
104
|
defaultSettings,
|
|
63
105
|
localSettings
|
|
64
106
|
} = _ref;
|
|
65
|
-
|
|
107
|
+
const mergedSettings = canOverrideSettings ? _.assign({}, initialSettings, defaultSettings, localSettings) : _.assign({}, initialSettings, defaultSettings);
|
|
108
|
+
return validateSettings(mergedSettings);
|
|
66
109
|
};
|
|
67
110
|
export function SettingsProvider(_ref2) {
|
|
68
111
|
let {
|
|
@@ -129,77 +172,65 @@ function settingsReducer(settings, action) {
|
|
|
129
172
|
}
|
|
130
173
|
case "select.var":
|
|
131
174
|
{
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
});
|
|
136
|
-
} else {
|
|
137
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
138
|
-
selectedVar: action.var,
|
|
139
|
-
vars: [...settings.vars, action.var]
|
|
140
|
-
});
|
|
141
|
-
}
|
|
175
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
176
|
+
selectedVar: action.var
|
|
177
|
+
}));
|
|
142
178
|
}
|
|
143
179
|
case "select.multivar":
|
|
144
180
|
{
|
|
145
|
-
const
|
|
146
|
-
if (
|
|
147
|
-
return
|
|
148
|
-
vars: vars
|
|
149
|
-
});
|
|
181
|
+
const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
|
|
182
|
+
if (inMultiVar) {
|
|
183
|
+
return validateSettings(_objectSpread({}, settings));
|
|
150
184
|
} else {
|
|
151
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
152
|
-
selectedMultiVar: [...settings.selectedMultiVar, action.var]
|
|
153
|
-
|
|
154
|
-
});
|
|
185
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
186
|
+
selectedMultiVar: [...settings.selectedMultiVar, action.var]
|
|
187
|
+
}));
|
|
155
188
|
}
|
|
156
189
|
}
|
|
157
190
|
case "deselect.multivar":
|
|
158
191
|
{
|
|
159
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
192
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
160
193
|
selectedMultiVar: settings.selectedMultiVar.filter(v => v !== action.var.name)
|
|
161
|
-
});
|
|
194
|
+
}));
|
|
162
195
|
}
|
|
163
196
|
case "toggle.multivar":
|
|
164
197
|
{
|
|
165
198
|
const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
|
|
166
199
|
if (inMultiVar) {
|
|
167
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
200
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
168
201
|
selectedMultiVar: settings.selectedMultiVar.filter(v => v.name !== action.var.name)
|
|
169
|
-
});
|
|
202
|
+
}));
|
|
170
203
|
} else {
|
|
171
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
204
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
172
205
|
selectedMultiVar: [...settings.selectedMultiVar, action.var]
|
|
173
|
-
});
|
|
206
|
+
}));
|
|
174
207
|
}
|
|
175
208
|
}
|
|
176
209
|
case "set.colorEncoding":
|
|
177
210
|
{
|
|
178
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
211
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
179
212
|
colorEncoding: action.value
|
|
180
|
-
});
|
|
213
|
+
}));
|
|
181
214
|
}
|
|
182
215
|
case "reset.vars":
|
|
183
216
|
{
|
|
184
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
217
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
185
218
|
vars: [],
|
|
186
219
|
selectedVar: null,
|
|
187
220
|
selectedMultiVar: []
|
|
188
|
-
});
|
|
221
|
+
}));
|
|
189
222
|
}
|
|
190
223
|
case "reset.multiVar":
|
|
191
224
|
{
|
|
192
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
193
|
-
selectedMultiVar: []
|
|
194
|
-
|
|
195
|
-
});
|
|
225
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
226
|
+
selectedMultiVar: []
|
|
227
|
+
}));
|
|
196
228
|
}
|
|
197
229
|
case "reset.var":
|
|
198
230
|
{
|
|
199
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
200
|
-
selectedVar: null
|
|
201
|
-
|
|
202
|
-
});
|
|
231
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
232
|
+
selectedVar: null
|
|
233
|
+
}));
|
|
203
234
|
}
|
|
204
235
|
case "add.var":
|
|
205
236
|
{
|
|
@@ -216,11 +247,11 @@ function settingsReducer(settings, action) {
|
|
|
216
247
|
var _settings$selectedVar;
|
|
217
248
|
const selectedVar = ((_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name) === action.var.name ? null : settings.selectedVar;
|
|
218
249
|
const selectedMultiVar = settings.selectedMultiVar.filter(v => v.name !== action.var.name);
|
|
219
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
250
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
220
251
|
vars: settings.vars.filter(a => a.name !== action.var.name),
|
|
221
252
|
selectedVar: selectedVar,
|
|
222
253
|
selectedMultiVar: selectedMultiVar
|
|
223
|
-
});
|
|
254
|
+
}));
|
|
224
255
|
}
|
|
225
256
|
case "add.varSet.var":
|
|
226
257
|
{
|
|
@@ -254,11 +285,11 @@ function settingsReducer(settings, action) {
|
|
|
254
285
|
return v;
|
|
255
286
|
}
|
|
256
287
|
});
|
|
257
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
288
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
258
289
|
vars: vars,
|
|
259
290
|
selectedVar: selectedVar,
|
|
260
291
|
selectedMultiVar: selectedMultiVar
|
|
261
|
-
});
|
|
292
|
+
}));
|
|
262
293
|
}
|
|
263
294
|
}
|
|
264
295
|
case "remove.varSet.var":
|
|
@@ -285,11 +316,11 @@ function settingsReducer(settings, action) {
|
|
|
285
316
|
var _settings$selectedVar3;
|
|
286
317
|
const selectedVar = ((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.name) === action.varSet.name ? null : settings.selectedVar;
|
|
287
318
|
const selectedMultiVar = settings.selectedMultiVar.filter(v => v.name !== action.varSet.name);
|
|
288
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
319
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
289
320
|
vars: vars,
|
|
290
321
|
selectedVar: selectedVar,
|
|
291
322
|
selectedMultiVar: selectedMultiVar
|
|
292
|
-
});
|
|
323
|
+
}));
|
|
293
324
|
} else {
|
|
294
325
|
var _settings$selectedVar4;
|
|
295
326
|
// Update selected if varSet is selected
|
|
@@ -305,11 +336,11 @@ function settingsReducer(settings, action) {
|
|
|
305
336
|
return v;
|
|
306
337
|
}
|
|
307
338
|
});
|
|
308
|
-
return _objectSpread(_objectSpread({}, settings), {}, {
|
|
339
|
+
return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
|
|
309
340
|
vars: vars,
|
|
310
341
|
selectedVar: selectedVar,
|
|
311
342
|
selectedMultiVar: selectedMultiVar
|
|
312
|
-
});
|
|
343
|
+
}));
|
|
313
344
|
}
|
|
314
345
|
}
|
|
315
346
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
export { Dotplot } from "./components/dotplot/Dotplot";
|
|
2
2
|
export { DotplotControls } from "./components/dotplot/DotplotControls";
|
|
3
|
+
export { FullPage } from "./components/full-page/FullPage";
|
|
3
4
|
export { Heatmap } from "./components/heatmap/Heatmap";
|
|
4
5
|
export { HeatmapControls } from "./components/heatmap/HeatmapControls";
|
|
5
6
|
export { Matrixplot } from "./components/matrixplot/Matrixplot";
|
|
6
7
|
export { MatrixplotControls } from "./components/matrixplot/MatrixplotControls";
|
|
7
8
|
export { ObsColsList } from "./components/obs-list/ObsList";
|
|
8
9
|
export { ObsmKeysList } from "./components/obsm-list/ObsmList";
|
|
10
|
+
export { OffcanvasControls, OffcanvasObs, OffcanvasObsm, OffcanvasVars } from "./components/offcanvas";
|
|
9
11
|
export { Pseudospatial } from "./components/pseudospatial/Pseudospatial";
|
|
10
12
|
export { Scatterplot } from "./components/scatterplot/Scatterplot";
|
|
11
13
|
export { ScatterplotControls } from "./components/scatterplot/ScatterplotControls";
|
|
12
14
|
export { SearchBar } from "./components/search-bar/SearchBar";
|
|
15
|
+
export { Toolbar } from "./components/toolbar/Toolbar";
|
|
13
16
|
export { VarNamesList } from "./components/var-list/VarList";
|
|
14
17
|
export { Violin } from "./components/violin/Violin";
|
|
15
18
|
export { ViolinControls } from "./components/violin/ViolinControls";
|
|
16
|
-
export { FullPage, FullPagePlots, FullPageScatterplot } from "./components/full-page/FullPage";
|
|
17
|
-
export { FullPagePseudospatial } from "./components/full-page/FullPagePseudospatial";
|
|
18
|
-
export { OffcanvasControls, OffcanvasObs, OffcanvasObsm, OffcanvasVars } from "./components/offcanvas";
|
|
19
19
|
export { COLORSCALES } from "./constants/colorscales";
|
|
20
|
-
export { SELECTION_MODES, VIOLIN_MODES } from "./constants/constants";
|
|
20
|
+
export { PLOT_TYPES, SELECTION_MODES, VIOLIN_MODES } from "./constants/constants";
|
|
21
21
|
export { DatasetProvider } from "./context/DatasetContext";
|
|
22
22
|
export { FilterProvider } from "./context/FilterContext";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haniffalab/cherita-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0-dev.2025-06-09.7cd38232",
|
|
4
4
|
"author": "Haniffa Lab",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"@testing-library/jest-dom": "^6.6.3",
|
|
69
69
|
"@testing-library/react": "^16.2.0",
|
|
70
70
|
"babel-jest": "^29.7.0",
|
|
71
|
+
"babel-plugin-transform-define": "^2.1.4",
|
|
71
72
|
"cpx": "^1.5.0",
|
|
72
73
|
"eslint": "^8.57.1",
|
|
73
74
|
"eslint-config-prettier": "^8.10.0",
|
|
@@ -90,7 +91,8 @@
|
|
|
90
91
|
"build:babel": "npm run build:esm && npm run build:cjs",
|
|
91
92
|
"build:scss": "sass --load-path=node_modules src/scss/cherita-bootstrap.scss dist/css/cherita.css",
|
|
92
93
|
"copy:scss": "cpx 'src/scss/**/*' 'scss'",
|
|
93
|
-
"
|
|
94
|
+
"copy:assets": "cpx 'src/assets/**/*' 'dist/assets'",
|
|
95
|
+
"build": "npm run build:babel && npm run build:scss && npm run copy:scss && npm run copy:assets",
|
|
94
96
|
"test": "jest --watchAll",
|
|
95
97
|
"test:ci": "jest --coverage --ci --no-watch",
|
|
96
98
|
"lint:scss": "stylelint 'src/**/*.scss' --fix",
|
|
@@ -125,5 +127,6 @@
|
|
|
125
127
|
"bugs": {
|
|
126
128
|
"url": "https://github.com/haniffalab/cherita-react/issues"
|
|
127
129
|
},
|
|
128
|
-
"homepage": "https://github.com/haniffalab/cherita-react#readme"
|
|
129
|
-
|
|
130
|
+
"homepage": "https://github.com/haniffalab/cherita-react#readme",
|
|
131
|
+
"prereleaseSha": "7cd382328af1f50698b9685b997517b3dcbe991a"
|
|
132
|
+
}
|
package/scss/cherita.scss
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
.cherita-app {
|
|
2
2
|
position: relative;
|
|
3
|
+
width: 100%;
|
|
3
4
|
}
|
|
4
5
|
|
|
5
6
|
.cherita-app {
|
|
@@ -50,6 +51,21 @@
|
|
|
50
51
|
overflow-y: hidden;
|
|
51
52
|
}
|
|
52
53
|
|
|
54
|
+
.sidebar-plotselector {
|
|
55
|
+
padding: 6px;
|
|
56
|
+
border-bottom: 1px solid #dee2e6;
|
|
57
|
+
|
|
58
|
+
.plotselector-icon {
|
|
59
|
+
padding-bottom: 2px;
|
|
60
|
+
cursor: pointer;
|
|
61
|
+
|
|
62
|
+
.active {
|
|
63
|
+
opacity: 1;
|
|
64
|
+
border-bottom: 2px solid #007bff;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
53
69
|
.sidebar-pseudospatial {
|
|
54
70
|
padding: 10px;
|
|
55
71
|
border-bottom: 1px solid #dee2e6;
|
|
@@ -108,6 +124,58 @@
|
|
|
108
124
|
border-left: 1px solid #dee2e6;
|
|
109
125
|
}
|
|
110
126
|
|
|
127
|
+
.cherita-app-canvas {
|
|
128
|
+
.cherita-plot {
|
|
129
|
+
height: 100%;
|
|
130
|
+
min-height: 400px;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.cherita-app-container {
|
|
135
|
+
@extend .p-0;
|
|
136
|
+
display: flex;
|
|
137
|
+
flex-wrap: nowrap;
|
|
138
|
+
width: 100%;
|
|
139
|
+
height: 100%;
|
|
140
|
+
|
|
141
|
+
.cherita-app-obs {
|
|
142
|
+
flex: 0 0 auto;
|
|
143
|
+
min-width: 350px;
|
|
144
|
+
max-width: 20%;
|
|
145
|
+
overflow-y: auto;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.cherita-app-canvas {
|
|
149
|
+
@extend .p-1;
|
|
150
|
+
flex: 1 1 auto;
|
|
151
|
+
min-width: 400px;
|
|
152
|
+
position: relative;
|
|
153
|
+
max-height: 100%;
|
|
154
|
+
display: flex;
|
|
155
|
+
flex-direction: column;
|
|
156
|
+
|
|
157
|
+
.cherita-navbar {
|
|
158
|
+
@extend .m-0;
|
|
159
|
+
@extend .d-block;
|
|
160
|
+
position: relative;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.cherita-app-sidebar {
|
|
165
|
+
flex: 0 0 auto;
|
|
166
|
+
min-width: 350px;
|
|
167
|
+
max-width: 20%;
|
|
168
|
+
position: relative;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@media (max-width: 1400px) {
|
|
172
|
+
.cherita-app-obs,
|
|
173
|
+
.cherita-app-sidebar {
|
|
174
|
+
max-width: 25%;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
111
179
|
.ps-xs-1 {
|
|
112
180
|
padding-left: 0.15rem !important;
|
|
113
|
-
}
|
|
181
|
+
}
|
|
@@ -1,30 +1,35 @@
|
|
|
1
1
|
.js-plotly-plot .plotly .modebar {
|
|
2
|
-
border-radius: 5px;
|
|
3
|
-
background-color: rgba(0, 0, 0, 0.6);
|
|
4
|
-
padding: 0 4px !important;
|
|
5
2
|
|
|
6
3
|
.modebar-group {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
@extend .bg-primary;
|
|
5
|
+
@extend .mx-1;
|
|
6
|
+
border-radius: 5px;
|
|
7
|
+
padding: 4px !important;
|
|
10
8
|
|
|
11
9
|
.modebar-btn {
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
display: inline-flex;
|
|
11
|
+
justify-content: center;
|
|
14
12
|
position: relative;
|
|
15
|
-
font-size:
|
|
16
|
-
padding:
|
|
13
|
+
font-size: 1.25rem;
|
|
14
|
+
padding: 0.25rem;
|
|
17
15
|
height: auto;
|
|
18
16
|
cursor: pointer;
|
|
19
17
|
line-height: normal;
|
|
20
18
|
|
|
21
19
|
svg {
|
|
22
20
|
position: relative;
|
|
23
|
-
top:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
top: 1px;
|
|
22
|
+
|
|
23
|
+
path {
|
|
24
|
+
fill: white !important;
|
|
25
|
+
color: white !important;
|
|
26
|
+
}
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
|
|
32
|
+
.js-plotly-plot .plotly .modebar--hover > :not(.watermark) {
|
|
33
|
+
opacity: 0.5;
|
|
34
|
+
transition: opacity 0.3s;
|
|
35
|
+
}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.FullPage = FullPage;
|
|
7
|
-
exports.FullPagePseudospatial = FullPagePseudospatial;
|
|
8
|
-
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
-
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
10
|
-
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
11
|
-
var _reactBootstrap = require("react-bootstrap");
|
|
12
|
-
var _constants = require("../../constants/constants");
|
|
13
|
-
var _DatasetContext = require("../../context/DatasetContext");
|
|
14
|
-
var _ObsList = require("../obs-list/ObsList");
|
|
15
|
-
var _offcanvas = require("../offcanvas");
|
|
16
|
-
var _Pseudospatial = require("../pseudospatial/Pseudospatial");
|
|
17
|
-
var _PseudospatialToolbar = require("../pseudospatial/PseudospatialToolbar");
|
|
18
|
-
var _Scatterplot = require("../scatterplot/Scatterplot");
|
|
19
|
-
var _ScatterplotControls = require("../scatterplot/ScatterplotControls");
|
|
20
|
-
var _SearchBar = require("../search-bar/SearchBar");
|
|
21
|
-
var _VarList = require("../var-list/VarList");
|
|
22
|
-
const _excluded = ["children", "varMode", "searchDiseases"];
|
|
23
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
24
|
-
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
25
|
-
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; }
|
|
26
|
-
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; }
|
|
27
|
-
function FullPage(_ref) {
|
|
28
|
-
let {
|
|
29
|
-
children,
|
|
30
|
-
varMode = _constants.SELECTION_MODES.SINGLE,
|
|
31
|
-
searchDiseases = false
|
|
32
|
-
} = _ref,
|
|
33
|
-
props = _objectWithoutProperties(_ref, _excluded);
|
|
34
|
-
const appRef = (0, _react.useRef)();
|
|
35
|
-
const [appDimensions, setAppDimensions] = (0, _react.useState)({
|
|
36
|
-
width: 0,
|
|
37
|
-
height: 0
|
|
38
|
-
});
|
|
39
|
-
const [showObs, setShowObs] = (0, _react.useState)(false);
|
|
40
|
-
const [showObsm, setShowObsm] = (0, _react.useState)(false);
|
|
41
|
-
const [showVars, setShowVars] = (0, _react.useState)(false);
|
|
42
|
-
const [showControls, setShowControls] = (0, _react.useState)(false);
|
|
43
|
-
const [showPseudospatialControls, setShowPseudospatialControls] = (0, _react.useState)(false);
|
|
44
|
-
const [showModal, setShowModal] = (0, _react.useState)(false);
|
|
45
|
-
const [pseudospatialPlotType, setpseudospatialPlotType] = (0, _react.useState)(null);
|
|
46
|
-
(0, _react.useEffect)(() => {
|
|
47
|
-
const updateDimensions = () => {
|
|
48
|
-
if (appRef.current) {
|
|
49
|
-
// Get the distance from the top of the page to the target element
|
|
50
|
-
const rect = appRef.current.getBoundingClientRect();
|
|
51
|
-
const distanceFromTop = rect.top + window.scrollY;
|
|
52
|
-
|
|
53
|
-
// Calculate the available height for the Cherita app
|
|
54
|
-
const availableHeight = window.innerHeight - distanceFromTop;
|
|
55
|
-
|
|
56
|
-
// Update the dimensions to fit the viewport minus the navbar height
|
|
57
|
-
setAppDimensions({
|
|
58
|
-
width: appRef.current.offsetWidth,
|
|
59
|
-
height: availableHeight
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
window.addEventListener("resize", updateDimensions);
|
|
64
|
-
updateDimensions(); // Initial update
|
|
65
|
-
return () => window.removeEventListener("resize", updateDimensions);
|
|
66
|
-
}, []);
|
|
67
|
-
return /*#__PURE__*/_react.default.createElement("div", {
|
|
68
|
-
ref: appRef,
|
|
69
|
-
className: "cherita-app",
|
|
70
|
-
style: {
|
|
71
|
-
height: appDimensions.height
|
|
72
|
-
}
|
|
73
|
-
}, /*#__PURE__*/_react.default.createElement(_DatasetContext.DatasetProvider, props, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Container, {
|
|
74
|
-
fluid: true,
|
|
75
|
-
className: "d-flex g-0",
|
|
76
|
-
style: {
|
|
77
|
-
height: appDimensions.height
|
|
78
|
-
}
|
|
79
|
-
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
80
|
-
className: "cherita-app-obs modern-scrollbars border-end h-100"
|
|
81
|
-
}, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, props)), /*#__PURE__*/_react.default.createElement("div", {
|
|
82
|
-
className: "cherita-app-canvas flex-grow-1"
|
|
83
|
-
}, children({
|
|
84
|
-
setShowObs,
|
|
85
|
-
setShowVars
|
|
86
|
-
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
87
|
-
className: "cherita-app-sidebar p-3"
|
|
88
|
-
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Header, {
|
|
89
|
-
className: "d-flex justify-content-evenly align-items-center"
|
|
90
|
-
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
91
|
-
variant: "link",
|
|
92
|
-
onClick: () => setShowModal(true)
|
|
93
|
-
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
94
|
-
icon: _freeSolidSvgIcons.faArrowUpRightFromSquare
|
|
95
|
-
}))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Body, {
|
|
96
|
-
className: "d-flex flex-column p-0"
|
|
97
|
-
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
98
|
-
className: "sidebar-pseudospatial"
|
|
99
|
-
}, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, {
|
|
100
|
-
className: "sidebar-pseudospatial",
|
|
101
|
-
plotType: pseudospatialPlotType,
|
|
102
|
-
setPlotType: setpseudospatialPlotType,
|
|
103
|
-
setShowControls: setShowPseudospatialControls
|
|
104
|
-
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
105
|
-
className: "sidebar-features modern-scrollbars"
|
|
106
|
-
}, /*#__PURE__*/_react.default.createElement(_SearchBar.SearchBar, {
|
|
107
|
-
searchDiseases: searchDiseases,
|
|
108
|
-
searchVar: true
|
|
109
|
-
}), /*#__PURE__*/_react.default.createElement(_VarList.VarNamesList, {
|
|
110
|
-
mode: varMode
|
|
111
|
-
})))))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
|
|
112
|
-
show: showModal,
|
|
113
|
-
onHide: () => setShowModal(false),
|
|
114
|
-
centered: true
|
|
115
|
-
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Header, {
|
|
116
|
-
closeButton: true
|
|
117
|
-
}), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, null, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, {
|
|
118
|
-
plotType: pseudospatialPlotType,
|
|
119
|
-
setPlotType: setpseudospatialPlotType,
|
|
120
|
-
setShowControls: setShowPseudospatialControls,
|
|
121
|
-
height: 500
|
|
122
|
-
}))), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObs, {
|
|
123
|
-
show: showObs,
|
|
124
|
-
handleClose: () => setShowObs(false)
|
|
125
|
-
}), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasVars, {
|
|
126
|
-
show: showVars,
|
|
127
|
-
handleClose: () => setShowVars(false),
|
|
128
|
-
mode: varMode
|
|
129
|
-
}), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
|
|
130
|
-
show: showControls,
|
|
131
|
-
handleClose: () => setShowControls(false),
|
|
132
|
-
Controls: _ScatterplotControls.ScatterplotControls
|
|
133
|
-
}), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
|
|
134
|
-
show: showPseudospatialControls,
|
|
135
|
-
handleClose: () => setShowPseudospatialControls(false),
|
|
136
|
-
Controls: _PseudospatialToolbar.PseudospatialToolbar,
|
|
137
|
-
plotType: pseudospatialPlotType
|
|
138
|
-
}), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObsm, {
|
|
139
|
-
show: showObsm,
|
|
140
|
-
handleClose: () => setShowObsm(false)
|
|
141
|
-
}))));
|
|
142
|
-
}
|
|
143
|
-
function FullPagePseudospatial(props) {
|
|
144
|
-
return /*#__PURE__*/_react.default.createElement(FullPage, _extends({}, props, {
|
|
145
|
-
varMode: _constants.SELECTION_MODES.SINGLE
|
|
146
|
-
}), _ref2 => {
|
|
147
|
-
let {
|
|
148
|
-
setShowObs,
|
|
149
|
-
setShowVars
|
|
150
|
-
} = _ref2;
|
|
151
|
-
return /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, {
|
|
152
|
-
setShowObs: setShowObs,
|
|
153
|
-
setShowVars: setShowVars,
|
|
154
|
-
isFullscreen: true
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
}
|