@haniffalab/cherita-react 0.2.0-dev.2024-05-09.97c686f2 → 0.2.0-dev.2024-05-21.ca7d726c

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.
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SearchBar = SearchBar;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
9
+ var _reactBootstrap = require("react-bootstrap");
10
+ var _SearchResults = require("./SearchResults");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ 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); }
14
+ 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 && Object.prototype.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; }
15
+ function SearchBar(_ref) {
16
+ let {
17
+ searchVar = true,
18
+ searchDiseases = false
19
+ } = _ref;
20
+ const [showSuggestions, setShowSuggestions] = (0, _react.useState)(false);
21
+ const [text, setText] = (0, _react.useState)("");
22
+ const inputRef = (0, _react.useRef)(null);
23
+ const displayText = [...(searchVar ? ["features"] : []), ...(searchDiseases ? ["diseases"] : [])].join(" and ");
24
+ (0, _react.useEffect)(() => {
25
+ if (text.length > 0) {
26
+ setShowSuggestions(true);
27
+ }
28
+ }, [text]);
29
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
30
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form, {
31
+ onSubmit: e => {
32
+ e.preventDefault();
33
+ },
34
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.FormGroup, {
35
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Control, {
36
+ ref: inputRef,
37
+ onFocus: () => {
38
+ setShowSuggestions(text.length > 0);
39
+ },
40
+ onBlur: () => {
41
+ _lodash.default.delay(() => {
42
+ setShowSuggestions(false);
43
+ }, 150);
44
+ },
45
+ type: "text",
46
+ placeholder: "Search " + displayText,
47
+ value: text,
48
+ onChange: e => {
49
+ setText(e.target.value);
50
+ }
51
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown, {
52
+ show: showSuggestions,
53
+ onMouseDown: e => {
54
+ e.preventDefault();
55
+ },
56
+ onSelect: () => {
57
+ inputRef.current.blur();
58
+ },
59
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown.Menu, {
60
+ style: {
61
+ width: "90%"
62
+ },
63
+ children: [searchVar && /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchResults.VarSearchResults, {
64
+ text: text,
65
+ setShowSuggestions: setShowSuggestions
66
+ }), searchVar && searchDiseases && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Divider, {}), searchDiseases && /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchResults.DiseasesSearchResults, {
67
+ text: text,
68
+ setShowSuggestions: setShowSuggestions
69
+ })]
70
+ })
71
+ })]
72
+ })
73
+ })
74
+ });
75
+ }
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DiseasesSearchResults = DiseasesSearchResults;
7
+ exports.VarSearchResults = VarSearchResults;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _lodash = _interopRequireDefault(require("lodash"));
10
+ var _reactBootstrap = require("react-bootstrap");
11
+ var _DatasetContext = require("../../context/DatasetContext");
12
+ var _search = require("../../utils/search");
13
+ var _jsxRuntime = require("react/jsx-runtime");
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+ 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
+ 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 && Object.prototype.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 VarSearchResults(_ref) {
18
+ let {
19
+ text,
20
+ setShowSuggestions
21
+ } = _ref;
22
+ const [suggestions, setSuggestions] = (0, _react.useState)([]);
23
+ const {
24
+ setParams,
25
+ data: {
26
+ fetchedData = [],
27
+ isPending,
28
+ serverError
29
+ },
30
+ onSelect
31
+ } = (0, _search.useVarSearch)();
32
+ const deferredData = (0, _react.useDeferredValue)(suggestions);
33
+ const isStale = deferredData !== fetchedData;
34
+ const updateParams = (0, _react.useMemo)(() => {
35
+ const setData = text => {
36
+ if (text.length) {
37
+ setParams(p => {
38
+ return {
39
+ ...p,
40
+ text: text
41
+ };
42
+ });
43
+ } else {
44
+ setSuggestions([]);
45
+ setShowSuggestions(false);
46
+ }
47
+ };
48
+ return _lodash.default.debounce(setData, 300);
49
+ }, [setParams, setShowSuggestions]);
50
+ (0, _react.useEffect)(() => {
51
+ updateParams(text);
52
+ }, [text, updateParams]);
53
+ (0, _react.useEffect)(() => {
54
+ if (!isPending && !serverError) {
55
+ setSuggestions(fetchedData);
56
+ setShowSuggestions(true);
57
+ }
58
+ }, [fetchedData, isPending, serverError, setShowSuggestions]);
59
+ const suggestionsList = (0, _react.useMemo)(() => {
60
+ return deferredData === null || deferredData === void 0 ? void 0 : deferredData.map(item => {
61
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
62
+ as: "button",
63
+ disabled: isStale,
64
+ onClick: () => {
65
+ onSelect(item);
66
+ _lodash.default.delay(() => {
67
+ setShowSuggestions(false);
68
+ }, 150);
69
+ },
70
+ children: item.name
71
+ }, item.name);
72
+ });
73
+ }, [deferredData, isStale, onSelect, setShowSuggestions]);
74
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
75
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Header, {
76
+ children: "Features"
77
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
78
+ style: {
79
+ maxHeight: "25vh",
80
+ overflowY: "scroll"
81
+ },
82
+ children: deferredData !== null && deferredData !== void 0 && deferredData.length ? suggestionsList : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
83
+ as: "button",
84
+ disabled: true,
85
+ children: !serverError ? isStale || isPending ? "Loading..." : "No items found" : "Failed to fetch data"
86
+ }, "empty")
87
+ })]
88
+ });
89
+ }
90
+ function DiseasesSearchResults(_ref2) {
91
+ let {
92
+ text,
93
+ setShowSuggestions
94
+ } = _ref2;
95
+ const [suggestions, setSuggestions] = (0, _react.useState)([]);
96
+ const dispatch = (0, _DatasetContext.useDatasetDispatch)();
97
+ const {
98
+ setParams,
99
+ data: {
100
+ fetchedData = [],
101
+ isPending,
102
+ serverError
103
+ }
104
+ } = (0, _search.useDiseaseSearch)();
105
+ (0, _search.useGetDisease)();
106
+ const deferredData = (0, _react.useDeferredValue)(suggestions);
107
+ const isStale = deferredData !== fetchedData;
108
+ const updateParams = (0, _react.useMemo)(() => {
109
+ const setData = text => {
110
+ if (text.length) {
111
+ setParams(p => {
112
+ return {
113
+ ...p,
114
+ text: text
115
+ };
116
+ });
117
+ } else {
118
+ setSuggestions([]);
119
+ }
120
+ };
121
+ return _lodash.default.debounce(setData, 300);
122
+ }, [setParams]);
123
+ (0, _react.useEffect)(() => {
124
+ updateParams(text);
125
+ }, [text, updateParams]);
126
+ (0, _react.useEffect)(() => {
127
+ if (!isPending && !serverError) {
128
+ setSuggestions(fetchedData);
129
+ setShowSuggestions(true);
130
+ }
131
+ }, [fetchedData, isPending, serverError, setShowSuggestions]);
132
+ const suggestionsList = (0, _react.useMemo)(() => {
133
+ return deferredData === null || deferredData === void 0 ? void 0 : deferredData.map(item => {
134
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
135
+ as: "button",
136
+ disabled: isStale,
137
+ onClick: () => {
138
+ dispatch({
139
+ type: "select.disease",
140
+ id: item === null || item === void 0 ? void 0 : item.disease_id,
141
+ name: item === null || item === void 0 ? void 0 : item.disease_name
142
+ });
143
+ _lodash.default.delay(() => {
144
+ setShowSuggestions(false);
145
+ }, 150);
146
+ },
147
+ children: item.disease_name
148
+ }, item.id);
149
+ });
150
+ }, [deferredData, dispatch, isStale, setShowSuggestions]);
151
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
152
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Header, {
153
+ children: "Diseases"
154
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
155
+ style: {
156
+ maxHeight: "25vh",
157
+ overflowY: "scroll"
158
+ },
159
+ children: deferredData !== null && deferredData !== void 0 && deferredData.length ? suggestionsList : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
160
+ as: "button",
161
+ disabled: true,
162
+ children: !serverError ? isStale || isPending ? "Loading..." : "No items found" : "Failed to fetch data"
163
+ }, "empty")
164
+ })]
165
+ });
166
+ }
@@ -4,195 +4,86 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.VarNamesList = VarNamesList;
7
- exports.VarSearchBar = VarSearchBar;
8
7
  require("bootstrap/dist/css/bootstrap.min.css");
9
8
  var _react = _interopRequireWildcard(require("react"));
10
9
  var _lodash = _interopRequireDefault(require("lodash"));
11
- var _requests = require("../../utils/requests");
12
10
  var _DatasetContext = require("../../context/DatasetContext");
13
11
  var _constants = require("../../constants/constants");
14
12
  var _reactBootstrap = require("react-bootstrap");
15
- var _LoadingSpinner = require("../../utils/LoadingSpinner");
16
13
  var _jsxRuntime = require("react/jsx-runtime");
17
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
15
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
16
  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 && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
- function VarSearchBar(_ref) {
17
+ function VarNamesList(_ref) {
18
+ var _dataset$selectedVar, _dataset$selectedDise, _dataset$selectedDise2, _dataset$selectedDise3;
21
19
  let {
22
- varNames = [],
23
- onSelect
20
+ mode = _constants.SELECTION_MODES.SINGLE,
21
+ displayName = "genes"
24
22
  } = _ref;
25
- const [suggestions, setSuggestions] = (0, _react.useState)([]);
26
- const [showSuggestions, setShowSuggestions] = (0, _react.useState)(false);
27
- const [text, setText] = (0, _react.useState)("");
28
- const getSuggestions = (0, _react.useMemo)(() => {
29
- const filter = text => {
30
- if (text.length > 0) {
31
- const regex = new RegExp("^".concat(text), "i");
32
- const filter = varNames.sort().filter(v => regex.test(v.name));
33
- setSuggestions(filter);
34
- setShowSuggestions(true);
35
- } else {
36
- setShowSuggestions(false);
37
- }
38
- };
39
- return _lodash.default.debounce(filter, 300);
40
- }, [varNames]);
41
- (0, _react.useEffect)(() => {
42
- getSuggestions(text);
43
- }, [getSuggestions, text]);
44
- const suggestionsList = suggestions.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
45
- as: "button",
46
- onClick: () => {
47
- onSelect(item);
48
- },
49
- children: item.name
50
- }, item.name));
51
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
52
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form, {
53
- onSubmit: e => {
54
- e.preventDefault();
55
- },
56
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.FormGroup, {
57
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Label, {
58
- children: "Feature:"
59
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Control, {
60
- onFocus: () => {
61
- setShowSuggestions(text.length > 0);
62
- },
63
- onBlur: () => {
64
- _lodash.default.delay(() => {
65
- setShowSuggestions(false);
66
- }, 150);
67
- },
68
- type: "text",
69
- placeholder: "Search for a feature",
70
- value: text,
71
- onChange: e => {
72
- setText(e.target.value);
73
- }
74
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Menu, {
75
- style: {
76
- width: "90%",
77
- maxHeight: "25vh",
78
- overflowY: "scroll"
79
- },
80
- show: showSuggestions,
81
- children: suggestionsList
82
- })]
83
- })
84
- })
85
- });
86
- }
87
- function VarNamesList(_ref2) {
88
- let {
89
- mode = _constants.SELECTION_MODES.SINGLE
90
- } = _ref2;
91
- const ENDPOINT = "var/names";
92
23
  const dataset = (0, _DatasetContext.useDataset)();
93
24
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
94
- const [varNames, setVarNames] = (0, _react.useState)([]);
95
- const [updatedVarNames, setUpdatedVarNames] = (0, _react.useState)(false);
96
- const [varButtons, setVarButtons] = (0, _react.useState)(mode ? mode === _constants.SELECTION_MODES.SINGLE ? [dataset.selectVar] : dataset.selectedMultiVar : []);
97
- const [active, setActive] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? dataset.selectVar : dataset.selectedMultiVar);
98
- const [params, setParams] = (0, _react.useState)({
99
- url: dataset.url,
100
- col: dataset.varNamesCol
101
- });
25
+ const [varButtons, setVarButtons] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? [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));
102
27
  (0, _react.useEffect)(() => {
103
- setParams(p => {
104
- return {
105
- ...p,
106
- url: dataset.url,
107
- col: dataset.varNamesCol
108
- };
109
- });
110
- }, [dataset.url, dataset.varNamesCol]);
111
- const {
112
- fetchedData,
113
- isPending,
114
- serverError
115
- } = (0, _requests.useFetch)(ENDPOINT, params, {
116
- refetchOnMount: false
117
- });
118
- const validateSelection = (0, _react.useCallback)((selectedVar, mode) => {
119
- if (updatedVarNames) {
120
- if (mode === _constants.SELECTION_MODES.SINGLE) {
121
- if (selectedVar && !_lodash.default.some(varNames, selectedVar)) {
122
- setActive(null);
123
- dispatch({
124
- type: "varSelected",
125
- var: null
126
- });
127
- }
128
- } else {
129
- if (selectedVar.length && !_lodash.default.every(selectedVar, v => _lodash.default.some(varNames, v))) {
130
- setActive([]);
131
- dispatch({
132
- type: "multiVarReset",
133
- var: []
134
- });
28
+ if (mode === _constants.SELECTION_MODES.SINGLE) {
29
+ var _dataset$selectedVar2;
30
+ setVarButtons(v => {
31
+ if (dataset.selectedVar) {
32
+ return _lodash.default.unionWith(v, [dataset.selectedVar], _lodash.default.isEqual);
33
+ } else {
34
+ return [];
135
35
  }
136
- }
137
- }
138
- }, [dispatch, varNames, updatedVarNames]);
139
- (0, _react.useEffect)(() => {
140
- if (!isPending && !serverError) {
141
- setVarNames(fetchedData);
142
- setUpdatedVarNames(true);
143
- }
144
- }, [fetchedData, isPending, serverError]);
145
- (0, _react.useEffect)(() => {
146
- if (mode === _constants.SELECTION_MODES.SINGLE && dataset.selectedVar) {
147
- validateSelection(dataset.selectVar, mode);
148
- setActive(dataset.selectedVar.matrix_index);
36
+ });
37
+ setActive((_dataset$selectedVar2 = dataset.selectedVar) === null || _dataset$selectedVar2 === void 0 ? void 0 : _dataset$selectedVar2.matrix_index);
149
38
  }
150
- }, [mode, dataset.selectedVar, dataset.selectVar, validateSelection]);
39
+ }, [mode, dataset.selectedVar]);
151
40
  (0, _react.useEffect)(() => {
152
41
  if (mode === _constants.SELECTION_MODES.MULTIPLE) {
153
- validateSelection(dataset.selectedMultiVar, mode);
42
+ setVarButtons(v => {
43
+ if (dataset.selectedMultiVar.length) {
44
+ return _lodash.default.unionWith(v, dataset.selectedMultiVar, _lodash.default.isEqual);
45
+ } else {
46
+ return [];
47
+ }
48
+ });
154
49
  setActive(dataset.selectedMultiVar.map(i => i.matrix_index));
155
50
  }
156
- }, [mode, dataset.selectedMultiVar, validateSelection]);
157
- const selectVar = item => {
158
- setVarButtons(() => {
159
- if (varButtons[0] && varButtons.find(v => v.matrix_index === item.matrix_index)) {
160
- return varButtons;
161
- } else {
162
- return [...varButtons, item];
163
- }
164
- });
51
+ }, [mode, dataset.selectedMultiVar]);
52
+ const selectVar = (0, _react.useCallback)(item => {
165
53
  if (mode === _constants.SELECTION_MODES.SINGLE) {
166
54
  dispatch({
167
55
  type: "varSelected",
168
56
  var: item
169
57
  });
58
+ dispatch({
59
+ type: "set.colorEncoding",
60
+ value: "var"
61
+ });
170
62
  } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
171
63
  dispatch({
172
64
  type: "multiVarSelected",
173
65
  var: item
174
66
  });
175
67
  }
176
- };
177
- const varList = (0, _react.useMemo)(() => {
178
- return varButtons.map(item => {
68
+ }, [dispatch, mode]);
69
+ const makeList = (0, _react.useCallback)(vars => {
70
+ return vars.map(item => {
179
71
  if (item && mode === _constants.SELECTION_MODES.SINGLE) {
180
72
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
181
73
  type: "button",
182
- variant: "outline-primary",
74
+ variant: item.matrix_index !== -1 ? "outline-primary" : "outline-secondary",
183
75
  className: "".concat(active === item.matrix_index && "active", " m-1"),
184
76
  onClick: () => {
185
- dispatch({
186
- type: "varSelected",
187
- var: item
188
- });
77
+ selectVar(item);
189
78
  },
79
+ disabled: item.matrix_index === -1,
80
+ title: item.matrix_index === -1 ? "Not present in data" : "",
190
81
  children: item.name
191
82
  }, item.matrix_index);
192
83
  } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
193
84
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
194
85
  type: "button",
195
- variant: "outline-primary",
86
+ variant: item.matrix_index !== -1 ? "outline-primary" : "outline-secondary",
196
87
  className: "".concat(active.includes(item.matrix_index) && "active", " m-1"),
197
88
  onClick: () => {
198
89
  if (active.includes(item.matrix_index)) {
@@ -201,38 +92,63 @@ function VarNamesList(_ref2) {
201
92
  var: item
202
93
  });
203
94
  } else {
204
- dispatch({
205
- type: "multiVarSelected",
206
- var: item
207
- });
95
+ selectVar(item);
208
96
  }
209
97
  },
98
+ disabled: item.matrix_index === -1,
99
+ title: item.matrix_index === -1 ? "Not present in data" : "",
210
100
  children: item.name
211
101
  }, item.matrix_index);
212
102
  } else {
213
103
  return null;
214
104
  }
215
105
  });
216
- }, [active, dispatch, mode, varButtons]);
217
- if (!serverError) {
218
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
219
- className: "position-relative",
220
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h4", {
221
- children: mode
222
- }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingSpinner.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(VarSearchBar, {
223
- varNames: varNames,
224
- onSelect: selectVar
106
+ }, [active, dispatch, mode, selectVar]);
107
+ const varList = (0, _react.useMemo)(() => {
108
+ return makeList(varButtons);
109
+ }, [makeList, varButtons]);
110
+ const diseaseVarList = (0, _react.useMemo)(() => {
111
+ return makeList(dataset.selectedDisease.genes);
112
+ }, [makeList, dataset.selectedDisease.genes]);
113
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
114
+ className: "position-relative",
115
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
116
+ className: "overflow-auto mt-2",
117
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
118
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
119
+ className: "d-flex justify-content-between",
120
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
121
+ children: _lodash.default.capitalize(displayName)
122
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
123
+ variant: "link",
124
+ onClick: () => {
125
+ dispatch({
126
+ type: mode === _constants.SELECTION_MODES.SINGLE ? "reset.var" : "reset.multiVar"
127
+ });
128
+ },
129
+ children: "clear"
130
+ })]
131
+ }), varList]
225
132
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
226
- className: "overflow-auto mt-2",
227
- children: varList
133
+ children: ((_dataset$selectedDise = dataset.selectedDisease) === null || _dataset$selectedDise === void 0 ? void 0 : _dataset$selectedDise.id) && ((_dataset$selectedDise2 = dataset.selectedDisease) === null || _dataset$selectedDise2 === void 0 || (_dataset$selectedDise2 = _dataset$selectedDise2.genes) === null || _dataset$selectedDise2 === void 0 ? void 0 : _dataset$selectedDise2.length) > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
134
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
135
+ className: "d-flex justify-content-between",
136
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
137
+ children: "Disease genes"
138
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
139
+ variant: "link",
140
+ onClick: () => {
141
+ dispatch({
142
+ type: "reset.disease"
143
+ });
144
+ },
145
+ children: "clear"
146
+ })]
147
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
148
+ children: (_dataset$selectedDise3 = dataset.selectedDisease) === null || _dataset$selectedDise3 === void 0 ? void 0 : _dataset$selectedDise3.name
149
+ }), diseaseVarList]
150
+ })
228
151
  })]
229
- });
230
- } else {
231
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
232
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
233
- variant: "danger",
234
- children: serverError.message
235
- })
236
- });
237
- }
152
+ })
153
+ });
238
154
  }
@@ -74,6 +74,12 @@ const initialDataset = {
74
74
  },
75
75
  state: {
76
76
  obs: {}
77
+ },
78
+ diseaseDatasets: [],
79
+ selectedDisease: {
80
+ id: null,
81
+ name: null,
82
+ genes: []
77
83
  }
78
84
  };
79
85
  const initializer = initialState => {
@@ -125,10 +131,6 @@ function useDatasetDispatch() {
125
131
  }
126
132
  function datasetReducer(dataset, action) {
127
133
  switch (action.type) {
128
- case "setDataset":
129
- {
130
- return action.dataset;
131
- }
132
134
  case "set.obs":
133
135
  {
134
136
  return {
@@ -159,7 +161,7 @@ function datasetReducer(dataset, action) {
159
161
  }
160
162
  case "multiVarSelected":
161
163
  {
162
- if (dataset.selectedMultiVar.find(i => i === action.var)) {
164
+ if (dataset.selectedMultiVar.find(i => _lodash.default.isEqual(i, action.var))) {
163
165
  return dataset;
164
166
  } else {
165
167
  return {
@@ -172,7 +174,7 @@ function datasetReducer(dataset, action) {
172
174
  {
173
175
  return {
174
176
  ...dataset,
175
- selectedMultiVar: dataset.selectedMultiVar.filter(a => a !== action.var)
177
+ selectedMultiVar: dataset.selectedMultiVar.filter(a => a.matrix_index !== action.var.matrix_index)
176
178
  };
177
179
  }
178
180
  case "set.colorEncoding":
@@ -182,13 +184,52 @@ function datasetReducer(dataset, action) {
182
184
  colorEncoding: action.value
183
185
  };
184
186
  }
185
- case "multiVarReset":
187
+ case "reset.multiVar":
186
188
  {
187
189
  return {
188
190
  ...dataset,
189
191
  selectedMultiVar: []
190
192
  };
191
193
  }
194
+ case "reset.var":
195
+ {
196
+ return {
197
+ ...dataset,
198
+ selectedVar: null
199
+ };
200
+ }
201
+ case "select.disease":
202
+ {
203
+ return {
204
+ ...dataset,
205
+ selectedDisease: {
206
+ id: action.id,
207
+ name: action.name,
208
+ genes: []
209
+ }
210
+ };
211
+ }
212
+ case "set.disease.genes":
213
+ {
214
+ return {
215
+ ...dataset,
216
+ selectedDisease: {
217
+ ...dataset.selectedDisease,
218
+ genes: action.genes
219
+ }
220
+ };
221
+ }
222
+ case "reset.disease":
223
+ {
224
+ return {
225
+ ...dataset,
226
+ selectedDisease: {
227
+ id: null,
228
+ name: null,
229
+ genes: []
230
+ }
231
+ };
232
+ }
192
233
  case "set.controls.colorScale":
193
234
  {
194
235
  return {