visualifyjs 2.5.3 → 3.0.0

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 (252) hide show
  1. package/.claude/mem/TIMELINE.md +36 -0
  2. package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-external-script-solution.md +24 -0
  3. package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-session-summary.md +43 -0
  4. package/.claude/mem/notes/2026-02-11-cli-fix-editor-command-alias.md +26 -0
  5. package/.claude/mem/notes/2026-02-11-phase-3-developer-experience-completed.md +51 -0
  6. package/.claude/mem/notes/2026-02-11-phase-4-web-workers-implementation-complete.md +59 -0
  7. package/.claude/mem/notes/2026-02-11-visualify-phase-2-3d-visualization-complete.md +50 -0
  8. package/.claude/mem/notes/2026-02-11-visualify-phase-2-committed-ready-for-phase-3.md +33 -0
  9. package/.claude/mem/notes/2026-02-11-visualify-phase-3-complete-developer-experience.md +52 -0
  10. package/.claude/mem/notes/2026-02-11-visualify-repository-cleanup-complete.md +28 -0
  11. package/.claude/mem/notes/2026-02-18-codebase-cleanup-docsify-plugin-documentation.md +37 -0
  12. package/.claude/mem/notes/2026-02-19-css-grid-layout-fix-displaycontents-on-vcontroller.md +18 -0
  13. package/.claude/mem/notes/2026-02-19-docsify-plugin-fixes-latex-and-visualify-code-bloc.md +26 -0
  14. package/.claude/mem/notes/2026-02-19-page-mode-docs-update-decisions.md +23 -0
  15. package/.claude/mem/notes/2026-02-19-react-context-infinite-re-render-loop-fix-pattern.md +31 -0
  16. package/.claude/mem/notes/2026-02-19-version-300-bump-and-build-fixes.md +32 -0
  17. package/.claude/mem/notes/2026-02-19-visualify-build-deployment-architecture-bug-fixes.md +25 -0
  18. package/.claude/mem/notes/2026-02-19-visualify-dist-iife-self-contained-build-config.md +30 -0
  19. package/.claude/mem/notes/2026-02-19-visualify-infinite-loop-i18n-fixes.md +31 -0
  20. package/.claude/mem/notes/2026-02-19-visualify-v3-bundle-splitting-docs-restructuring.md +32 -0
  21. package/.claude/mem/notes/2026-02-20-bundle-externalization-final-architecture.md +29 -0
  22. package/.claude/mem/notes/2026-02-20-chromium-page-fix-unstable-keys-and-double-event-b.md +27 -0
  23. package/.claude/mem/notes/2026-02-20-console-cleanup-bundle-optimization-commit.md +20 -0
  24. package/.claude/mem/notes/2026-02-20-dotbio-dot-plot-fix-useeffect-dependency.md +21 -0
  25. package/.claude/mem/notes/2026-02-20-public-folder-cleanup-and-readme-rewrite.md +25 -0
  26. package/.claude/mem/notes/2026-02-20-v300-release-and-beta-channel-strategy.md +29 -0
  27. package/.claude/mem/notes/2026-02-20-visium-background-image-unknown-legend-fix.md +19 -0
  28. package/.claude/mem/notes/2026-02-20-visualify-cdn-loader-bundle-externalization.md +34 -0
  29. package/.claude/mem/sessions/session-2026-02-20-031524.md +54 -0
  30. package/.claude/settings.local.json +21 -0
  31. package/.github/workflows/static.yml.bak +51 -51
  32. package/.sisyphus/boulder.json +65 -0
  33. package/.sisyphus/plans/phase-4-advanced-optimizations.md +217 -0
  34. package/LICENSE +674 -674
  35. package/README.md +94 -59
  36. package/config-overrides.js +31 -31
  37. package/dist/stats.html +4949 -0
  38. package/dist/visualify-3d.esm.js +1 -0
  39. package/dist/visualify-3d.js +1 -0
  40. package/dist/visualify-core.esm.js +1 -0
  41. package/dist/visualify-core.js +1 -0
  42. package/dist/visualify-docs.esm.js +1 -0
  43. package/dist/visualify-docs.js +1 -0
  44. package/dist/visualify-loader.js +1 -0
  45. package/dist/visualify-pages.esm.js +1 -0
  46. package/dist/visualify-pages.js +1 -0
  47. package/dist/visualify-portal.esm.js +1 -0
  48. package/dist/visualify-portal.js +1 -0
  49. package/dist/visualify-shared.js +26571 -0
  50. package/dist/visualify.js +1 -188
  51. package/docs/CHANGELOG.md +148 -0
  52. package/docs/cli/commands.md +513 -0
  53. package/docs/configuration/visualify-json.md +474 -0
  54. package/docs/docs/3d-visualization.md +374 -0
  55. package/docs/docs/CLI.md +303 -34
  56. package/docs/docs/README.md +65 -65
  57. package/docs/docs/Rechart/bar.md +190 -190
  58. package/docs/docs/Rechart/funnel.md +241 -193
  59. package/docs/docs/Rechart/line.md +355 -355
  60. package/docs/docs/Rechart/pie.md +225 -225
  61. package/docs/docs/Rechart/radar.md +253 -253
  62. package/docs/docs/Rechart/scatter.md +298 -0
  63. package/docs/docs/_404.md +51 -51
  64. package/docs/docs/_coverpage.md +11 -11
  65. package/docs/docs/_sidebar.md +54 -43
  66. package/docs/docs/components/dotBio.md +87 -34
  67. package/docs/docs/components/echart.md +171 -82
  68. package/docs/docs/components/html.md +61 -34
  69. package/docs/docs/components/macaron.md +156 -145
  70. package/docs/docs/components/markdown.md +42 -0
  71. package/docs/docs/components/more.md +183 -142
  72. package/docs/docs/components/plotly.md +132 -62
  73. package/docs/docs/components/scatterL.md +171 -70
  74. package/docs/docs/components/visium.md +112 -57
  75. package/docs/docs/configuration.md +121 -123
  76. package/docs/docs/deploy.md +31 -31
  77. package/docs/docs/docsify-plugin.md +655 -0
  78. package/docs/docs/hmr.md +165 -0
  79. package/docs/docs/i18n.md +332 -0
  80. package/docs/docs/log.md +30 -1
  81. package/docs/docs/more-pages.md +23 -23
  82. package/docs/docs/quickstart.md +148 -119
  83. package/docs/docs/rechart-attributes.md +74 -74
  84. package/docs/docs/rechart-basic-usage.md +160 -162
  85. package/docs/docs/theme.md +5 -5
  86. package/docs/docs/typescript.md +306 -0
  87. package/docs/docs/visual-editor.md +359 -0
  88. package/docs/index.html +85 -71
  89. package/docs/manifest.json +23 -23
  90. package/docs/migration/v3-migration.md +392 -0
  91. package/docs/static/css/fluff-stuff.css +169 -169
  92. package/docs/static/css/font-awesome.min.css +4 -4
  93. package/docs/static/css/visualify.css +6 -25
  94. package/docs/static/js/3d-viz-examples.js +181 -0
  95. package/docs/static/js/configuration.js +630 -448
  96. package/docs/static/js/visualify.js +1 -188
  97. package/package.json +106 -84
  98. package/rollup.config.mjs +766 -76
  99. package/src/_css/404.css +115 -115
  100. package/src/_css/App.css +37 -37
  101. package/src/_css/autoSuggestion.css +26 -26
  102. package/src/_css/circular-progress.css +32 -32
  103. package/src/_css/index.css +36 -36
  104. package/src/_css/modern.css +350 -25
  105. package/src/_media/corner.svg +8 -8
  106. package/src/_media/download.svg +3 -3
  107. package/src/_media/logo.svg +14 -14
  108. package/src/_test/App.test.js +15 -15
  109. package/src/_utils/reportWebVitals.js +13 -13
  110. package/src/a11y/README.md +177 -0
  111. package/src/a11y/aria-labels.js +339 -0
  112. package/src/a11y/color-contrast.js +535 -0
  113. package/src/a11y/index.js +197 -0
  114. package/src/a11y/keyboard-nav.js +523 -0
  115. package/src/a11y/styles.css +165 -0
  116. package/src/cli/commands/dev.js +214 -0
  117. package/src/cli/commands/docs.js +521 -0
  118. package/src/cli/commands/edit.js +379 -0
  119. package/src/cli/commands/init.js +213 -0
  120. package/src/cli/commands/portal.js +236 -0
  121. package/src/cli/dev-server.js +530 -0
  122. package/src/cli/hmr.js +456 -0
  123. package/src/cli/index.js +180 -0
  124. package/src/cli/utils/config.js +207 -0
  125. package/src/cli/utils/logger.js +241 -0
  126. package/src/config/defaults.ts +122 -0
  127. package/src/config/index.ts +72 -0
  128. package/src/config/loader.ts +478 -0
  129. package/src/config/schema.ts +227 -0
  130. package/src/config/validator.ts +337 -0
  131. package/src/core/appContext.js +34 -27
  132. package/src/core/components/Bar.js +383 -0
  133. package/src/core/components/Bar3D.js +473 -0
  134. package/src/core/components/LargeDatasetChart.js +296 -0
  135. package/src/core/components/Line3D.js +310 -0
  136. package/src/core/components/Scatter.js +392 -188
  137. package/src/core/components/Scatter3D.js +455 -0
  138. package/src/core/components/ScatterBio.js +601 -572
  139. package/src/core/components/Surface3D.js +326 -0
  140. package/src/core/components/ThreeCustom.js +648 -0
  141. package/src/core/components/ThreeScene.js +459 -0
  142. package/src/core/components/VisiumPlot.js +191 -165
  143. package/src/core/components/browser.js +42 -42
  144. package/src/core/components/dotplot.js +413 -413
  145. package/src/core/components/html.js +29 -29
  146. package/src/core/components/list.js +178 -178
  147. package/src/core/components/macaron.js +206 -201
  148. package/src/core/components/markdown.js +56 -56
  149. package/src/core/components/parser.scatterBio.js +582 -579
  150. package/src/core/components/ratio.js +82 -80
  151. package/src/core/components/scatterL.js +206 -173
  152. package/src/core/components/searchbar.js +156 -131
  153. package/src/core/components/selection.js +310 -193
  154. package/src/core/components/timeline.js +236 -281
  155. package/src/core/components/visium.js +114 -97
  156. package/src/core/data-processor.js +413 -0
  157. package/src/core/fetch/condfetch.js +82 -82
  158. package/src/core/fetch/fetch.js +92 -92
  159. package/src/core/fetch/json.js +29 -29
  160. package/src/core/fetch/vfetch.js +42 -42
  161. package/src/core/hmr-client.js +724 -0
  162. package/src/core/liveEditor.js +44 -44
  163. package/src/core/modules/codeEditorWithPreview.js +104 -104
  164. package/src/core/modules/echarts/common.js +20 -20
  165. package/src/core/modules/echarts/gl.js +228 -0
  166. package/src/core/modules/echarts/presetHandler.js +41 -41
  167. package/src/core/modules/echarts/presets/esodev.chromium.js +172 -172
  168. package/src/core/modules/echarts/presets/esodev.codex.js +130 -130
  169. package/src/core/modules/echarts/presets/esodev.visium.js +123 -123
  170. package/src/core/modules/echarts/presets/mmtrbc.js +186 -186
  171. package/src/core/modules/echarts.js +70 -71
  172. package/src/core/modules/echartsUtils.js +43 -43
  173. package/src/core/modules/echartswitcher.js +227 -152
  174. package/src/core/modules/replotly/presetHandler.js +24 -24
  175. package/src/core/modules/replotly/presets/minimum.js +18 -18
  176. package/src/core/modules/replotly/presets/mmtrbc.dot.js +114 -114
  177. package/src/core/modules/replotly/presets/mmtrbc.violin.js +100 -100
  178. package/src/core/modules/replotly.js +74 -71
  179. package/src/core/modules/threejs/Camera.js +373 -0
  180. package/src/core/modules/threejs/Lighting.js +459 -0
  181. package/src/core/modules/threejs/Renderer.js +364 -0
  182. package/src/core/modules/threejs/Scene.js +266 -0
  183. package/src/core/modules/threejs/index.js +155 -0
  184. package/src/core/pages/404.js +50 -50
  185. package/src/core/pages/error.js +27 -27
  186. package/src/core/pages/jsonPage.js +62 -62
  187. package/src/core/pages/loading.js +44 -44
  188. package/src/core/parser/echart.data.js +204 -183
  189. package/src/core/parser/echart.features.js +125 -125
  190. package/src/core/parser/echart.general.js +147 -143
  191. package/src/core/parser/echart.hilbert.js +57 -57
  192. package/src/core/parser/echart.parser.js +210 -210
  193. package/src/core/parser/echart.series.js +67 -67
  194. package/src/core/parser/echart.types.js +76 -76
  195. package/src/core/parser/plotly.config.js +10 -10
  196. package/src/core/parser/plotly.data.js +132 -132
  197. package/src/core/parser/plotly.layout.js +9 -9
  198. package/src/core/parser/plotly.violin.js +18 -18
  199. package/src/core/recharts.js +361 -62
  200. package/src/core/router/alias.js +49 -49
  201. package/src/core/router/jsonRouter.js +31 -31
  202. package/src/core/themes/modern.js +32 -32
  203. package/src/core/themes/themeSelector.js +33 -33
  204. package/src/core/visualify.js +213 -47
  205. package/src/core/widgets/circularProgress.js +23 -23
  206. package/src/core/widgets/controller.js +116 -83
  207. package/src/core/widgets/errorBoundary.js +36 -36
  208. package/src/core/widgets/footer.js +185 -177
  209. package/src/core/widgets/header.js +238 -234
  210. package/src/core/widgets/layout/Grid.js +31 -31
  211. package/src/core/widgets/layout.js +36 -36
  212. package/src/core/widgets/mapping.js +56 -42
  213. package/src/core/workers/data-worker.js +349 -0
  214. package/src/core/workers/worker-pool.js +396 -0
  215. package/src/docsify/bundle.js +215 -0
  216. package/src/docsify/markdown.js +271 -0
  217. package/src/docsify/plugin.js +268 -0
  218. package/src/editor/README.md +172 -0
  219. package/src/editor/components/ChartBuilder.jsx +341 -0
  220. package/src/editor/components/ChartTypeSidebar.jsx +91 -0
  221. package/src/editor/components/Editor.jsx +367 -0
  222. package/src/editor/components/Preview.jsx +446 -0
  223. package/src/editor/components/PropertyPanel.jsx +468 -0
  224. package/src/editor/components/StatusBar.jsx +85 -0
  225. package/src/editor/context/EditorContext.js +248 -0
  226. package/src/editor/hooks/useDebounce.js +32 -0
  227. package/src/editor/index.js +315 -0
  228. package/src/editor/styles/editor.css +637 -0
  229. package/src/editor/utils/chartValidator.js +263 -0
  230. package/src/entries/charts3d.js +70 -0
  231. package/src/entries/core.js +78 -0
  232. package/src/entries/docs.js +154 -0
  233. package/src/entries/pages.js +93 -0
  234. package/src/entries/portal.js +204 -0
  235. package/src/entries/shared.js +50 -0
  236. package/src/i18n/formatters.js +455 -0
  237. package/src/i18n/index.js +169 -0
  238. package/src/i18n/locales/ar.json +137 -0
  239. package/src/i18n/locales/de.json +137 -0
  240. package/src/i18n/locales/en.json +137 -0
  241. package/src/i18n/locales/es.json +137 -0
  242. package/src/i18n/locales/he.json +137 -0
  243. package/src/i18n/locales/zh.json +137 -0
  244. package/src/i18n/rtl.css +183 -0
  245. package/src/index.js +82 -62
  246. package/src/loader.js +103 -0
  247. package/src/setupTests.js +5 -5
  248. package/tsconfig.json +51 -0
  249. package/types/charts.d.ts +569 -0
  250. package/types/components.d.ts +441 -0
  251. package/types/config.d.ts +199 -0
  252. package/types/index.d.ts +353 -0
@@ -1,165 +1,191 @@
1
- import React, { useEffect, useState } from 'react';
2
- import ScatterBio from './ScatterBio';
3
- import simplefetch from '../fetch/fetch';
4
- import { useAppContext } from '../appContext';
5
-
6
- const VisiumPlot = ({ props, style }) => {
7
- // Declare states at the beginning
8
- const { sharedData } = useAppContext();
9
- const { debug } = props;
10
-
11
- const [updatedProps, setUpdatedProps] = useState(props);
12
-
13
- useEffect(() => {
14
- const { metaval } = props;
15
-
16
- let section = sharedData[metaval] ?? [];
17
- let VisiumProps = {
18
- ...props,
19
- config: {
20
- ...props.config,
21
- //visium_cell_fraction: "BC",
22
- visualMap: {
23
- calculable: true,
24
- top: 'bottom',
25
- orient: 'horizontal',
26
- right: 'center',
27
- },
28
- zcolor: ['#FFFF80', '#FFA500', '#FF0000'],
29
- toolbox: {
30
- saveAsImage: {
31
- show: true,
32
- },
33
- },
34
- //dataZoom: "inside", // "inside", "slider", 'both'
35
- dotsize: '2',
36
- labels: {
37
- z: ['log2\n(tpm+1)', ''],
38
- },
39
-
40
- xAxis: {
41
- show: false,
42
- },
43
- yAxis: {
44
- show: false,
45
- },
46
- legend: false,
47
- formatter: (params) => {
48
- let resultHtml = '';
49
- for (const [key, value] of Object.entries(params.data)) {
50
- if (key === 'Expression') {
51
- continue;
52
- }
53
- if (value > 0.5) {
54
- // Only show the cell type with likelihood >= 0.5
55
- resultHtml += `<br>${key}: ${value.toFixed(3)}`;
56
- }
57
- }
58
- return `
59
- <div style="text-align: center;">
60
- ${params.name}
61
- <br> Cell2Location Cell Type Likelihood
62
- <br> (Likelihood >= 0.5)
63
- ${resultHtml}
64
- </div>
65
- `;
66
- },
67
- grid: {
68
- top: '15%',
69
- bottom: '12%',
70
- left: '5%',
71
- right: '10%',
72
- },
73
- },
74
- };
75
-
76
- const { cellval } = props;
77
-
78
- if (
79
- cellval &&
80
- sharedData[cellval] !== undefined &&
81
- sharedData[cellval].length > 0
82
- ) {
83
- let selected_celltype = sharedData[cellval][0];
84
- if (
85
- selected_celltype === 'Default' ||
86
- selected_celltype === 'None' ||
87
- selected_celltype === 'NA' ||
88
- selected_celltype === 'N/A' ||
89
- selected_celltype === 'Unknown' ||
90
- selected_celltype === 'Unassigned' ||
91
- selected_celltype === 'All'
92
- )
93
- VisiumProps.config.visium_cell_fraction = null;
94
- else {
95
- VisiumProps.config.visium_cell_fraction =
96
- sharedData[cellval][0];
97
- VisiumProps.config.visualMap.text = [
98
- 'Likelihood of being a ' + sharedData[cellval][0],
99
- '',
100
- ];
101
- }
102
- }
103
-
104
- function BufferImage(imageBuffer) {
105
- // Create a Blob object from the binary data
106
- const blob = new Blob([new Uint8Array(imageBuffer)], {
107
- type: 'image/png',
108
- });
109
- // Create a URL from the Blob
110
- const dataURL = URL.createObjectURL(blob);
111
- // Create the Image object
112
- const imageDom = new Image();
113
- imageDom.onload = () => {
114
- // Wait until the image is loaded
115
- // Set the background properties
116
- VisiumProps.config.backgroundColor = {
117
- image: dataURL,
118
- repeat: 'no-repeat',
119
- };
120
-
121
- //console.log("VisiumProps", VisiumProps);
122
- // Update the state with the loaded image
123
- setUpdatedProps(VisiumProps);
124
- };
125
- imageDom.src = dataURL;
126
- }
127
-
128
- const fetchImage = async () => {
129
- const imageBuffer = await simplefetch(image + section, {
130
- type: 'image',
131
- debug: debug,
132
- });
133
- BufferImage(imageBuffer.data);
134
- };
135
-
136
- const { image } = props;
137
- if (section.length > 0) {
138
- section = section[0];
139
- VisiumProps.config.title = {
140
- text: 'Section ' + section,
141
- left: 'center',
142
- top: 'top',
143
- textStyle: {
144
- fontSize: 25,
145
- fontWeight: 'bold',
146
- color: 'black',
147
- },
148
- };
149
- fetchImage();
150
- }
151
- }, [props, sharedData, debug]);
152
-
153
- return (
154
- <>
155
- <ScatterBio
156
- key={updatedProps.id + '.inherent'}
157
- props={updatedProps}
158
- style={style}
159
- reset={null}
160
- />
161
- </>
162
- );
163
- };
164
-
165
- export default VisiumPlot;
1
+ import React, { useEffect, useState, useRef } from 'react';
2
+ import ScatterBio from './ScatterBio';
3
+ import simplefetch from '../fetch/fetch';
4
+ import { useAppContext } from '../appContext';
5
+
6
+ const VisiumPlot = ({ props, style }) => {
7
+ // Declare states at the beginning
8
+ const { sharedData } = useAppContext();
9
+ const { debug } = props;
10
+
11
+ const [updatedProps, setUpdatedProps] = useState(() => ({
12
+ ...props,
13
+ config: {
14
+ ...props.config,
15
+ legend: false,
16
+ },
17
+ }));
18
+
19
+ // Use ref for sharedData/props to access latest without depending on them
20
+ const sharedDataRef = useRef(sharedData);
21
+ sharedDataRef.current = sharedData;
22
+ const propsRef = useRef(props);
23
+ propsRef.current = props;
24
+
25
+ // Extract stable keys
26
+ const { metaval, cellval, image: imageUrl } = props;
27
+ // Build snapshot of only the sharedData keys we depend on
28
+ const relevantKeys = [metaval, cellval].filter(Boolean);
29
+ const sharedDataSnapshot = JSON.stringify(
30
+ relevantKeys.reduce((acc, key) => {
31
+ acc[key] = sharedData[key];
32
+ return acc;
33
+ }, {}),
34
+ );
35
+
36
+ useEffect(() => {
37
+ const currentProps = propsRef.current;
38
+ const currentSharedData = sharedDataRef.current;
39
+
40
+ let section = currentSharedData[metaval] ?? [];
41
+ let VisiumProps = {
42
+ ...currentProps,
43
+ config: {
44
+ ...currentProps.config,
45
+ //visium_cell_fraction: "BC",
46
+ visualMap: {
47
+ calculable: true,
48
+ top: 'bottom',
49
+ orient: 'horizontal',
50
+ right: 'center',
51
+ },
52
+ zcolor: ['#FFFF80', '#FFA500', '#FF0000'],
53
+ toolbox: {
54
+ saveAsImage: {
55
+ show: true,
56
+ },
57
+ },
58
+ //dataZoom: "inside", // "inside", "slider", 'both'
59
+ dotsize: '2',
60
+ labels: {
61
+ z: ['log2\n(tpm+1)', ''],
62
+ },
63
+
64
+ xAxis: {
65
+ show: false,
66
+ },
67
+ yAxis: {
68
+ show: false,
69
+ },
70
+ legend: false,
71
+ formatter: (params) => {
72
+ let resultHtml = '';
73
+ for (const [key, value] of Object.entries(params.data)) {
74
+ if (key === 'Expression') {
75
+ continue;
76
+ }
77
+ if (value > 0.5) {
78
+ // Only show the cell type with likelihood >= 0.5
79
+ resultHtml += `<br>${key}: ${value.toFixed(3)}`;
80
+ }
81
+ }
82
+ return `
83
+ <div style="text-align: center;">
84
+ ${params.name}
85
+ <br> Cell2Location Cell Type Likelihood
86
+ <br> (Likelihood >= 0.5)
87
+ ${resultHtml}
88
+ </div>
89
+ `;
90
+ },
91
+ grid: {
92
+ top: '15%',
93
+ bottom: '12%',
94
+ left: '5%',
95
+ right: '10%',
96
+ },
97
+ },
98
+ };
99
+
100
+ if (
101
+ cellval &&
102
+ currentSharedData[cellval] !== undefined &&
103
+ currentSharedData[cellval].length > 0
104
+ ) {
105
+ let selected_celltype = currentSharedData[cellval][0];
106
+ if (
107
+ selected_celltype === 'Default' ||
108
+ selected_celltype === 'None' ||
109
+ selected_celltype === 'NA' ||
110
+ selected_celltype === 'N/A' ||
111
+ selected_celltype === 'Unknown' ||
112
+ selected_celltype === 'Unassigned' ||
113
+ selected_celltype === 'All'
114
+ )
115
+ VisiumProps.config.visium_cell_fraction = null;
116
+ else {
117
+ VisiumProps.config.visium_cell_fraction =
118
+ currentSharedData[cellval][0];
119
+ VisiumProps.config.visualMap.text = [
120
+ 'Likelihood of being a ' + currentSharedData[cellval][0],
121
+ '',
122
+ ];
123
+ }
124
+ }
125
+
126
+ function BufferImage(imageBuffer) {
127
+ // Create a Blob object from the binary data
128
+ const blob = new Blob([new Uint8Array(imageBuffer)], {
129
+ type: 'image/png',
130
+ });
131
+ // Create a URL from the Blob
132
+ const dataURL = URL.createObjectURL(blob);
133
+ // Create the Image object
134
+ const imageDom = new Image();
135
+ imageDom.onload = () => {
136
+ // Wait until the image is loaded
137
+ // Set the background properties
138
+ VisiumProps.config.backgroundColor = {
139
+ image: dataURL,
140
+ repeat: 'no-repeat',
141
+ };
142
+
143
+ //console.log("VisiumProps", VisiumProps);
144
+ // Update the state with the loaded image
145
+ setUpdatedProps(VisiumProps);
146
+ };
147
+ imageDom.src = dataURL;
148
+ }
149
+
150
+ const fetchImage = async () => {
151
+ const imageBuffer = await simplefetch(image + section, {
152
+ type: 'image',
153
+ debug: debug,
154
+ });
155
+ BufferImage(imageBuffer.data);
156
+ };
157
+
158
+ const { image } = currentProps;
159
+ if (section.length > 0) {
160
+ section = section[0];
161
+ VisiumProps.config.title = {
162
+ text: 'Section ' + section,
163
+ left: 'center',
164
+ top: 'top',
165
+ textStyle: {
166
+ fontSize: 25,
167
+ fontWeight: 'bold',
168
+ color: 'black',
169
+ },
170
+ };
171
+ // Always update props (for cell type changes etc.)
172
+ // Image fetch will update again with background when loaded
173
+ setUpdatedProps({ ...VisiumProps });
174
+ fetchImage();
175
+ }
176
+ // eslint-disable-next-line react-hooks/exhaustive-deps
177
+ }, [sharedDataSnapshot, metaval, cellval, imageUrl, debug]);
178
+
179
+ return (
180
+ <>
181
+ <ScatterBio
182
+ key={updatedProps.id + '.inherent'}
183
+ props={updatedProps}
184
+ style={style}
185
+ reset={null}
186
+ />
187
+ </>
188
+ );
189
+ };
190
+
191
+ export default VisiumPlot;
@@ -1,42 +1,42 @@
1
- /*
2
- * @Author : Lihao leolihao@arizona.edu
3
- * @Date : 2023-12-25 21:57:39
4
- * @FilePath : /visualify.js/src/core/components/browser.js
5
- * @Description :
6
- * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
- */
8
- import React, { useEffect, useState } from 'react';
9
-
10
- function Browser({ props, style }) {
11
- const { src, style: _style, title, width, height } = props;
12
- const [error, setError] = useState(null);
13
-
14
- useEffect(() => {
15
- // Clear any previous error when the src changes
16
- setError(null);
17
- }, [src]);
18
-
19
- return (
20
- <>
21
- <iframe
22
- src={src}
23
- title={title}
24
- width={width}
25
- height={height}
26
- style={{ ...style }}
27
- onError={() => {
28
- setError('Error loading content. Please check the URL.');
29
- }}
30
- />
31
- {error && (
32
- <div
33
- className='iframe-error'
34
- style={{ ...style, ..._style }}>
35
- {error}
36
- </div>
37
- )}
38
- </>
39
- );
40
- }
41
-
42
- export default Browser;
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-12-25 21:57:39
4
+ * @FilePath : /visualify.js/src/core/components/browser.js
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ import React, { useEffect, useState } from 'react';
9
+
10
+ function Browser({ props, style }) {
11
+ const { src, style: _style, title, width, height } = props;
12
+ const [error, setError] = useState(null);
13
+
14
+ useEffect(() => {
15
+ // Clear any previous error when the src changes
16
+ setError(null);
17
+ }, [src]);
18
+
19
+ return (
20
+ <>
21
+ <iframe
22
+ src={src}
23
+ title={title}
24
+ width={width}
25
+ height={height}
26
+ style={{ ...style }}
27
+ onError={() => {
28
+ setError('Error loading content. Please check the URL.');
29
+ }}
30
+ />
31
+ {error && (
32
+ <div
33
+ className='iframe-error'
34
+ style={{ ...style, ..._style }}>
35
+ {error}
36
+ </div>
37
+ )}
38
+ </>
39
+ );
40
+ }
41
+
42
+ export default Browser;