@haniffalab/cherita-react 0.2.0-dev.2024-09-26.d9293c4c → 0.2.0-dev.2024-09-26.ab815be6

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.
@@ -5,28 +5,97 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.VarNamesList = VarNamesList;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
+ var _iconsMaterial = require("@mui/icons-material");
8
9
  var _lodash = _interopRequireDefault(require("lodash"));
9
10
  var _reactBootstrap = require("react-bootstrap");
10
11
  var _VarItem = require("./VarItem");
12
+ var _VarSet = require("./VarSet");
11
13
  var _constants = require("../../constants/constants");
12
14
  var _DatasetContext = require("../../context/DatasetContext");
15
+ var _requests = require("../../utils/requests");
13
16
  var _jsxRuntime = require("react/jsx-runtime");
14
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
18
  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); }
16
19
  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; }
17
- function VarNamesList(_ref) {
18
- var _dataset$selectedVar, _dataset$selectedDise, _dataset$selectedDise2, _dataset$selectedDise3;
20
+ function DiseaseVarList(_ref) {
21
+ var _dataset$selectedDise, _dataset$selectedDise3;
19
22
  let {
20
- mode = _constants.SELECTION_MODES.SINGLE,
21
- displayName = "genes"
23
+ makeListItem
22
24
  } = _ref;
25
+ const ENDPOINT = "disease/genes";
23
26
  const dataset = (0, _DatasetContext.useDataset)();
24
27
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
25
- const [varButtons, setVarButtons] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? dataset.selectedVar ? [dataset.selectedVar] : [] : dataset.selectedMultiVar);
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
+ const [diseaseVars, setDiseaseVars] = (0, _react.useState)([]);
29
+ const [params, setParams] = (0, _react.useState)({
30
+ url: dataset.url,
31
+ col: dataset.varNamesCol,
32
+ diseaseId: (_dataset$selectedDise = dataset.selectedDisease) === null || _dataset$selectedDise === void 0 ? void 0 : _dataset$selectedDise.id,
33
+ diseaseDatasets: dataset.diseaseDatasets
34
+ });
35
+ (0, _react.useEffect)(() => {
36
+ setParams(p => {
37
+ var _dataset$selectedDise2;
38
+ return {
39
+ ...p,
40
+ diseaseId: (_dataset$selectedDise2 = dataset.selectedDisease) === null || _dataset$selectedDise2 === void 0 ? void 0 : _dataset$selectedDise2.id
41
+ };
42
+ });
43
+ }, [dataset.selectedDisease]);
44
+ const {
45
+ fetchedData,
46
+ isPending,
47
+ serverError
48
+ } = (0, _requests.useFetch)(ENDPOINT, params, {
49
+ enabled: !!params.diseaseId
50
+ });
51
+ (0, _react.useEffect)(() => {
52
+ if (!isPending && !serverError) {
53
+ setDiseaseVars(fetchedData);
54
+ }
55
+ }, [fetchedData, isPending, serverError]);
56
+ const diseaseVarList = _lodash.default.map(diseaseVars, item => {
57
+ return makeListItem(item, true);
58
+ });
59
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
60
+ children: dataset.selectedDisease && (!diseaseVars.length ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
61
+ variant: "light",
62
+ children: "No disease genes found."
63
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
64
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
65
+ className: "d-flex justify-content-between mt-3",
66
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
67
+ children: "Disease genes"
68
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
69
+ variant: "link",
70
+ onClick: () => {
71
+ dispatch({
72
+ type: "reset.disease"
73
+ });
74
+ },
75
+ children: "clear"
76
+ })]
77
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
78
+ children: (_dataset$selectedDise3 = dataset.selectedDisease) === null || _dataset$selectedDise3 === void 0 ? void 0 : _dataset$selectedDise3.name
79
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
80
+ children: diseaseVarList
81
+ })]
82
+ }))
83
+ });
84
+ }
85
+ function VarNamesList(_ref2) {
86
+ var _dataset$selectedVar, _dataset$selectedVar2, _dataset$selectedVar6, _dataset$selectedVar7;
87
+ let {
88
+ mode = _constants.SELECTION_MODES.SINGLE,
89
+ displayName = "genes",
90
+ showDiseaseVarList = true
91
+ } = _ref2;
92
+ const dataset = (0, _DatasetContext.useDataset)();
93
+ const dispatch = (0, _DatasetContext.useDatasetDispatch)();
94
+ const [varButtons, setVarButtons] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? dataset.selectedVar ? _lodash.default.unionWith([dataset.selectedVar], dataset.varSets, _lodash.default.isEqual) : [...dataset.varSets] : [...dataset.selectedMultiVar, ...dataset.varSets]);
95
+ 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$selectedVar2 = dataset.selectedVar) === null || _dataset$selectedVar2 === void 0 ? void 0 : _dataset$selectedVar2.name) : dataset.selectedMultiVar.map(i => i.matrix_index || i.name));
27
96
  (0, _react.useEffect)(() => {
28
97
  if (mode === _constants.SELECTION_MODES.SINGLE) {
29
- var _dataset$selectedVar2;
98
+ var _dataset$selectedVar3, _dataset$selectedVar4;
30
99
  setVarButtons(v => {
31
100
  if (dataset.selectedVar) {
32
101
  return _lodash.default.unionWith(v, [dataset.selectedVar], _lodash.default.isEqual);
@@ -34,7 +103,7 @@ function VarNamesList(_ref) {
34
103
  return v;
35
104
  }
36
105
  });
37
- setActive((_dataset$selectedVar2 = dataset.selectedVar) === null || _dataset$selectedVar2 === void 0 ? void 0 : _dataset$selectedVar2.matrix_index);
106
+ setActive(((_dataset$selectedVar3 = dataset.selectedVar) === null || _dataset$selectedVar3 === void 0 ? void 0 : _dataset$selectedVar3.matrix_index) || ((_dataset$selectedVar4 = dataset.selectedVar) === null || _dataset$selectedVar4 === void 0 ? void 0 : _dataset$selectedVar4.name));
38
107
  }
39
108
  }, [mode, dataset.selectedVar]);
40
109
  (0, _react.useEffect)(() => {
@@ -46,9 +115,35 @@ function VarNamesList(_ref) {
46
115
  return v;
47
116
  }
48
117
  });
49
- setActive(dataset.selectedMultiVar.map(i => i.matrix_index));
118
+ setActive(dataset.selectedMultiVar.map(i => i.matrix_index || i.name));
50
119
  }
51
120
  }, [mode, dataset.selectedMultiVar]);
121
+ (0, _react.useEffect)(() => {
122
+ setVarButtons(v => {
123
+ const updated = _lodash.default.map(v, i => {
124
+ if (i.isSet) {
125
+ return dataset.varSets.find(s => s.name === i.name);
126
+ } else return i;
127
+ });
128
+ const newSets = _lodash.default.difference(dataset.varSets, updated);
129
+ return [...updated, ...newSets];
130
+ });
131
+ if (mode === _constants.SELECTION_MODES.SINGLE) {
132
+ var _dataset$selectedVar5;
133
+ if ((_dataset$selectedVar5 = dataset.selectedVar) !== null && _dataset$selectedVar5 !== void 0 && _dataset$selectedVar5.isSet) {
134
+ const selectedSet = dataset.varSets.find(s => s.name === dataset.selectedVar.name);
135
+ dispatch({
136
+ type: "select.var",
137
+ var: selectedSet
138
+ });
139
+ }
140
+ } else {
141
+ dispatch({
142
+ type: "update.multivar",
143
+ vars: dataset.varSets
144
+ });
145
+ }
146
+ }, [mode, dataset.varSets, (_dataset$selectedVar6 = dataset.selectedVar) === null || _dataset$selectedVar6 === void 0 ? void 0 : _dataset$selectedVar6.isSet, (_dataset$selectedVar7 = dataset.selectedVar) === null || _dataset$selectedVar7 === void 0 ? void 0 : _dataset$selectedVar7.name, dispatch]);
52
147
  const makeListItem = function (item) {
53
148
  let isDiseaseGene = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
54
149
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
@@ -61,12 +156,34 @@ function VarNamesList(_ref) {
61
156
  })
62
157
  }, item.matrix_index);
63
158
  };
159
+ const makeSetListItem = set => {
160
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
161
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VarSet.VarSet, {
162
+ set: set,
163
+ active: active,
164
+ mode: mode
165
+ })
166
+ }, set.name);
167
+ };
64
168
  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);
169
+ if (item.isSet) {
170
+ return makeSetListItem(item);
171
+ } else {
172
+ return makeListItem(item);
173
+ }
69
174
  });
175
+ const newSetName = () => {
176
+ let n = 1;
177
+ let setName = "Set ".concat(n);
178
+ const setNameExists = name => {
179
+ return dataset.varSets.some(set => set.name === name);
180
+ };
181
+ while (setNameExists(setName)) {
182
+ n++;
183
+ setName = "Set ".concat(n);
184
+ }
185
+ return setName;
186
+ };
70
187
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
71
188
  className: "position-relative",
72
189
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
@@ -75,44 +192,43 @@ function VarNamesList(_ref) {
75
192
  className: "d-flex justify-content-between",
76
193
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
77
194
  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, {
97
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
98
- className: "d-flex justify-content-between mt-3",
99
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
100
- children: "Disease genes"
195
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
196
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Button, {
197
+ variant: "light",
198
+ className: "p-1",
199
+ onClick: () => {
200
+ dispatch({
201
+ type: "add.varSet",
202
+ varSet: {
203
+ name: newSetName(),
204
+ vars: [],
205
+ isSet: true
206
+ }
207
+ });
208
+ },
209
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_iconsMaterial.Add, {}), "New set"]
101
210
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
102
211
  variant: "link",
103
212
  onClick: () => {
213
+ setVarButtons([]);
104
214
  dispatch({
105
- type: "reset.disease"
215
+ type: mode === _constants.SELECTION_MODES.SINGLE ? "reset.var" : "reset.multiVar"
216
+ });
217
+ dispatch({
218
+ type: "reset.varSets"
106
219
  });
107
220
  },
108
221
  children: "clear"
109
222
  })]
110
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
111
- children: (_dataset$selectedDise3 = dataset.selectedDisease) === null || _dataset$selectedDise3 === void 0 ? void 0 : _dataset$selectedDise3.name
112
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
113
- children: diseaseVarList
114
223
  })]
115
- }))]
224
+ }), !varList.length ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
225
+ variant: "light",
226
+ children: "Search for a feature."
227
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
228
+ children: varList
229
+ }), showDiseaseVarList && /*#__PURE__*/(0, _jsxRuntime.jsx)(DiseaseVarList, {
230
+ makeListItem: makeListItem
231
+ })]
116
232
  })
117
233
  });
118
234
  }
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.VarSet = VarSet;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
+ var _iconsMaterial = require("@mui/icons-material");
11
+ var _lodash = _interopRequireDefault(require("lodash"));
12
+ var _reactBootstrap = require("react-bootstrap");
13
+ var _VarItem = require("./VarItem");
14
+ var _constants = require("../../constants/constants");
15
+ var _DatasetContext = require("../../context/DatasetContext");
16
+ var _SearchBar = require("../search-bar/SearchBar");
17
+ var _jsxRuntime = require("react/jsx-runtime");
18
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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); }
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; }
21
+ const addVarToSet = (dispatch, set, v) => {
22
+ dispatch({
23
+ type: "add.varSet.var",
24
+ varSet: set,
25
+ var: v
26
+ });
27
+ };
28
+ function SingleSelectionSet(_ref) {
29
+ let {
30
+ set,
31
+ isActive,
32
+ selectSet,
33
+ removeSet,
34
+ removeSetVar,
35
+ showSearchBar = true
36
+ } = _ref;
37
+ const [openSet, setOpenSet] = (0, _react.useState)(false);
38
+ const varList = set.vars.length ? _lodash.default.map(set.vars, v => {
39
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
40
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VarItem.SingleSelectionItem, {
41
+ item: v,
42
+ showSetColorEncoding: false,
43
+ removeVar: () => removeSetVar(v)
44
+ })
45
+ }, v.name);
46
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
47
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
48
+ className: "text-muted",
49
+ children: "No features in this set"
50
+ })
51
+ });
52
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
53
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
54
+ className: "d-flex justify-content-between cursor-pointer",
55
+ onClick: () => {
56
+ setOpenSet(o => !o);
57
+ },
58
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
59
+ className: "d-flex justify-content-between align-items-center w-100",
60
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
61
+ children: set.name
62
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
63
+ className: "d-flex align-items-center gap-1",
64
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.OverlayTrigger, {
65
+ placement: "top",
66
+ overlay: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Tooltip, {
67
+ children: "This set represents the mean value of its features"
68
+ }),
69
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
70
+ icon: _freeSolidSvgIcons.faCircleInfo
71
+ })
72
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_iconsMaterial.List, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
73
+ type: "button",
74
+ variant: isActive ? "primary" : "outline-primary",
75
+ className: "m-0 p-0 px-1",
76
+ onClick: e => {
77
+ e.stopPropagation();
78
+ selectSet();
79
+ },
80
+ disabled: !set.vars.length,
81
+ title: "Set as color encoding",
82
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
83
+ icon: _freeSolidSvgIcons.faDroplet
84
+ })
85
+ }, set.name), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
86
+ type: "button",
87
+ className: "m-0 p-0 px-1",
88
+ variant: "outline-secondary",
89
+ title: "Remove from list",
90
+ onClick: e => {
91
+ e.stopPropagation();
92
+ removeSet();
93
+ },
94
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
95
+ icon: _freeSolidSvgIcons.faTrash
96
+ })
97
+ })]
98
+ })]
99
+ })
100
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Collapse, {
101
+ in: openSet,
102
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
103
+ className: "mt-2",
104
+ children: [showSearchBar &&
105
+ /*#__PURE__*/
106
+ // @TODO: fix how results are displayed, should be placed on top of parent components
107
+ (0, _jsxRuntime.jsx)(_SearchBar.SearchBar, {
108
+ handleSelect: (d, i) => addVarToSet(d, set, i)
109
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
110
+ className: "mx-2",
111
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
112
+ variant: "flush",
113
+ children: varList
114
+ })
115
+ })]
116
+ })
117
+ })]
118
+ });
119
+ }
120
+ function MultipleSelectionSet(_ref2) {
121
+ let {
122
+ set,
123
+ isActive,
124
+ toggleSet
125
+ } = _ref2;
126
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
127
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
128
+ className: "d-flex",
129
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
130
+ className: "flex-grow-1",
131
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
132
+ type: "button",
133
+ variant: isActive ? "primary" : "outline-primary",
134
+ className: "m-0 p-0 px-1",
135
+ onClick: toggleSet,
136
+ title: set.name,
137
+ children: set.name
138
+ }, set.name)
139
+ })
140
+ })
141
+ });
142
+ }
143
+ function VarSet(_ref3) {
144
+ let {
145
+ set,
146
+ active,
147
+ mode = _constants.SELECTION_MODES.SINGLE
148
+ } = _ref3;
149
+ const dataset = (0, _DatasetContext.useDataset)();
150
+ const dispatch = (0, _DatasetContext.useDatasetDispatch)();
151
+ const selectSet = () => {
152
+ if (mode === _constants.SELECTION_MODES.SINGLE) {
153
+ dispatch({
154
+ type: "select.var",
155
+ var: set
156
+ });
157
+ dispatch({
158
+ type: "set.colorEncoding",
159
+ value: "var"
160
+ });
161
+ } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
162
+ dispatch({
163
+ type: "select.multivar",
164
+ var: set
165
+ });
166
+ }
167
+ };
168
+ const removeSet = () => {
169
+ if (mode === _constants.SELECTION_MODES.SINGLE) {
170
+ if (active === set.name) {
171
+ dispatch({
172
+ type: "reset.var"
173
+ });
174
+ }
175
+ } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
176
+ if (active.includes(set.name)) {
177
+ dispatch({
178
+ type: "deselect.multivar",
179
+ var: set
180
+ });
181
+ }
182
+ }
183
+ dispatch({
184
+ type: "remove.varSet",
185
+ varSet: set
186
+ });
187
+ };
188
+ const removeSetVar = v => {
189
+ dispatch({
190
+ type: "remove.varSet.var",
191
+ varSet: set,
192
+ var: v
193
+ });
194
+ };
195
+ const toggleSet = () => {
196
+ if (active.includes(set.name)) {
197
+ dispatch({
198
+ type: "deselect.multivar",
199
+ var: set
200
+ });
201
+ } else {
202
+ selectSet();
203
+ }
204
+ };
205
+ if (set && mode === _constants.SELECTION_MODES.SINGLE) {
206
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(SingleSelectionSet, {
207
+ set: set,
208
+ isActive: dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR && active === set.name,
209
+ selectSet: selectSet,
210
+ removeSet: removeSet,
211
+ removeSetVar: v => removeSetVar(v)
212
+ });
213
+ } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
214
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(MultipleSelectionSet, {
215
+ set: set,
216
+ isActive: _lodash.default.includes(active, set.name),
217
+ toggleSet: () => toggleSet(set)
218
+ });
219
+ } else {
220
+ return null;
221
+ }
222
+ }
@@ -19,7 +19,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
19
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); }
20
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; }
21
21
  function Violin(_ref) {
22
- var _dataset$selectedObs, _dataset$selectedObs2, _dataset$selectedObs3;
22
+ var _dataset$selectedVar, _dataset$selectedVar2, _dataset$selectedVar3, _dataset$selectedVar4, _dataset$selectedObs, _dataset$selectedObs2, _dataset$selectedObs3;
23
23
  let {
24
24
  mode = _constants.VIOLIN_MODES.MULTIKEY
25
25
  } = _ref;
@@ -28,21 +28,31 @@ function Violin(_ref) {
28
28
  const [data, setData] = (0, _react.useState)([]);
29
29
  const [layout, setLayout] = (0, _react.useState)({});
30
30
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
31
- const [params, setParams] = (0, _react.useState)(mode === _constants.VIOLIN_MODES.MULTIKEY ? {
31
+ const [params, setParams] = (0, _react.useState)({
32
32
  url: dataset.url,
33
- keys: [],
34
- scale: dataset.controls.standardScale,
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
33
+ mode: mode,
34
+ scale: dataset.controls.scale.violinplot.value,
35
+ varNamesCol: dataset.varNamesCol,
36
+ ...{
37
+ [_constants.VIOLIN_MODES.MULTIKEY]: {
38
+ varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
39
+ name: i.name,
40
+ indices: i.vars.map(v => v.index)
41
+ } : i.index),
42
+ obsKeys: [] // @TODO: implement
43
+ },
44
+ [_constants.VIOLIN_MODES.GROUPBY]: {
45
+ varKey: (_dataset$selectedVar = dataset.selectedVar) !== null && _dataset$selectedVar !== void 0 && _dataset$selectedVar.isSet ? {
46
+ name: (_dataset$selectedVar2 = dataset.selectedVar) === null || _dataset$selectedVar2 === void 0 ? void 0 : _dataset$selectedVar2.name,
47
+ indices: (_dataset$selectedVar3 = dataset.selectedVar) === null || _dataset$selectedVar3 === void 0 ? void 0 : _dataset$selectedVar3.vars.map(v => v.index)
48
+ } : (_dataset$selectedVar4 = dataset.selectedVar) === null || _dataset$selectedVar4 === void 0 ? void 0 : _dataset$selectedVar4.index,
49
+ obsCol: dataset.selectedObs,
50
+ 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 => {
51
+ var _dataset$selectedObs4;
52
+ return (_dataset$selectedObs4 = dataset.selectedObs) === null || _dataset$selectedObs4 === void 0 ? void 0 : _dataset$selectedObs4.codesMap[c];
53
+ })
54
+ }
55
+ }[mode]
46
56
  });
47
57
  // @TODO: set default scale
48
58
 
@@ -57,8 +67,12 @@ function Violin(_ref) {
57
67
  return {
58
68
  ...p,
59
69
  url: dataset.url,
60
- keys: dataset.selectedMultiVar.map(i => i.index),
61
- scale: dataset.controls.standardScale,
70
+ mode: mode,
71
+ varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
72
+ name: i.name,
73
+ indices: i.vars.map(v => v.index)
74
+ } : i.index),
75
+ scale: dataset.controls.scale.violinplot.value,
62
76
  varNamesCol: dataset.varNamesCol
63
77
  };
64
78
  });
@@ -69,28 +83,32 @@ function Violin(_ref) {
69
83
  setHasSelections(false);
70
84
  }
71
85
  setParams(p => {
72
- var _dataset$selectedObs5, _dataset$selectedObs6, _dataset$selectedObs7;
86
+ var _dataset$selectedVar5, _dataset$selectedVar6, _dataset$selectedVar7, _dataset$selectedVar8, _dataset$selectedObs5, _dataset$selectedObs6, _dataset$selectedObs7;
73
87
  return {
74
88
  ...p,
75
89
  url: dataset.url,
76
- keys: dataset.selectedVar.index,
77
- selectedObs: dataset.selectedObs,
90
+ mode: mode,
91
+ varKey: (_dataset$selectedVar5 = dataset.selectedVar) !== null && _dataset$selectedVar5 !== void 0 && _dataset$selectedVar5.isSet ? {
92
+ name: (_dataset$selectedVar6 = dataset.selectedVar) === null || _dataset$selectedVar6 === void 0 ? void 0 : _dataset$selectedVar6.name,
93
+ indices: (_dataset$selectedVar7 = dataset.selectedVar) === null || _dataset$selectedVar7 === void 0 ? void 0 : _dataset$selectedVar7.vars.map(v => v.index)
94
+ } : (_dataset$selectedVar8 = dataset.selectedVar) === null || _dataset$selectedVar8 === void 0 ? void 0 : _dataset$selectedVar8.index,
95
+ obsCol: dataset.selectedObs,
78
96
  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
97
  var _dataset$selectedObs8;
80
98
  return (_dataset$selectedObs8 = dataset.selectedObs) === null || _dataset$selectedObs8 === void 0 ? void 0 : _dataset$selectedObs8.codesMap[c];
81
99
  }),
82
- scale: dataset.controls.standardScale,
100
+ scale: dataset.controls.scale.violinplot.value,
83
101
  varNamesCol: dataset.varNamesCol
84
102
  };
85
103
  });
86
104
  }
87
- }, [dataset.controls.standardScale, dataset.selectedMultiVar, dataset.selectedObs, dataset.selectedVar, dataset.url, dataset.varNamesCol, mode]);
105
+ }, [dataset.controls.scale.violinplot.value, dataset.selectedMultiVar, dataset.selectedObs, dataset.selectedVar, dataset.url, dataset.varNamesCol, mode]);
88
106
  const {
89
107
  fetchedData,
90
108
  isPending,
91
109
  serverError
92
110
  } = (0, _requests.useDebouncedFetch)(ENDPOINT, params, 500, {
93
- enabled: mode === _constants.VIOLIN_MODES.MULTIKEY && !!params.keys || mode === _constants.VIOLIN_MODES.GROUPBY && !!params.keys.length && !!params.selectedObs
111
+ enabled: mode === _constants.VIOLIN_MODES.MULTIKEY && (!!params.varKeys.length || !!params.obsKeys.length) || mode === _constants.VIOLIN_MODES.GROUPBY && !!params.varKey && !!params.obsCol
94
112
  });
95
113
  (0, _react.useEffect)(() => {
96
114
  if (hasSelections && !isPending && !serverError) {
@@ -102,9 +120,7 @@ function Violin(_ref) {
102
120
  if (hasSelections) {
103
121
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
104
122
  className: "cherita-violin position-relative",
105
- children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
106
- children: mode
107
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
123
+ children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
108
124
  data: data,
109
125
  layout: layout,
110
126
  useResizeHandler: true,
@@ -4,44 +4,39 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ViolinControls = ViolinControls;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
8
9
  var _reactBootstrap = require("react-bootstrap");
9
10
  var _constants = require("../../constants/constants");
10
11
  var _DatasetContext = require("../../context/DatasetContext");
11
12
  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; }
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
14
  function ViolinControls() {
15
15
  const dataset = (0, _DatasetContext.useDataset)();
16
16
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
17
- const [activeStandardScale, setActiveStandardScale] = (0, _react.useState)(dataset.controls.standardScale);
18
- (0, _react.useEffect)(() => {
19
- if (dataset.controls.standardScale) {
20
- setActiveStandardScale(_constants.VIOLINPLOT_STANDARDSCALES.find(obs => obs.value === dataset.controls.standardScale).name);
21
- }
22
- }, [dataset.controls.standardScale]);
23
- const standardScaleList = _constants.VIOLINPLOT_STANDARDSCALES.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
24
- active: activeStandardScale === item.value,
17
+ const scaleList = _lodash.default.values(_constants.VIOLINPLOT_SCALES).map(scale => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
18
+ active: dataset.controls.scale.violinplot === scale,
25
19
  onClick: () => {
26
20
  dispatch({
27
- type: "set.controls.standardScale",
28
- standardScale: item.value
21
+ type: "set.controls.scale",
22
+ plot: "violinplot",
23
+ scale: scale
29
24
  });
30
25
  },
31
- children: item.name
32
- }, item.value));
26
+ children: scale.name
27
+ }, scale.value));
33
28
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ButtonToolbar, {
34
29
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ButtonGroup, {
35
30
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.InputGroup, {
36
31
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.InputGroup.Text, {
37
- children: "Standard scale"
32
+ children: "Scale"
38
33
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown, {
39
34
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Toggle, {
40
35
  id: "dropdownStandardScale",
41
36
  variant: "light",
42
- children: activeStandardScale
37
+ children: dataset.controls.scale.violinplot.name
43
38
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Menu, {
44
- children: standardScaleList
39
+ children: scaleList
45
40
  })]
46
41
  })]
47
42
  })