@vitessce/vit-s 2.0.3-beta.0 → 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 (277) hide show
  1. package/dist/index.js +41348 -18
  2. package/dist-tsc/CallbackPublisher.d.ts +18 -0
  3. package/dist-tsc/CallbackPublisher.d.ts.map +1 -0
  4. package/{dist → dist-tsc}/CallbackPublisher.js +6 -12
  5. package/dist-tsc/LoadingIndicator.d.ts +2 -0
  6. package/dist-tsc/LoadingIndicator.d.ts.map +1 -0
  7. package/{dist → dist-tsc}/LoadingIndicator.js +1 -2
  8. package/dist-tsc/TitleInfo.d.ts +2 -0
  9. package/dist-tsc/TitleInfo.d.ts.map +1 -0
  10. package/{dist → dist-tsc}/TitleInfo.js +6 -83
  11. package/dist-tsc/VitS.d.ts +45 -0
  12. package/dist-tsc/VitS.d.ts.map +1 -0
  13. package/dist-tsc/VitS.js +119 -0
  14. package/dist-tsc/VitessceGrid.d.ts +23 -0
  15. package/dist-tsc/VitessceGrid.d.ts.map +1 -0
  16. package/{dist → dist-tsc}/VitessceGrid.js +14 -13
  17. package/dist-tsc/VitessceGrid.test.d.ts +2 -0
  18. package/dist-tsc/VitessceGrid.test.d.ts.map +1 -0
  19. package/{dist → dist-tsc}/VitessceGrid.test.js +8 -4
  20. package/dist-tsc/Warning.d.ts +2 -0
  21. package/dist-tsc/Warning.d.ts.map +1 -0
  22. package/{dist → dist-tsc}/Warning.js +2 -2
  23. package/dist-tsc/classNames.d.ts +8 -0
  24. package/dist-tsc/classNames.d.ts.map +1 -0
  25. package/dist-tsc/data/AbstractLoader.d.ts +22 -0
  26. package/dist-tsc/data/AbstractLoader.d.ts.map +1 -0
  27. package/dist-tsc/data/AbstractLoader.js +18 -0
  28. package/dist-tsc/data/AbstractTwoStepLoader.d.ts +6 -0
  29. package/dist-tsc/data/AbstractTwoStepLoader.d.ts.map +1 -0
  30. package/{dist → dist-tsc}/data/AbstractTwoStepLoader.js +1 -1
  31. package/dist-tsc/data/LoaderResult.d.ts +7 -0
  32. package/dist-tsc/data/LoaderResult.d.ts.map +1 -0
  33. package/dist-tsc/data/index.d.ts +4 -0
  34. package/dist-tsc/data/index.d.ts.map +1 -0
  35. package/dist-tsc/data/index.js +3 -0
  36. package/dist-tsc/data/loader-registry.d.ts +9 -0
  37. package/dist-tsc/data/loader-registry.d.ts.map +1 -0
  38. package/dist-tsc/data/loader-registry.js +27 -0
  39. package/dist-tsc/data-hook-utils.d.ts +69 -0
  40. package/dist-tsc/data-hook-utils.d.ts.map +1 -0
  41. package/{dist → dist-tsc}/data-hook-utils.js +4 -6
  42. package/dist-tsc/data-hooks.d.ts +77 -0
  43. package/dist-tsc/data-hooks.d.ts.map +1 -0
  44. package/{dist → dist-tsc}/data-hooks.js +4 -4
  45. package/dist-tsc/errors/AbstractLoaderError.d.ts +10 -0
  46. package/dist-tsc/errors/AbstractLoaderError.d.ts.map +1 -0
  47. package/dist-tsc/errors/DataSourceFetchError.d.ts +8 -0
  48. package/dist-tsc/errors/DataSourceFetchError.d.ts.map +1 -0
  49. package/{dist → dist-tsc}/errors/DataSourceFetchError.js +1 -1
  50. package/dist-tsc/errors/DatasetNotFoundError.d.ts +6 -0
  51. package/dist-tsc/errors/DatasetNotFoundError.d.ts.map +1 -0
  52. package/{dist → dist-tsc}/errors/DatasetNotFoundError.js +1 -1
  53. package/dist-tsc/errors/LoaderNotFoundError.d.ts +10 -0
  54. package/dist-tsc/errors/LoaderNotFoundError.d.ts.map +1 -0
  55. package/{dist → dist-tsc}/errors/LoaderNotFoundError.js +1 -1
  56. package/dist-tsc/errors/LoaderValidationError.d.ts +10 -0
  57. package/dist-tsc/errors/LoaderValidationError.d.ts.map +1 -0
  58. package/{dist → dist-tsc}/errors/LoaderValidationError.js +1 -1
  59. package/dist-tsc/errors/index.d.ts +6 -0
  60. package/dist-tsc/errors/index.d.ts.map +1 -0
  61. package/{dist → dist-tsc}/errors/index.js +5 -6
  62. package/dist-tsc/hooks.d.ts +80 -0
  63. package/dist-tsc/hooks.d.ts.map +1 -0
  64. package/{dist → dist-tsc}/hooks.js +60 -4
  65. package/dist-tsc/index.d.ts +11 -0
  66. package/dist-tsc/index.d.ts.map +1 -0
  67. package/dist-tsc/index.js +11 -0
  68. package/dist-tsc/plugins.test.fixtures.d.ts +61 -0
  69. package/dist-tsc/plugins.test.fixtures.d.ts.map +1 -0
  70. package/{dist → dist-tsc}/schemas/config-1.0.16.schema.json +21 -41
  71. package/dist-tsc/schemas/obsSets.schema.d.ts +179 -0
  72. package/dist-tsc/schemas/obsSets.schema.d.ts.map +1 -0
  73. package/dist-tsc/schemas/obsSetsTabular.schema.d.ts +57 -0
  74. package/dist-tsc/schemas/obsSetsTabular.schema.d.ts.map +1 -0
  75. package/dist-tsc/schemas/raster.schema.d.ts +239 -0
  76. package/dist-tsc/schemas/raster.schema.d.ts.map +1 -0
  77. package/dist-tsc/shared-mui/components.d.ts +2 -0
  78. package/dist-tsc/shared-mui/components.d.ts.map +1 -0
  79. package/{dist → dist-tsc}/shared-mui/components.js +2 -8
  80. package/dist-tsc/shared-mui/container.d.ts +2 -0
  81. package/dist-tsc/shared-mui/container.d.ts.map +1 -0
  82. package/{dist → dist-tsc}/shared-mui/container.js +1 -1
  83. package/dist-tsc/shared-mui/styles.d.ts +5 -0
  84. package/dist-tsc/shared-mui/styles.d.ts.map +1 -0
  85. package/{dist → dist-tsc}/shared-mui/styles.js +4 -2
  86. package/dist-tsc/shared-plot-options/CellColorEncodingOption.d.ts +2 -0
  87. package/dist-tsc/shared-plot-options/CellColorEncodingOption.d.ts.map +1 -0
  88. package/{dist → dist-tsc}/shared-plot-options/CellColorEncodingOption.js +3 -4
  89. package/dist-tsc/shared-plot-options/OptionSelect.d.ts +2 -0
  90. package/dist-tsc/shared-plot-options/OptionSelect.d.ts.map +1 -0
  91. package/{dist → dist-tsc}/shared-plot-options/OptionSelect.js +2 -2
  92. package/dist-tsc/shared-plot-options/OptionsContainer.d.ts +2 -0
  93. package/dist-tsc/shared-plot-options/OptionsContainer.d.ts.map +1 -0
  94. package/{dist → dist-tsc}/shared-plot-options/OptionsContainer.js +2 -5
  95. package/dist-tsc/shared-plot-options/index.d.ts +5 -0
  96. package/dist-tsc/shared-plot-options/index.d.ts.map +1 -0
  97. package/dist-tsc/shared-plot-options/index.js +4 -0
  98. package/dist-tsc/shared-plot-options/styles.d.ts +2 -0
  99. package/dist-tsc/shared-plot-options/styles.d.ts.map +1 -0
  100. package/{dist → dist-tsc}/shared-plot-options/styles.js +1 -1
  101. package/dist-tsc/state/hooks.d.ts +216 -0
  102. package/dist-tsc/state/hooks.d.ts.map +1 -0
  103. package/{dist → dist-tsc}/state/hooks.js +47 -21
  104. package/dist-tsc/title-styles.d.ts +2 -0
  105. package/dist-tsc/title-styles.d.ts.map +1 -0
  106. package/dist-tsc/title-styles.js +72 -0
  107. package/dist-tsc/view-config-utils.d.ts +30 -0
  108. package/dist-tsc/view-config-utils.d.ts.map +1 -0
  109. package/{dist → dist-tsc}/view-config-utils.js +32 -84
  110. package/dist-tsc/view-config-utils.test.d.ts +2 -0
  111. package/dist-tsc/view-config-utils.test.d.ts.map +1 -0
  112. package/dist-tsc/view-config-utils.test.fixtures.d.ts +1049 -0
  113. package/dist-tsc/view-config-utils.test.fixtures.d.ts.map +1 -0
  114. package/{dist → dist-tsc}/view-config-utils.test.fixtures.js +118 -0
  115. package/dist-tsc/view-config-utils.test.js +209 -0
  116. package/dist-tsc/vitessce-grid-layout/VitessceGridLayout.d.ts +8 -0
  117. package/dist-tsc/vitessce-grid-layout/VitessceGridLayout.d.ts.map +1 -0
  118. package/{dist → dist-tsc}/vitessce-grid-layout/VitessceGridLayout.js +47 -28
  119. package/dist-tsc/vitessce-grid-layout/VitessceGridLayout.test.d.ts +2 -0
  120. package/dist-tsc/vitessce-grid-layout/VitessceGridLayout.test.d.ts.map +1 -0
  121. package/{dist → dist-tsc}/vitessce-grid-layout/VitessceGridLayout.test.js +13 -5
  122. package/dist-tsc/vitessce-grid-layout/index.d.ts +2 -0
  123. package/dist-tsc/vitessce-grid-layout/index.d.ts.map +1 -0
  124. package/dist-tsc/vitessce-grid-layout/index.js +1 -0
  125. package/dist-tsc/vitessce-grid-layout/layout-utils.d.ts +15 -0
  126. package/dist-tsc/vitessce-grid-layout/layout-utils.d.ts.map +1 -0
  127. package/{dist → dist-tsc}/vitessce-grid-layout/layout-utils.js +2 -1
  128. package/dist-tsc/vitessce-grid-layout/layout-utils.test.d.ts +2 -0
  129. package/dist-tsc/vitessce-grid-layout/layout-utils.test.d.ts.map +1 -0
  130. package/{dist → dist-tsc}/vitessce-grid-layout/layout-utils.test.js +3 -1
  131. package/dist-tsc/vitessce-grid-utils.d.ts +13 -0
  132. package/dist-tsc/vitessce-grid-utils.d.ts.map +1 -0
  133. package/{dist → dist-tsc}/vitessce-grid-utils.js +15 -14
  134. package/package.json +24 -11
  135. package/src/CallbackPublisher.js +77 -0
  136. package/src/LoadingIndicator.js +33 -0
  137. package/src/TitleInfo.js +167 -0
  138. package/src/VitS.js +202 -0
  139. package/src/VitessceGrid.js +118 -0
  140. package/src/VitessceGrid.test.jsx +57 -0
  141. package/src/Warning.js +62 -0
  142. package/src/classNames.js +8 -0
  143. package/src/data/AbstractLoader.js +23 -0
  144. package/src/data/AbstractTwoStepLoader.js +8 -0
  145. package/src/data/LoaderResult.js +8 -0
  146. package/src/data/index.js +3 -0
  147. package/src/data/loader-registry.js +28 -0
  148. package/src/data-hook-utils.js +195 -0
  149. package/src/data-hooks.js +354 -0
  150. package/src/errors/AbstractLoaderError.js +14 -0
  151. package/src/errors/DataSourceFetchError.js +15 -0
  152. package/src/errors/DatasetNotFoundError.js +23 -0
  153. package/src/errors/LoaderNotFoundError.js +24 -0
  154. package/src/errors/LoaderValidationError.js +23 -0
  155. package/src/errors/index.js +5 -0
  156. package/src/hooks.js +317 -0
  157. package/src/index.js +76 -0
  158. package/src/plugins.test.fixtures.js +78 -0
  159. package/src/schemas/config-0.1.0.schema.json +85 -0
  160. package/src/schemas/config-1.0.0.schema.json +733 -0
  161. package/src/schemas/config-1.0.1.schema.json +909 -0
  162. package/src/schemas/config-1.0.10.schema.json +969 -0
  163. package/src/schemas/config-1.0.11.schema.json +990 -0
  164. package/src/schemas/config-1.0.12.schema.json +997 -0
  165. package/src/schemas/config-1.0.13.schema.json +1013 -0
  166. package/src/schemas/config-1.0.14.schema.json +1048 -0
  167. package/src/schemas/config-1.0.15.schema.json +1048 -0
  168. package/src/schemas/config-1.0.16.schema.json +1089 -0
  169. package/src/schemas/config-1.0.2.schema.json +911 -0
  170. package/src/schemas/config-1.0.3.schema.json +911 -0
  171. package/src/schemas/config-1.0.4.schema.json +949 -0
  172. package/src/schemas/config-1.0.5.schema.json +949 -0
  173. package/src/schemas/config-1.0.6.schema.json +950 -0
  174. package/src/schemas/config-1.0.7.schema.json +950 -0
  175. package/src/schemas/config-1.0.8.schema.json +966 -0
  176. package/src/schemas/config-1.0.9.schema.json +965 -0
  177. package/src/schemas/fixtures/cellSets.good.json +16 -0
  178. package/src/schemas/fixtures/config-1.0.1.bad.json +1 -0
  179. package/src/schemas/fixtures/config-1.0.1.bad.message.json +11 -0
  180. package/src/schemas/fixtures/config-1.0.1.good.json +37 -0
  181. package/src/schemas/fixtures/config-1.0.2.bad.json +1 -0
  182. package/src/schemas/fixtures/config-1.0.2.bad.message.json +11 -0
  183. package/src/schemas/fixtures/config-1.0.2.good.json +38 -0
  184. package/src/schemas/fixtures/config-1.0.3.bad.json +1 -0
  185. package/src/schemas/fixtures/config-1.0.3.bad.message.json +11 -0
  186. package/src/schemas/fixtures/config-1.0.3.good.json +38 -0
  187. package/src/schemas/fixtures/obsSets.bad.json +1 -0
  188. package/src/schemas/fixtures/obsSets.bad.message.json +11 -0
  189. package/src/schemas/fixtures/obsSets.good.json +16 -0
  190. package/src/schemas/fixtures/obsSetsTabular.bad.json +1 -0
  191. package/src/schemas/fixtures/obsSetsTabular.bad.message.json +11 -0
  192. package/src/schemas/fixtures/obsSetsTabular.good.json +26 -0
  193. package/src/schemas/fixtures/raster.bad.json +1 -0
  194. package/src/schemas/fixtures/raster.bad.message.json +11 -0
  195. package/src/schemas/fixtures/raster.good.json +39 -0
  196. package/src/schemas/obsSets.schema.js +195 -0
  197. package/src/schemas/obsSetsTabular.schema.js +39 -0
  198. package/src/schemas/raster.schema.js +121 -0
  199. package/src/schemas/schema-schema.sh +34 -0
  200. package/src/shared-mui/components.js +81 -0
  201. package/src/shared-mui/container.js +212 -0
  202. package/src/shared-mui/styles.js +113 -0
  203. package/src/shared-plot-options/CellColorEncodingOption.js +42 -0
  204. package/src/shared-plot-options/OptionSelect.js +19 -0
  205. package/src/shared-plot-options/OptionsContainer.js +23 -0
  206. package/src/shared-plot-options/index.js +4 -0
  207. package/src/shared-plot-options/styles.js +49 -0
  208. package/src/state/hooks.js +640 -0
  209. package/src/title-styles.js +73 -0
  210. package/src/view-config-utils.js +263 -0
  211. package/src/view-config-utils.test.fixtures.js +893 -0
  212. package/src/view-config-utils.test.jsx +222 -0
  213. package/src/vitessce-grid-layout/VitessceGridLayout.js +179 -0
  214. package/src/vitessce-grid-layout/VitessceGridLayout.test.jsx +64 -0
  215. package/src/vitessce-grid-layout/index.js +1 -0
  216. package/src/vitessce-grid-layout/layout-utils.js +76 -0
  217. package/src/vitessce-grid-layout/layout-utils.test.js +167 -0
  218. package/src/vitessce-grid-utils.js +172 -0
  219. package/dist/VitS.js +0 -117
  220. package/dist/Vitessce.integration.test.js +0 -36
  221. package/dist/Vitessce.js +0 -101
  222. package/dist/component-registry.js +0 -16
  223. package/dist/data/AbstractLoader.js +0 -35
  224. package/dist/data/index.js +0 -3
  225. package/dist/data/loader-registry.js +0 -15
  226. package/dist/errors/OptionsValidationError.js +0 -15
  227. package/dist/export-utils.js +0 -70
  228. package/dist/export-utils.test.js +0 -66
  229. package/dist/file-options-schemas-legacy.js +0 -136
  230. package/dist/file-options-schemas-legacy.test.js +0 -126
  231. package/dist/file-options-schemas.js +0 -322
  232. package/dist/file-options-schemas.test.js +0 -23
  233. package/dist/joint-file-types-legacy.js +0 -278
  234. package/dist/joint-file-types-legacy.test.js +0 -400
  235. package/dist/joint-file-types.js +0 -148
  236. package/dist/joint-file-types.test.js +0 -139
  237. package/dist/loader-registry.js +0 -98
  238. package/dist/plugins.js +0 -154
  239. package/dist/plugins.test.js +0 -30
  240. package/dist/schemas/PrettyJsonSchema.js +0 -34
  241. package/dist/schemas/config-1.0.15.schema.test.js +0 -22
  242. package/dist/schemas/config-1.0.16.schema.test.js +0 -22
  243. package/dist/schemas/obs-sets-tabular.schema.js +0 -37
  244. package/dist/schemas/obs-sets.schema.js +0 -194
  245. package/dist/schemas/schema.test-old.js +0 -50
  246. package/dist/schemas/schema.test.js +0 -46
  247. package/dist/schemas-extra.js +0 -3
  248. package/dist/schemas.js +0 -4
  249. package/dist/shared-plot-options/index.js +0 -4
  250. package/dist/view-config-upgraders.js +0 -525
  251. package/dist/view-config-utils.test.js +0 -66
  252. package/dist/view-config-versions.js +0 -47
  253. package/dist/vitessce-grid-layout/index.js +0 -1
  254. /package/{dist → dist-tsc}/classNames.js +0 -0
  255. /package/{dist → dist-tsc}/data/LoaderResult.js +0 -0
  256. /package/{dist → dist-tsc}/errors/AbstractLoaderError.js +0 -0
  257. /package/{dist → dist-tsc}/plugins.test.fixtures.js +0 -0
  258. /package/{dist → dist-tsc}/schemas/config-0.1.0.schema.json +0 -0
  259. /package/{dist → dist-tsc}/schemas/config-1.0.0.schema.json +0 -0
  260. /package/{dist → dist-tsc}/schemas/config-1.0.1.schema.json +0 -0
  261. /package/{dist → dist-tsc}/schemas/config-1.0.10.schema.json +0 -0
  262. /package/{dist → dist-tsc}/schemas/config-1.0.11.schema.json +0 -0
  263. /package/{dist → dist-tsc}/schemas/config-1.0.12.schema.json +0 -0
  264. /package/{dist → dist-tsc}/schemas/config-1.0.13.schema.json +0 -0
  265. /package/{dist → dist-tsc}/schemas/config-1.0.14.schema.json +0 -0
  266. /package/{dist → dist-tsc}/schemas/config-1.0.15.schema.json +0 -0
  267. /package/{dist → dist-tsc}/schemas/config-1.0.2.schema.json +0 -0
  268. /package/{dist → dist-tsc}/schemas/config-1.0.3.schema.json +0 -0
  269. /package/{dist → dist-tsc}/schemas/config-1.0.4.schema.json +0 -0
  270. /package/{dist → dist-tsc}/schemas/config-1.0.5.schema.json +0 -0
  271. /package/{dist → dist-tsc}/schemas/config-1.0.6.schema.json +0 -0
  272. /package/{dist → dist-tsc}/schemas/config-1.0.7.schema.json +0 -0
  273. /package/{dist → dist-tsc}/schemas/config-1.0.8.schema.json +0 -0
  274. /package/{dist → dist-tsc}/schemas/config-1.0.9.schema.json +0 -0
  275. /package/{dist → dist-tsc}/schemas/obsSets.schema.js +0 -0
  276. /package/{dist → dist-tsc}/schemas/obsSetsTabular.schema.js +0 -0
  277. /package/{dist → dist-tsc}/schemas/raster.schema.js +0 -0
@@ -0,0 +1,354 @@
1
+ import { useState, useEffect, useMemo } from 'react';
2
+ import { CoordinationType, DataType, STATUS } from '@vitessce/constants-internal';
3
+ import { fromEntries } from '@vitessce/utils';
4
+ import { useMatchingLoader, useMultiCoordinationValues, useSetWarning } from './state/hooks.js';
5
+ import {
6
+ LoaderNotFoundError,
7
+ } from './errors/index.js';
8
+ import {
9
+ warn,
10
+ useDataType,
11
+ useDataTypeMulti,
12
+ } from './data-hook-utils.js';
13
+
14
+ /**
15
+ * Get the dataset description string.
16
+ * @param {object} loaders The object mapping
17
+ * datasets and data types to loader instances.
18
+ * @param {string} dataset The key for a dataset,
19
+ * used to identify which loader to use.
20
+ * @returns {array} [description] where
21
+ * description is a string.
22
+ */
23
+ export function useDescription(loaders, dataset) {
24
+ const [description, setDescription] = useState();
25
+
26
+ useEffect(() => {
27
+ if (!loaders[dataset]) {
28
+ return;
29
+ }
30
+
31
+ if (loaders[dataset].description) {
32
+ setDescription(loaders[dataset].description);
33
+ } else {
34
+ setDescription(null);
35
+ }
36
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37
+ }, [loaders, dataset]);
38
+
39
+ return [description];
40
+ }
41
+
42
+ /**
43
+ * Get data from a cells data type loader,
44
+ * updating "ready" and URL state appropriately.
45
+ * Throw warnings if the data is marked as required.
46
+ * Subscribe to loader updates.
47
+ * @param {object} loaders The object mapping
48
+ * datasets and data types to loader instances.
49
+ * @param {string} dataset The key for a dataset,
50
+ * used to identify which loader to use.
51
+ * @param {function} addUrl A function to call to update
52
+ * the URL list.
53
+ * @param {boolean} isRequired Should a warning be thrown if
54
+ * loading is unsuccessful?
55
+ * @param {object} coordinationSetters Object where
56
+ * keys are coordination type names with the prefix 'set',
57
+ * values are coordination setter functions.
58
+ * @param {object} initialCoordinationValues Object where
59
+ * keys are coordination type names with the prefix 'initialize',
60
+ * values are initialization preferences as boolean values.
61
+ * @returns {array} [cells, cellsCount] where
62
+ * cells is an object and cellsCount is the
63
+ * number of items in the cells object.
64
+ */
65
+ export function useObsEmbeddingData(
66
+ loaders, dataset, addUrl, isRequired,
67
+ coordinationSetters, initialCoordinationValues, matchOn,
68
+ ) {
69
+ return useDataType(
70
+ DataType.OBS_EMBEDDING,
71
+ loaders, dataset, addUrl, isRequired,
72
+ coordinationSetters, initialCoordinationValues, matchOn,
73
+ );
74
+ }
75
+
76
+ export function useObsLocationsData(
77
+ loaders, dataset, addUrl, isRequired,
78
+ coordinationSetters, initialCoordinationValues, matchOn,
79
+ ) {
80
+ return useDataType(
81
+ DataType.OBS_LOCATIONS,
82
+ loaders, dataset, addUrl, isRequired,
83
+ coordinationSetters, initialCoordinationValues, matchOn,
84
+ );
85
+ }
86
+
87
+ export function useObsLabelsData(
88
+ loaders, dataset, addUrl, isRequired,
89
+ coordinationSetters, initialCoordinationValues, matchOn,
90
+ ) {
91
+ return useDataType(
92
+ DataType.OBS_LABELS,
93
+ loaders, dataset, addUrl, isRequired,
94
+ coordinationSetters, initialCoordinationValues, matchOn,
95
+ );
96
+ }
97
+
98
+ export function useObsSegmentationsData(
99
+ loaders, dataset, addUrl, isRequired,
100
+ coordinationSetters, initialCoordinationValues, matchOn,
101
+ ) {
102
+ return useDataType(
103
+ DataType.OBS_SEGMENTATIONS,
104
+ loaders, dataset, addUrl, isRequired,
105
+ coordinationSetters, initialCoordinationValues, matchOn,
106
+ );
107
+ }
108
+
109
+ export function useObsSetsData(
110
+ loaders, dataset, addUrl, isRequired,
111
+ coordinationSetters, initialCoordinationValues, matchOn,
112
+ ) {
113
+ return useDataType(
114
+ DataType.OBS_SETS,
115
+ loaders, dataset, addUrl, isRequired,
116
+ coordinationSetters, initialCoordinationValues, matchOn,
117
+ );
118
+ }
119
+
120
+ export function useObsFeatureMatrixData(
121
+ loaders, dataset, addUrl, isRequired,
122
+ coordinationSetters, initialCoordinationValues, matchOn,
123
+ ) {
124
+ return useDataType(
125
+ DataType.OBS_FEATURE_MATRIX,
126
+ loaders, dataset, addUrl, isRequired,
127
+ coordinationSetters, initialCoordinationValues, matchOn,
128
+ );
129
+ }
130
+
131
+ export function useFeatureLabelsData(
132
+ loaders, dataset, addUrl, isRequired,
133
+ coordinationSetters, initialCoordinationValues, matchOn,
134
+ ) {
135
+ return useDataType(
136
+ DataType.FEATURE_LABELS,
137
+ loaders, dataset, addUrl, isRequired,
138
+ coordinationSetters, initialCoordinationValues, matchOn,
139
+ );
140
+ }
141
+
142
+ export function useImageData(
143
+ loaders, dataset, addUrl, isRequired,
144
+ coordinationSetters, initialCoordinationValues, matchOn,
145
+ ) {
146
+ return useDataType(
147
+ DataType.IMAGE,
148
+ loaders, dataset, addUrl, isRequired,
149
+ coordinationSetters, initialCoordinationValues, matchOn,
150
+ );
151
+ }
152
+
153
+ export function useGenomicProfilesData(
154
+ loaders, dataset, addUrl, isRequired,
155
+ coordinationSetters, initialCoordinationValues, matchOn,
156
+ ) {
157
+ return useDataType(
158
+ DataType.GENOMIC_PROFILES,
159
+ loaders, dataset, addUrl, isRequired,
160
+ coordinationSetters, initialCoordinationValues, matchOn,
161
+ );
162
+ }
163
+
164
+ export function useNeighborhoodsData(
165
+ loaders, dataset, addUrl, isRequired,
166
+ coordinationSetters, initialCoordinationValues, matchOn,
167
+ ) {
168
+ return useDataType(
169
+ DataType.NEIGHBORHOODS,
170
+ loaders, dataset, addUrl, isRequired,
171
+ coordinationSetters, initialCoordinationValues, matchOn,
172
+ );
173
+ }
174
+
175
+ /**
176
+ * Get data from the expression matrix data type loader for a given gene selection.
177
+ * Throw warnings if the data is marked as required.
178
+ * Subscribe to loader updates.
179
+ * @param {object} loaders The object mapping
180
+ * datasets and data types to loader instances.
181
+ * @param {string} dataset The key for a dataset,
182
+ * used to identify which loader to use.
183
+ * @param {boolean} isRequired Should a warning be thrown if
184
+ * loading is unsuccessful?
185
+ * @param {boolean} selection A list of gene names to get expression data for.
186
+ * @returns {array} [geneData] where geneData is an array [Uint8Array, ..., Uint8Array]
187
+ * for however many genes are in the selection.
188
+ */
189
+ export function useFeatureSelection(
190
+ loaders,
191
+ dataset,
192
+ isRequired,
193
+ selection,
194
+ matchOn,
195
+ ) {
196
+ const [geneData, setGeneData] = useState();
197
+ const [status, setStatus] = useState(STATUS.LOADING);
198
+ const [loadedGeneName, setLoadedGeneName] = useState(null);
199
+
200
+ const setWarning = useSetWarning();
201
+ const loader = useMatchingLoader(loaders, dataset, DataType.OBS_FEATURE_MATRIX, matchOn);
202
+
203
+ useEffect(() => {
204
+ if (!selection) {
205
+ setGeneData(null);
206
+ setLoadedGeneName(null);
207
+ setStatus(STATUS.SUCCESS);
208
+ return;
209
+ }
210
+ if (loader) {
211
+ setGeneData(null);
212
+ setLoadedGeneName(null);
213
+ setStatus(STATUS.LOADING);
214
+ const implementsGeneSelection = typeof loader.loadGeneSelection === 'function';
215
+ if (implementsGeneSelection) {
216
+ loader
217
+ .loadGeneSelection({ selection })
218
+ .catch(e => warn(e, setWarning))
219
+ .then((payload) => {
220
+ if (!payload) return;
221
+ const { data } = payload;
222
+ setGeneData(data);
223
+ setStatus(STATUS.SUCCESS);
224
+ setLoadedGeneName(selection);
225
+ });
226
+ } else {
227
+ loader.load().catch(e => warn(e, setWarning)).then((payload) => {
228
+ if (!payload) return;
229
+ const { data } = payload;
230
+ const { obsIndex, featureIndex, obsFeatureMatrix } = data;
231
+ const expressionDataForSelection = selection.map((sel) => {
232
+ const geneIndex = featureIndex.indexOf(sel);
233
+ const numGenes = featureIndex.length;
234
+ const numCells = obsIndex.length;
235
+ const expressionData = new Float32Array(numCells);
236
+ for (let cellIndex = 0; cellIndex < numCells; cellIndex += 1) {
237
+ expressionData[cellIndex] = obsFeatureMatrix.data[cellIndex * numGenes + geneIndex];
238
+ }
239
+ return expressionData;
240
+ });
241
+ setGeneData(expressionDataForSelection);
242
+ setStatus(STATUS.SUCCESS);
243
+ setLoadedGeneName(selection);
244
+ });
245
+ }
246
+ } else {
247
+ setGeneData(null);
248
+ setLoadedGeneName(null);
249
+ if (isRequired) {
250
+ warn(
251
+ new LoaderNotFoundError(loaders, dataset, DataType.OBS_FEATURE_MATRIX, matchOn),
252
+ setWarning,
253
+ );
254
+ setStatus(STATUS.ERROR);
255
+ } else {
256
+ setStatus(STATUS.SUCCESS);
257
+ }
258
+ }
259
+ // eslint-disable-next-line react-hooks/exhaustive-deps
260
+ }, [loader, selection]);
261
+
262
+ return [geneData, loadedGeneName, status];
263
+ }
264
+
265
+ /**
266
+ * Get the attributes for the expression matrix data type loader,
267
+ * i.e names of cells and genes.
268
+ * Throw warnings if the data is marked as required.
269
+ * Subscribe to loader updates. Should not be used in conjunction (called in the same component)
270
+ * with useExpressionMatrixData.
271
+ * @param {object} loaders The object mapping
272
+ * datasets and data types to loader instances.
273
+ * @param {string} dataset The key for a dataset,
274
+ * used to identify which loader to use.
275
+ * @param {function} addUrl A function to call to update
276
+ * the URL list.
277
+ * @param {boolean} isRequired Should a warning be thrown if
278
+ * loading is unsuccessful?
279
+ * @returns {object} [attrs] { rows, cols } object containing cell and gene names.
280
+ */
281
+ export function useObsFeatureMatrixIndices(
282
+ loaders, dataset, addUrl, isRequired, matchOn,
283
+ ) {
284
+ const [data, setData] = useState({});
285
+ const [status, setStatus] = useState(STATUS.LOADING);
286
+
287
+ const setWarning = useSetWarning();
288
+ const loader = useMatchingLoader(loaders, dataset, DataType.OBS_FEATURE_MATRIX, matchOn);
289
+
290
+ useEffect(() => {
291
+ if (loader) {
292
+ setStatus(STATUS.LOADING);
293
+ const implementsLoadAttrs = typeof loader.loadAttrs === 'function';
294
+ if (implementsLoadAttrs) {
295
+ loader.loadAttrs().catch(e => warn(e, setWarning)).then((payload) => {
296
+ if (!payload) return;
297
+ const { data: payloadData, url } = payload;
298
+ setData({
299
+ obsIndex: payloadData.rows,
300
+ featureIndex: payloadData.cols,
301
+ });
302
+ addUrl(url, DataType.OBS_FEATURE_MATRIX);
303
+ setStatus(STATUS.SUCCESS);
304
+ });
305
+ } else {
306
+ loader.load().catch(e => warn(e, setWarning)).then((payload) => {
307
+ if (!payload) return;
308
+ const { data: payloadData, url } = payload;
309
+ setData({
310
+ obsIndex: payloadData.obsIndex,
311
+ featureIndex: payloadData.featureIndex,
312
+ });
313
+ addUrl(url, DataType.OBS_FEATURE_MATRIX);
314
+ setStatus(STATUS.SUCCESS);
315
+ });
316
+ }
317
+ } else {
318
+ setData({});
319
+ if (isRequired) {
320
+ warn(
321
+ new LoaderNotFoundError(loaders, dataset, DataType.OBS_FEATURE_MATRIX, matchOn),
322
+ setWarning,
323
+ );
324
+ setStatus(STATUS.ERROR);
325
+ } else {
326
+ setStatus(STATUS.SUCCESS);
327
+ }
328
+ }
329
+ // eslint-disable-next-line react-hooks/exhaustive-deps
330
+ }, [loader]);
331
+
332
+ return [data, status];
333
+ }
334
+
335
+ export function useMultiObsLabels(
336
+ coordinationScopes, obsType, loaders, dataset, addUrl,
337
+ ) {
338
+ const obsLabelsTypes = useMultiCoordinationValues(
339
+ CoordinationType.OBS_LABELS_TYPE,
340
+ coordinationScopes,
341
+ );
342
+ const obsLabelsMatchOnObj = useMemo(() => fromEntries(
343
+ Object.entries(obsLabelsTypes).map(([scope, obsLabelsType]) => ([
344
+ scope,
345
+ { obsLabelsType, obsType },
346
+ ])),
347
+ ), [obsLabelsTypes, obsType]);
348
+ const [obsLabelsData, obsLabelsDataStatus] = useDataTypeMulti(
349
+ DataType.OBS_LABELS, loaders, dataset,
350
+ addUrl, false, {}, {},
351
+ obsLabelsMatchOnObj,
352
+ );
353
+ return [obsLabelsTypes, obsLabelsData, obsLabelsDataStatus];
354
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * A loader error ancestor class containing a default constructor
3
+ * and a stub for the required warnInConsole() method.
4
+ */
5
+ export default class AbstractLoaderError {
6
+ constructor(message) {
7
+ this.message = message;
8
+ }
9
+
10
+ // eslint-disable-next-line class-methods-use-this
11
+ warnInConsole() {
12
+ throw new Error('The warnInConsole() method has not been implemented.');
13
+ }
14
+ }
@@ -0,0 +1,15 @@
1
+ import AbstractLoaderError from './AbstractLoaderError.js';
2
+
3
+ export default class DataSourceFetchError extends AbstractLoaderError {
4
+ constructor(source, url, headers) {
5
+ super(`${source} Error HTTP Status fetching from ${url}`);
6
+ this.source = source;
7
+ this.url = url;
8
+ this.headers = headers;
9
+ }
10
+
11
+ warnInConsole() {
12
+ const { source, url, headers } = this;
13
+ console.warn(`${source} failed to fetch from ${url} with headers ${headers}`);
14
+ }
15
+ }
@@ -0,0 +1,23 @@
1
+ import AbstractLoaderError from './AbstractLoaderError.js';
2
+
3
+ export default class DatasetNotFoundError extends AbstractLoaderError {
4
+ constructor(datasetUid) {
5
+ super(`Error finding dataset for ${datasetUid}. Please check that at least one dataset exists in the view config.`);
6
+ this.name = 'DatasetNotFoundError';
7
+
8
+ this.datasetUid = datasetUid;
9
+ }
10
+
11
+ warnInConsole() {
12
+ const {
13
+ datasetUid,
14
+ } = this;
15
+ if (datasetUid) {
16
+ console.warn(
17
+ `Unable to find dataset for ${datasetUid}`,
18
+ );
19
+ } else {
20
+ console.warn('No dataset uid specified.');
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,24 @@
1
+ import AbstractLoaderError from './AbstractLoaderError.js';
2
+
3
+ export default class LoaderNotFoundError extends AbstractLoaderError {
4
+ constructor(loaders, dataset, fileType, viewCoordinationValues) {
5
+ super(`Error: unable to find matching ${fileType} file in dataset ${dataset}.`);
6
+ this.name = 'LoaderNotFoundError';
7
+
8
+ this.loaders = loaders;
9
+ this.dataset = dataset;
10
+ this.fileType = fileType;
11
+ this.viewCoordinationValues = viewCoordinationValues;
12
+ }
13
+
14
+ warnInConsole() {
15
+ const {
16
+ loaders, viewCoordinationValues,
17
+ } = this;
18
+ console.warn(
19
+ // eslint-disable-next-line prefer-template
20
+ `Expected to match on { ${Object.entries(viewCoordinationValues).map(([k, v]) => k + ': ' + v).join(', ')} }`,
21
+ loaders,
22
+ );
23
+ }
24
+ }
@@ -0,0 +1,23 @@
1
+ import AbstractLoaderError from './AbstractLoaderError.js';
2
+
3
+ export default class LoaderValidationError extends AbstractLoaderError {
4
+ constructor(datasetType, datasetFileType, datasetUrl, reason) {
5
+ super(`Error while validating ${datasetType}.`);
6
+ this.name = 'LoaderValidationError';
7
+
8
+ this.datasetType = datasetType;
9
+ this.datasetFileType = datasetFileType;
10
+ this.datasetUrl = datasetUrl;
11
+ this.reason = reason;
12
+ }
13
+
14
+ warnInConsole() {
15
+ const {
16
+ datasetType, datasetUrl, reason,
17
+ } = this;
18
+ console.warn(
19
+ `${datasetType} from ${datasetUrl}: validation failed`,
20
+ JSON.stringify(reason, null, 2),
21
+ );
22
+ }
23
+ }
@@ -0,0 +1,5 @@
1
+ export { default as AbstractLoaderError } from './AbstractLoaderError.js';
2
+ export { default as LoaderValidationError } from './LoaderValidationError.js';
3
+ export { default as LoaderNotFoundError } from './LoaderNotFoundError.js';
4
+ export { default as DatasetNotFoundError } from './DatasetNotFoundError.js';
5
+ export { default as DataSourceFetchError } from './DataSourceFetchError.js';