@haniffalab/cherita-react 1.0.0 → 1.1.0-dev.2025-04-01.1c91bb8b

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.
Files changed (106) hide show
  1. package/LICENSE +1 -1
  2. package/dist/{components → cjs/components}/full-page/FullPage.js +32 -22
  3. package/dist/{components → cjs/components}/full-page/FullPagePseudospatial.js +7 -6
  4. package/dist/{components → cjs/components}/obs-list/ObsItem.js +88 -77
  5. package/dist/{components → cjs/components}/obs-list/ObsList.js +133 -50
  6. package/dist/cjs/components/obs-list/ObsToolbar.js +24 -0
  7. package/dist/{components → cjs/components}/obsm-list/ObsmList.js +8 -5
  8. package/dist/{components → cjs/components}/offcanvas/index.js +24 -20
  9. package/dist/{components → cjs/components}/pseudospatial/Pseudospatial.js +10 -9
  10. package/dist/{components → cjs/components}/pseudospatial/PseudospatialToolbar.js +4 -3
  11. package/dist/{components → cjs/components}/scatterplot/Scatterplot.js +33 -24
  12. package/dist/{components → cjs/components}/scatterplot/SpatialControls.js +43 -42
  13. package/dist/cjs/components/scatterplot/Toolbox.js +62 -0
  14. package/dist/{components → cjs/components}/search-bar/SearchBar.js +24 -7
  15. package/dist/{components → cjs/components}/search-bar/SearchResults.js +13 -17
  16. package/dist/{components → cjs/components}/var-list/VarItem.js +38 -29
  17. package/dist/{components → cjs/components}/var-list/VarList.js +59 -31
  18. package/dist/{components → cjs/components}/var-list/VarListToolbar.js +18 -14
  19. package/dist/{components → cjs/components}/var-list/VarSet.js +24 -20
  20. package/dist/{components → cjs/components}/violin/Violin.js +4 -3
  21. package/dist/{constants → cjs/constants}/constants.js +6 -2
  22. package/dist/{context → cjs/context}/DatasetContext.js +12 -11
  23. package/dist/{context → cjs/context}/FilterContext.js +4 -3
  24. package/dist/{context → cjs/context}/ZarrDataContext.js +4 -3
  25. package/dist/{helpers → cjs/helpers}/color-helper.js +12 -11
  26. package/dist/{helpers → cjs/helpers}/map-helper.js +8 -7
  27. package/dist/{helpers → cjs/helpers}/zarr-helper.js +30 -38
  28. package/dist/{utils → cjs/utils}/Filter.js +1 -1
  29. package/dist/{utils → cjs/utils}/Histogram.js +12 -8
  30. package/dist/{utils → cjs/utils}/ImageViewer.js +6 -5
  31. package/dist/{utils → cjs/utils}/Legend.js +8 -7
  32. package/dist/{utils → cjs/utils}/LoadingIndicators.js +5 -4
  33. package/dist/cjs/utils/Skeleton.js +19 -0
  34. package/dist/{utils → cjs/utils}/VirtualizedList.js +10 -9
  35. package/dist/{utils → cjs/utils}/requests.js +37 -39
  36. package/dist/{utils → cjs/utils}/string.js +9 -4
  37. package/dist/{utils → cjs/utils}/zarrData.js +12 -4
  38. package/dist/css/cherita.css +147 -152
  39. package/dist/css/cherita.css.map +1 -1
  40. package/dist/esm/components/dotplot/Dotplot.js +135 -0
  41. package/dist/esm/components/dotplot/DotplotControls.js +148 -0
  42. package/dist/esm/components/full-page/FullPage.js +143 -0
  43. package/dist/esm/components/full-page/FullPagePseudospatial.js +151 -0
  44. package/dist/esm/components/heatmap/Heatmap.js +105 -0
  45. package/dist/esm/components/heatmap/HeatmapControls.js +23 -0
  46. package/dist/esm/components/matrixplot/Matrixplot.js +107 -0
  47. package/dist/esm/components/matrixplot/MatrixplotControls.js +38 -0
  48. package/dist/esm/components/obs-list/ObsItem.js +484 -0
  49. package/dist/esm/components/obs-list/ObsList.js +338 -0
  50. package/dist/esm/components/obs-list/ObsToolbar.js +17 -0
  51. package/dist/esm/components/obsm-list/ObsmList.js +75 -0
  52. package/dist/esm/components/offcanvas/index.js +67 -0
  53. package/dist/esm/components/pseudospatial/Pseudospatial.js +228 -0
  54. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +123 -0
  55. package/dist/esm/components/scatterplot/Scatterplot.js +394 -0
  56. package/dist/esm/components/scatterplot/ScatterplotControls.js +71 -0
  57. package/dist/esm/components/scatterplot/SpatialControls.js +140 -0
  58. package/dist/esm/components/scatterplot/Toolbox.js +55 -0
  59. package/dist/esm/components/search-bar/SearchBar.js +90 -0
  60. package/dist/esm/components/search-bar/SearchResults.js +139 -0
  61. package/dist/esm/components/var-list/VarItem.js +254 -0
  62. package/dist/esm/components/var-list/VarList.js +291 -0
  63. package/dist/esm/components/var-list/VarListToolbar.js +87 -0
  64. package/dist/esm/components/var-list/VarSet.js +194 -0
  65. package/dist/esm/components/violin/Violin.js +141 -0
  66. package/dist/esm/components/violin/ViolinControls.js +24 -0
  67. package/dist/esm/constants/colorscales.js +22 -0
  68. package/dist/esm/constants/constants.js +88 -0
  69. package/dist/esm/context/DatasetContext.js +571 -0
  70. package/dist/esm/context/FilterContext.js +48 -0
  71. package/dist/esm/context/ZarrDataContext.js +26 -0
  72. package/dist/esm/helpers/color-helper.js +66 -0
  73. package/dist/esm/helpers/map-helper.js +53 -0
  74. package/dist/esm/helpers/zarr-helper.js +111 -0
  75. package/dist/esm/index.js +22 -0
  76. package/dist/esm/utils/Filter.js +147 -0
  77. package/dist/esm/utils/Histogram.js +44 -0
  78. package/dist/esm/utils/ImageViewer.js +27 -0
  79. package/dist/esm/utils/Legend.js +58 -0
  80. package/dist/esm/utils/LoadingIndicators.js +22 -0
  81. package/dist/esm/utils/Skeleton.js +12 -0
  82. package/dist/esm/utils/VirtualizedList.js +55 -0
  83. package/dist/esm/utils/errors.js +47 -0
  84. package/dist/esm/utils/requests.js +102 -0
  85. package/dist/esm/utils/search.js +39 -0
  86. package/dist/esm/utils/string.js +59 -0
  87. package/dist/esm/utils/zarrData.js +102 -0
  88. package/package.json +22 -9
  89. package/scss/cherita.scss +19 -50
  90. package/scss/components/accordions.scss +32 -0
  91. package/scss/components/layouts.scss +2 -1
  92. package/scss/components/lists.scss +14 -0
  93. package/dist/components/obs-list/ObsToolbar.js +0 -64
  94. package/dist/components/scatterplot/Toolbox.js +0 -31
  95. /package/dist/{components → cjs/components}/dotplot/Dotplot.js +0 -0
  96. /package/dist/{components → cjs/components}/dotplot/DotplotControls.js +0 -0
  97. /package/dist/{components → cjs/components}/heatmap/Heatmap.js +0 -0
  98. /package/dist/{components → cjs/components}/heatmap/HeatmapControls.js +0 -0
  99. /package/dist/{components → cjs/components}/matrixplot/Matrixplot.js +0 -0
  100. /package/dist/{components → cjs/components}/matrixplot/MatrixplotControls.js +0 -0
  101. /package/dist/{components → cjs/components}/scatterplot/ScatterplotControls.js +0 -0
  102. /package/dist/{components → cjs/components}/violin/ViolinControls.js +0 -0
  103. /package/dist/{constants → cjs/constants}/colorscales.js +0 -0
  104. /package/dist/{index.js → cjs/index.js} +0 -0
  105. /package/dist/{utils → cjs/utils}/errors.js +0 -0
  106. /package/dist/{utils → cjs/utils}/search.js +0 -0
@@ -0,0 +1,102 @@
1
+ import { useQuery } from "@tanstack/react-query";
2
+ import { useDebounce } from "@uidotdev/usehooks";
3
+ import { parseError } from "./errors";
4
+ export async function fetchData(endpoint, params) {
5
+ let signal = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
6
+ let ms = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 300000;
7
+ let apiUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
8
+ apiUrl = apiUrl || process.env.REACT_APP_API_URL;
9
+ const controller = new AbortController();
10
+ const timeout = setTimeout(() => {
11
+ controller.abort(DOMException.TIMEOUT_ERR);
12
+ }, ms || 300000);
13
+ if (signal) signal.addEventListener("abort", () => controller.abort());
14
+ const response = await fetch(new URL(endpoint, apiUrl), {
15
+ method: "POST",
16
+ mode: "cors",
17
+ headers: {
18
+ "Content-Type": "application/json",
19
+ Accept: "application/json"
20
+ },
21
+ body: JSON.stringify(params),
22
+ signal: controller.signal
23
+ }).catch(err => {
24
+ // Manual check as fetch returns an AbortError regardless of the reason set to the signal
25
+ if (controller.signal.aborted && controller.signal.reason === DOMException.TIMEOUT_ERR) {
26
+ throw DOMException.TIMEOUT_ERR;
27
+ }
28
+ throw err;
29
+ }).finally(() => clearTimeout(timeout));
30
+ if (!response.ok) {
31
+ throw await response.json();
32
+ }
33
+ return await response.json();
34
+ }
35
+ export const useFetch = function (endpoint, params) {
36
+ let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
37
+ refetchOnMount: false,
38
+ refetchOnWindowFocus: false
39
+ };
40
+ let apiUrl = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
41
+ const {
42
+ data: fetchedData = null,
43
+ isLoading: isPending = false,
44
+ error: serverError = null
45
+ } = useQuery({
46
+ queryKey: [endpoint, params],
47
+ queryFn: _ref => {
48
+ let {
49
+ signal
50
+ } = _ref;
51
+ return fetchData(endpoint, params, signal, apiUrl);
52
+ },
53
+ retry: (failureCount, _ref2) => {
54
+ let {
55
+ error
56
+ } = _ref2;
57
+ if ([400, 401, 403, 404, 422].includes(error?.status)) return false;
58
+ return failureCount < 3;
59
+ },
60
+ ...opts
61
+ });
62
+ return {
63
+ fetchedData,
64
+ isPending,
65
+ serverError: parseError(serverError)
66
+ };
67
+ };
68
+ export const useDebouncedFetch = function (endpoint, params) {
69
+ let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 500;
70
+ let opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {
71
+ refetchOnMount: false,
72
+ refetchOnWindowFocus: false
73
+ };
74
+ let apiUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
75
+ const debouncedParams = useDebounce(params, delay);
76
+ const {
77
+ data: fetchedData = null,
78
+ isLoading: isPending = false,
79
+ error: serverError = null
80
+ } = useQuery({
81
+ queryKey: [endpoint, debouncedParams],
82
+ queryFn: _ref3 => {
83
+ let {
84
+ signal
85
+ } = _ref3;
86
+ return fetchData(endpoint, debouncedParams, signal, apiUrl);
87
+ },
88
+ retry: (failureCount, _ref4) => {
89
+ let {
90
+ error
91
+ } = _ref4;
92
+ if ([400, 401, 403, 404, 422].includes(error?.status)) return false;
93
+ return failureCount < 3;
94
+ },
95
+ ...opts
96
+ });
97
+ return {
98
+ fetchedData,
99
+ isPending,
100
+ serverError: parseError(serverError)
101
+ };
102
+ };
@@ -0,0 +1,39 @@
1
+ import { useState } from "react";
2
+ import { useFetch } from "./requests";
3
+ import { useDataset } from "../context/DatasetContext";
4
+ export const useDiseaseSearch = () => {
5
+ const ENDPOINT = "diseases";
6
+ const dataset = useDataset();
7
+ const [params, setParams] = useState({
8
+ url: dataset.url,
9
+ diseaseDatasets: dataset.diseaseDatasets,
10
+ text: ""
11
+ });
12
+ const data = useFetch(ENDPOINT, params, {
13
+ enabled: !!params.text.length,
14
+ refetchOnMount: true
15
+ });
16
+ return {
17
+ params,
18
+ setParams,
19
+ data
20
+ };
21
+ };
22
+ export const useVarSearch = () => {
23
+ const ENDPOINT = "var/names";
24
+ const dataset = useDataset();
25
+ const [params, setParams] = useState({
26
+ url: dataset.url,
27
+ col: dataset.varNamesCol,
28
+ text: ""
29
+ });
30
+ const data = useFetch(ENDPOINT, params, {
31
+ enabled: !!params.text.length,
32
+ refetchOnMount: true
33
+ });
34
+ return {
35
+ params,
36
+ setParams,
37
+ data
38
+ };
39
+ };
@@ -0,0 +1,59 @@
1
+ import numbro from "numbro";
2
+ export const FORMATS = {
3
+ EXPONENTIAL: "exponential",
4
+ ABBREVIATION: "abbreviation",
5
+ THOUSAND: "thousand"
6
+ };
7
+ function formatThousand(n) {
8
+ let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
9
+ return numbro(n).format({
10
+ thousandSeparated: true,
11
+ mantissa: precision,
12
+ trimMantissa: true
13
+ });
14
+ }
15
+ function formatExponential(n) {
16
+ let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
17
+ return numbro(n).format({
18
+ exponential: true,
19
+ mantissa: precision,
20
+ trimMantissa: true
21
+ });
22
+ }
23
+ function formatAbbreviation(n) {
24
+ let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
25
+ return numbro(n).format({
26
+ average: true,
27
+ mantissa: precision,
28
+ trimMantissa: true
29
+ }).toUpperCase();
30
+ }
31
+ export function formatNumerical(n) {
32
+ let format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : FORMATS.THOUSAND;
33
+ let precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3;
34
+ if (n === 0) {
35
+ return "0";
36
+ } else if (!n || n === undefined || isNaN(n)) {
37
+ return "NaN";
38
+ }
39
+ switch (format) {
40
+ case FORMATS.EXPONENTIAL:
41
+ if (n < 1 / 10 ** precision || n >= 1e6) {
42
+ return formatExponential(n, precision);
43
+ } else {
44
+ return formatThousand(n, precision);
45
+ }
46
+ case FORMATS.ABBREVIATION:
47
+ if (n >= 1e6) {
48
+ return formatAbbreviation(n, precision);
49
+ } else {
50
+ return formatThousand(n, precision);
51
+ }
52
+ case FORMATS.THOUSAND:
53
+ default:
54
+ return formatThousand(n, precision);
55
+ }
56
+ }
57
+ export function formatString(s) {
58
+ return s.trim().replace(/_/g, " ");
59
+ }
@@ -0,0 +1,102 @@
1
+ import { useEffect, useState } from "react";
2
+ import _ from "lodash";
3
+ import { OBS_TYPES } from "../constants/constants";
4
+ import { useDataset } from "../context/DatasetContext";
5
+ import { GET_OPTIONS, useZarr, useMultipleZarr } from "../helpers/zarr-helper";
6
+ export const useObsmData = function () {
7
+ let obsm = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
8
+ const dataset = useDataset();
9
+ obsm = obsm || dataset.selectedObsm;
10
+ const [obsmParams, setObsmParams] = useState({
11
+ url: dataset.url,
12
+ path: "obsm/" + obsm
13
+ });
14
+ useEffect(() => {
15
+ setObsmParams({
16
+ url: dataset.url,
17
+ path: "obsm/" + obsm
18
+ });
19
+ }, [dataset.url, obsm]);
20
+ return useZarr(obsmParams, null, GET_OPTIONS, {
21
+ enabled: !!obsm
22
+ });
23
+ };
24
+ const meanData = (_i, data) => {
25
+ return _.zipWith(...data, function () {
26
+ for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
27
+ values[_key] = arguments[_key];
28
+ }
29
+ return _.mean(values);
30
+ });
31
+ };
32
+ export const useXData = function () {
33
+ let agg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : meanData;
34
+ const dataset = useDataset();
35
+ const [xParams, setXParams] = useState(!dataset.selectedVar ? [] : !dataset.selectedVar?.isSet ? [{
36
+ url: dataset.url,
37
+ path: "X",
38
+ s: [null, dataset.selectedVar?.matrix_index]
39
+ }] : _.map(dataset.selectedVar?.vars, v => {
40
+ return {
41
+ url: dataset.url,
42
+ path: "X",
43
+ s: [null, v.matrix_index]
44
+ };
45
+ }));
46
+ useEffect(() => {
47
+ setXParams(!dataset.selectedVar ? [] : !dataset.selectedVar?.isSet ? [{
48
+ url: dataset.url,
49
+ path: "X",
50
+ s: [null, dataset.selectedVar?.matrix_index]
51
+ }] : _.map(dataset.selectedVar?.vars, v => {
52
+ return {
53
+ url: dataset.url,
54
+ path: "X",
55
+ s: [null, v.matrix_index]
56
+ };
57
+ }));
58
+ }, [dataset.url, dataset.selectedVar]);
59
+ return useMultipleZarr(xParams, GET_OPTIONS, {
60
+ enabled: !!xParams.length
61
+ }, agg);
62
+ };
63
+ export const useObsData = function () {
64
+ let obs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
65
+ const dataset = useDataset();
66
+ obs = obs || dataset.selectedObs;
67
+ const [obsParams, setObsParams] = useState({
68
+ url: dataset.url,
69
+ path: "obs/" + obs?.name + (obs?.type === OBS_TYPES.CATEGORICAL ? "/codes" : "")
70
+ });
71
+ useEffect(() => {
72
+ setObsParams({
73
+ url: dataset.url,
74
+ path: "obs/" + obs?.name + (obs?.type === OBS_TYPES.CATEGORICAL ? "/codes" : "")
75
+ });
76
+ }, [dataset.url, obs]);
77
+ return useZarr(obsParams, null, GET_OPTIONS, {
78
+ enabled: !!obs
79
+ });
80
+ };
81
+ export const useLabelObsData = () => {
82
+ const dataset = useDataset();
83
+ const [labelObsParams, setLabelObsParams] = useState(_.map(dataset.labelObs, obs => {
84
+ return {
85
+ url: dataset.url,
86
+ path: "obs/" + obs.name + (obs.type === OBS_TYPES.CATEGORICAL ? "/codes" : ""),
87
+ key: obs.name
88
+ };
89
+ }));
90
+ useEffect(() => {
91
+ setLabelObsParams(_.map(dataset.labelObs, obs => {
92
+ return {
93
+ url: dataset.url,
94
+ path: "obs/" + obs.name + (obs.type === OBS_TYPES.CATEGORICAL ? "/codes" : ""),
95
+ key: obs.name
96
+ };
97
+ }));
98
+ }, [dataset.labelObs, dataset.url]);
99
+ return useMultipleZarr(labelObsParams, GET_OPTIONS, {
100
+ enabled: !!labelObsParams.length
101
+ });
102
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haniffalab/cherita-react",
3
- "version": "1.0.0",
3
+ "version": "1.1.0-dev.2025-04-01.1c91bb8b",
4
4
  "author": "Haniffa Lab",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -8,14 +8,23 @@
8
8
  "bioinformatics",
9
9
  "visualization"
10
10
  ],
11
- "main": "dist/index.js",
12
- "module": "dist/index.js",
11
+ "main": "dist/cjs/index.js",
12
+ "module": "dist/esm/index.js",
13
13
  "style": "dist/css/cherita.css",
14
14
  "sass": "scss/cherita.scss",
15
15
  "files": [
16
16
  "dist",
17
17
  "scss"
18
18
  ],
19
+ "exports": {
20
+ ".": {
21
+ "import": "./dist/esm/index.js",
22
+ "require": "./dist/cjs/index.js"
23
+ },
24
+ "./scss/cherita": "./scss/cherita.scss",
25
+ "./scss/*.scss": "./scss/*.scss",
26
+ "./dist/*.css": "./dist/css/*.css"
27
+ },
19
28
  "dependencies": {
20
29
  "@emotion/react": "^11.11.4",
21
30
  "@emotion/styled": "^11.11.5",
@@ -60,20 +69,23 @@
60
69
  "@testing-library/react": "^16.2.0",
61
70
  "babel-jest": "^29.7.0",
62
71
  "cpx": "^1.5.0",
63
- "eslint": "^8.42.0",
64
- "eslint-config-prettier": "^8.8.0",
72
+ "eslint": "^8.57.1",
73
+ "eslint-config-prettier": "^8.10.0",
65
74
  "eslint-config-react-app": "^7.0.1",
66
75
  "eslint-plugin-import": "^2.29.1",
76
+ "eslint-plugin-prettier": "^5.2.3",
67
77
  "jest": "^29.7.0",
68
78
  "jest-environment-jsdom": "^29.7.0",
69
- "prettier": "^3.3.3",
79
+ "prettier": "^3.5.3",
70
80
  "sass": "1.77.6",
71
81
  "stylelint": "^16.10.0",
72
82
  "stylelint-config-prettier": "^9.0.5",
73
83
  "stylelint-config-standard-scss": "^13.1.0"
74
84
  },
75
85
  "scripts": {
76
- "build:babel": "babel src/lib --out-dir dist --copy-files",
86
+ "build:esm": "babel src/lib --out-dir dist/esm --copy-files --env-name esm",
87
+ "build:cjs": "babel src/lib --out-dir dist/cjs --copy-files --env-name cjs",
88
+ "build:babel": "npm run build:esm && npm run build:cjs",
77
89
  "build:scss": "sass --load-path=node_modules src/scss/cherita-bootstrap.scss dist/css/cherita.css",
78
90
  "copy:scss": "cpx 'src/scss/**/*' 'scss'",
79
91
  "build": "npm run build:babel && npm run build:scss && npm run copy:scss",
@@ -111,5 +123,6 @@
111
123
  "bugs": {
112
124
  "url": "https://github.com/haniffalab/cherita-react/issues"
113
125
  },
114
- "homepage": "https://github.com/haniffalab/cherita-react#readme"
115
- }
126
+ "homepage": "https://github.com/haniffalab/cherita-react#readme",
127
+ "prereleaseSha": "1c91bb8b0c502cfeb08cb10790193163e3814751"
128
+ }
package/scss/cherita.scss CHANGED
@@ -1,7 +1,12 @@
1
+ // Define $prefix only if it hasn't been set already
2
+ $prefix: "bs-" !default;
3
+
4
+ @import "components/accordions";
5
+ @import "components/lists";
1
6
  @import "components/layouts";
7
+ @import "components/plotly";
2
8
  @import "components/plots";
3
9
  @import "components/scrollbars";
4
- @import "components/plotly";
5
10
 
6
11
  .loading-spinner {
7
12
  @extend .bg-light;
@@ -74,8 +79,8 @@
74
79
  align-items: flex-end;
75
80
  flex-wrap: wrap;
76
81
  width: 100%;
77
- padding-left: 2rem;
78
- padding-right: 2rem;
82
+ padding-left: 1rem;
83
+ padding-right: 1rem;
79
84
  padding-bottom: 1rem;
80
85
  pointer-events: none;
81
86
 
@@ -213,7 +218,7 @@ $gauge-padding: 0.15rem;
213
218
  }
214
219
 
215
220
  .feature-histogram-container {
216
- height: 1.25rem;
221
+ height: 1.31rem;
217
222
  width: 5rem;
218
223
  display: flex;
219
224
  align-items: center;
@@ -221,6 +226,7 @@ $gauge-padding: 0.15rem;
221
226
 
222
227
  .feature-histogram {
223
228
  @extend .feature-histogram-container;
229
+ border-radius: 5px;
224
230
 
225
231
  background-color: #dedede;
226
232
  }
@@ -343,54 +349,17 @@ $gauge-padding: 0.15rem;
343
349
  left: 1rem;
344
350
  }
345
351
 
346
- /* Styling the obs-accordion-header */
347
- .obs-accordion {
348
- margin-bottom: 10px; /* Space between each accordion */
349
- }
350
-
351
- .obs-accordion-header {
352
- @extend .btn;
353
- @extend .btn-light-primary !optional;
354
- @extend .btn-light;
355
- @extend .text-primary;
356
-
357
- display: flex;
358
- align-items: center; /* Center the content vertically */
359
- margin: 10px 10px 0 10px;
360
- padding: 8px 12px; /* Adjust padding for spacing */
361
- border-radius: 8px; /* Optional: rounded corners */
362
- transition: background-color 0.3s ease; /* Smooth transition for background change */
363
- cursor: pointer;
364
-
365
- .obs-accordion-header-chevron {
366
- display: flex;
367
- justify-content: center;
368
- align-items: center;
369
- width: 20px; /* Fixed width to prevent layout shifts */
370
- height: 20px; /* Ensures a consistent square */
371
- margin-right: 10px;
372
- }
373
- .obs-accordion-header-title {
374
- font-size: 1rem;
375
- width: 100%;
376
- display: flex;
377
- justify-content: space-between;
378
- align-items: center;
379
- }
352
+ .search-results {
353
+ max-height: 25vh;
354
+ overflow-y: scroll;
380
355
 
381
- &.active {
382
- @extend .btn-primary;
383
- @extend .text-light;
384
- }
385
- &:hover {
386
- background-color: var(--geeks-btn-hover-bg);
387
- border-color: var(--geeks-btn-hover-border-color);
356
+ .dropdown-item {
357
+ white-space: normal;
358
+ overflow-wrap: break-word;
388
359
  }
389
360
  }
390
361
 
391
- .obs-accordion-body {
392
- @extend .card;
393
-
394
- margin: 10px;
395
- position: relative;
362
+ .nav-icon {
363
+ margin-right: 0.4rem;
364
+ width: 1rem;
396
365
  }
@@ -0,0 +1,32 @@
1
+ .obs-accordion-header {
2
+ display: flex;
3
+ align-items: center;
4
+ padding: 8px 12px;
5
+ cursor: pointer;
6
+
7
+ &.active {
8
+ color: #0c63e4;
9
+ background-color: var(--#{$prefix}tertiary-bg);
10
+ border-bottom: var(--#{$prefix}accordion-border-width) solid
11
+ var(--#{$prefix}accordion-border-color);
12
+ }
13
+
14
+ .obs-accordion-header-chevron {
15
+ display: flex;
16
+ justify-content: center;
17
+ align-items: center;
18
+ width: 20px;
19
+ height: 20px;
20
+ margin-right: 10px;
21
+ }
22
+ .obs-accordion-header-title {
23
+ font-size: 1rem;
24
+ width: 100%;
25
+ display: flex;
26
+ justify-content: space-between;
27
+ align-items: center;
28
+ }
29
+ .active-icon {
30
+ color: #0c63e4;
31
+ }
32
+ }
@@ -30,7 +30,7 @@
30
30
  @extend .col-xl-3;
31
31
  @extend .col-xxl-3;
32
32
 
33
- overflow-y: scroll;
33
+ overflow-y: auto;
34
34
  }
35
35
 
36
36
  .cherita-app-sidebar {
@@ -60,6 +60,7 @@
60
60
  .sidebar-features {
61
61
  padding: 10px;
62
62
  margin-bottom: 10px;
63
+ height: 100%;
63
64
  overflow-y: auto;
64
65
  }
65
66
 
@@ -0,0 +1,14 @@
1
+ .list-group-flush.cherita-list {
2
+ .list-group-item.cherita-list-item-unstyled {
3
+ background-color: transparent;
4
+ }
5
+ .list-group-item {
6
+ border: 0;
7
+ padding: 0.375rem 0.75rem;
8
+ margin-bottom: 0.215rem;
9
+ line-height: 1.5;
10
+ color: var(--#{$prefix}body-color);
11
+ background-color: var(--#{$prefix}tertiary-bg);
12
+ border-radius: var(--#{$prefix}border-radius);
13
+ }
14
+ }
@@ -1,64 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.ObsToolbar = ObsToolbar;
7
- var _react = _interopRequireDefault(require("react"));
8
- var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
- var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
- var _lodash = _interopRequireDefault(require("lodash"));
11
- var _reactBootstrap = require("react-bootstrap");
12
- var _constants = require("../../constants/constants");
13
- var _DatasetContext = require("../../context/DatasetContext");
14
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- function ObsToolbar({
16
- item,
17
- showToggleAllObs = true,
18
- showLabel = true,
19
- showSlice = true,
20
- showColor = true,
21
- onToggleAllObs,
22
- onToggleLabel,
23
- onToggleSlice,
24
- onToggleColor
25
- }) {
26
- const dataset = (0, _DatasetContext.useDataset)();
27
- const allToggledOn = !item.omit.length;
28
- const inLabelObs = _lodash.default.some(dataset.labelObs, i => i.name === item.name);
29
- const inSliceObs = dataset.sliceBy.obs && dataset.selectedObs?.name === item.name;
30
- const isColorEncoding = dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs?.name === item.name;
31
- return /*#__PURE__*/_react.default.createElement("div", {
32
- className: "d-flex align-items-center"
33
- }, /*#__PURE__*/_react.default.createElement("div", {
34
- className: "flex-grow-1"
35
- }, showToggleAllObs && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
36
- // prettier-ignore
37
- type: "switch",
38
- id: "custom-switch",
39
- label: "Toggle all",
40
- checked: allToggledOn,
41
- onChange: onToggleAllObs
42
- })), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, showLabel && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
43
- variant: inLabelObs ? "primary" : "outline-primary",
44
- size: "sm",
45
- onClick: onToggleLabel,
46
- title: "Add to tooltip"
47
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
48
- icon: _freeSolidSvgIcons.faListOl
49
- })), showSlice && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
50
- variant: inSliceObs ? "primary" : "outline-primary",
51
- size: "sm",
52
- onClick: onToggleSlice,
53
- title: "Filter to selected"
54
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
55
- icon: _freeSolidSvgIcons.faScissors
56
- })), showColor && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
57
- variant: isColorEncoding ? "primary" : "outline-primary",
58
- size: "sm",
59
- onClick: onToggleColor,
60
- title: "Set as color encoding"
61
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
62
- icon: _freeSolidSvgIcons.faDroplet
63
- })))));
64
- }
@@ -1,31 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.Toolbox = Toolbox;
7
- var _react = _interopRequireDefault(require("react"));
8
- var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
- var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
- var _Button = _interopRequireDefault(require("react-bootstrap/Button"));
11
- var _ButtonGroup = _interopRequireDefault(require("react-bootstrap/ButtonGroup"));
12
- var _string = require("../../utils/string");
13
- var _ObsmList = require("../obsm-list/ObsmList");
14
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- function Toolbox({
16
- mode,
17
- obsLength,
18
- slicedLength
19
- }) {
20
- return /*#__PURE__*/_react.default.createElement("div", {
21
- className: "cherita-toolbox"
22
- }, /*#__PURE__*/_react.default.createElement(_ButtonGroup.default, null, /*#__PURE__*/_react.default.createElement(_ObsmList.ObsmKeysList, null), /*#__PURE__*/_react.default.createElement(_Button.default, {
23
- size: "sm"
24
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
25
- icon: _freeSolidSvgIcons.faDroplet
26
- }), " ", mode), (mode || !isNaN(obsLength)) && (mode !== null && !isNaN(slicedLength) && slicedLength !== obsLength ? /*#__PURE__*/_react.default.createElement(_Button.default, {
27
- size: "sm"
28
- }, (0, _string.formatNumerical)(slicedLength), " out of", " ", (0, _string.formatNumerical)(obsLength), " cells") : /*#__PURE__*/_react.default.createElement(_Button.default, {
29
- size: "sm"
30
- }, (0, _string.formatNumerical)(obsLength), " cells"))));
31
- }
File without changes
File without changes
File without changes