@macrostrat/column-views 2.3.3 → 2.4.1

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 (220) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/esm/{column-views.b977da35.js → column-views.083fb787.js} +5 -5
  3. package/dist/esm/{column-views.b977da35.js.map → column-views.083fb787.js.map} +1 -1
  4. package/dist/esm/{column-views.4685ea28.js → column-views.088a0274.js} +2 -2
  5. package/dist/esm/{column-views.4685ea28.js.map → column-views.088a0274.js.map} +1 -1
  6. package/dist/esm/{column-views.a665cbb2.js → column-views.11353c2c.js} +5 -5
  7. package/dist/esm/{column-views.a665cbb2.js.map → column-views.11353c2c.js.map} +1 -1
  8. package/dist/esm/{column-views.f7cdf6be.js → column-views.18655508.js} +3 -3
  9. package/dist/esm/{column-views.f7cdf6be.js.map → column-views.18655508.js.map} +1 -1
  10. package/dist/esm/column-views.1cd55918.js +206 -0
  11. package/dist/esm/column-views.1cd55918.js.map +1 -0
  12. package/dist/esm/column-views.1ef55568.js +15 -0
  13. package/dist/esm/{column-views.04636815.js.map → column-views.1ef55568.js.map} +1 -1
  14. package/dist/esm/{column-views.e075af15.js → column-views.3090f246.js} +22 -4
  15. package/dist/esm/column-views.3090f246.js.map +1 -0
  16. package/dist/esm/{column-views.c92a359e.js → column-views.33796541.js} +2 -2
  17. package/dist/esm/{column-views.c92a359e.js.map → column-views.33796541.js.map} +1 -1
  18. package/dist/esm/{column-views.488f24b6.js → column-views.3ae8f23d.js} +2 -2
  19. package/dist/esm/{column-views.488f24b6.js.map → column-views.3ae8f23d.js.map} +1 -1
  20. package/dist/esm/{column-views.faa7e52e.js → column-views.40d3688c.js} +3 -3
  21. package/dist/esm/{column-views.faa7e52e.js.map → column-views.40d3688c.js.map} +1 -1
  22. package/dist/esm/{column-views.b9265595.js → column-views.4e9b8594.js} +11 -10
  23. package/dist/esm/column-views.4e9b8594.js.map +1 -0
  24. package/dist/esm/{column-views.8c296309.js → column-views.5e1c216f.js} +27 -6
  25. package/dist/esm/column-views.5e1c216f.js.map +1 -0
  26. package/dist/esm/{column-views.e3f0cd7b.js → column-views.5e830e7c.js} +23 -33
  27. package/dist/esm/column-views.5e830e7c.js.map +1 -0
  28. package/dist/esm/{column-views.c149f7a5.js → column-views.5ec7294d.js} +3 -3
  29. package/dist/esm/{column-views.c149f7a5.js.map → column-views.5ec7294d.js.map} +1 -1
  30. package/dist/esm/column-views.67804ce5.js +68 -0
  31. package/dist/esm/column-views.67804ce5.js.map +1 -0
  32. package/dist/esm/{column-views.3f1cdc18.js → column-views.6f0d4f3a.js} +2 -2
  33. package/dist/esm/{column-views.3f1cdc18.js.map → column-views.6f0d4f3a.js.map} +1 -1
  34. package/dist/esm/{column-views.58b891df.js → column-views.76fb9948.js} +2 -2
  35. package/dist/esm/{column-views.58b891df.js.map → column-views.76fb9948.js.map} +1 -1
  36. package/dist/esm/{column-views.3d3e00be.js → column-views.77322764.js} +2 -2
  37. package/dist/esm/{column-views.3d3e00be.js.map → column-views.77322764.js.map} +1 -1
  38. package/dist/esm/{column-views.82a5112b.js → column-views.85d57d04.js} +4 -4
  39. package/dist/esm/{column-views.82a5112b.js.map → column-views.85d57d04.js.map} +1 -1
  40. package/dist/esm/{column-views.4e6eead3.js → column-views.88436022.js} +2 -2
  41. package/dist/esm/{column-views.4e6eead3.js.map → column-views.88436022.js.map} +1 -1
  42. package/dist/esm/{column-views.2f979aee.js → column-views.88b2418b.js} +3 -3
  43. package/dist/esm/{column-views.2f979aee.js.map → column-views.88b2418b.js.map} +1 -1
  44. package/dist/esm/{column-views.d6c0b7bc.js → column-views.8ce33ec6.js} +2 -2
  45. package/dist/esm/{column-views.d6c0b7bc.js.map → column-views.8ce33ec6.js.map} +1 -1
  46. package/dist/esm/{column-views.6f96d1c3.js → column-views.91c18fe3.js} +31 -19
  47. package/dist/esm/column-views.91c18fe3.js.map +1 -0
  48. package/dist/esm/{column-views.18aac6a5.js → column-views.99cb1c41.js} +3 -3
  49. package/dist/esm/{column-views.18aac6a5.js.map → column-views.99cb1c41.js.map} +1 -1
  50. package/dist/esm/{column-views.0a010643.js → column-views.ab2cc6cb.js} +27 -14
  51. package/dist/esm/column-views.ab2cc6cb.js.map +1 -0
  52. package/dist/esm/{column-views.d5fff9b8.js → column-views.af4278f0.js} +3 -3
  53. package/dist/esm/{column-views.d5fff9b8.js.map → column-views.af4278f0.js.map} +1 -1
  54. package/dist/esm/{column-views.d1b49f5c.js → column-views.b957dc19.js} +3 -3
  55. package/dist/esm/{column-views.d1b49f5c.js.map → column-views.b957dc19.js.map} +1 -1
  56. package/dist/esm/{column-views.ad2fe46c.js → column-views.bc83a85d.js} +19 -3
  57. package/dist/esm/column-views.bc83a85d.js.map +1 -0
  58. package/dist/esm/column-views.c1e507e6.js +113 -0
  59. package/dist/esm/column-views.c1e507e6.js.map +1 -0
  60. package/dist/esm/{column-views.ce3a3ac8.js → column-views.c93b63db.js} +3 -3
  61. package/dist/esm/column-views.c93b63db.js.map +1 -0
  62. package/dist/esm/{column-views.26e0e0b6.js → column-views.ce5251f7.js} +2 -2
  63. package/dist/esm/{column-views.26e0e0b6.js.map → column-views.ce5251f7.js.map} +1 -1
  64. package/dist/esm/{column-views.8d972657.js → column-views.d4e50f74.js} +3 -3
  65. package/dist/esm/{column-views.8d972657.js.map → column-views.d4e50f74.js.map} +1 -1
  66. package/dist/esm/{column-views.75b83110.js → column-views.dd2d5a6d.js} +5 -5
  67. package/dist/esm/{column-views.75b83110.js.map → column-views.dd2d5a6d.js.map} +1 -1
  68. package/dist/esm/{column-views.73fc96cb.js → column-views.e6882667.js} +5 -5
  69. package/dist/esm/{column-views.73fc96cb.js.map → column-views.e6882667.js.map} +1 -1
  70. package/dist/esm/{column-views.ee9d71ba.js → column-views.e885211d.js} +2 -2
  71. package/dist/esm/{column-views.ee9d71ba.js.map → column-views.e885211d.js.map} +1 -1
  72. package/dist/esm/{column-views.029ea8f1.js → column-views.ee2fd38f.js} +3 -3
  73. package/dist/esm/{column-views.029ea8f1.js.map → column-views.ee2fd38f.js.map} +1 -1
  74. package/dist/esm/{column-views.9d51a5ab.js → column-views.f35c4621.js} +2 -2
  75. package/dist/esm/column-views.f35c4621.js.map +1 -0
  76. package/dist/esm/{column-views.5fff0716.js → column-views.f56e604d.js} +3 -3
  77. package/dist/esm/{column-views.5fff0716.js.map → column-views.f56e604d.js.map} +1 -1
  78. package/dist/esm/{column-views.9ffc089b.js → column-views.f904e6d7.js} +3 -3
  79. package/dist/esm/{column-views.9ffc089b.js.map → column-views.f904e6d7.js.map} +1 -1
  80. package/dist/esm/{column-views.24060b85.js → column-views.fc4860bd.js} +4 -4
  81. package/dist/esm/{column-views.24060b85.js.map → column-views.fc4860bd.js.map} +1 -1
  82. package/dist/esm/{column-views.0da4503a.js → column-views.fedccce9.js} +2 -2
  83. package/dist/esm/{column-views.0da4503a.js.map → column-views.fedccce9.js.map} +1 -1
  84. package/dist/esm/index.d.ts +91 -86
  85. package/dist/esm/index.d.ts.map +1 -1
  86. package/dist/esm/index.js +11 -11
  87. package/dist/node/{column-views.02869dc5.js → column-views.003e0c17.js} +2 -2
  88. package/dist/node/{column-views.02869dc5.js.map → column-views.003e0c17.js.map} +1 -1
  89. package/dist/node/column-views.080781ca.js +2 -0
  90. package/dist/node/column-views.080781ca.js.map +1 -0
  91. package/dist/node/{column-views.00ad98fa.js → column-views.0818254f.js} +2 -2
  92. package/dist/node/{column-views.00ad98fa.js.map → column-views.0818254f.js.map} +1 -1
  93. package/dist/node/{column-views.2577dec0.js → column-views.0d48f51d.js} +2 -2
  94. package/dist/node/{column-views.2577dec0.js.map → column-views.0d48f51d.js.map} +1 -1
  95. package/dist/node/column-views.18e86c2d.js +2 -0
  96. package/dist/node/column-views.18e86c2d.js.map +1 -0
  97. package/dist/node/{column-views.8eae7028.js → column-views.375529b1.js} +2 -2
  98. package/dist/node/{column-views.8eae7028.js.map → column-views.375529b1.js.map} +1 -1
  99. package/dist/node/{column-views.6b391d60.js → column-views.39b71a38.js} +2 -2
  100. package/dist/node/{column-views.6b391d60.js.map → column-views.39b71a38.js.map} +1 -1
  101. package/dist/node/{column-views.47440961.js → column-views.447008d0.js} +2 -2
  102. package/dist/node/{column-views.47440961.js.map → column-views.447008d0.js.map} +1 -1
  103. package/dist/node/{column-views.c4188442.js → column-views.4d573ded.js} +2 -2
  104. package/dist/node/{column-views.c4188442.js.map → column-views.4d573ded.js.map} +1 -1
  105. package/dist/node/{column-views.8f540f78.js → column-views.4d8fc443.js} +2 -2
  106. package/dist/node/{column-views.8f540f78.js.map → column-views.4d8fc443.js.map} +1 -1
  107. package/dist/node/{column-views.3a947d58.js → column-views.54f7a243.js} +2 -2
  108. package/dist/node/{column-views.3a947d58.js.map → column-views.54f7a243.js.map} +1 -1
  109. package/dist/node/column-views.58b336f1.js +2 -0
  110. package/dist/node/column-views.58b336f1.js.map +1 -0
  111. package/dist/node/{column-views.465e593b.js → column-views.5908556a.js} +2 -2
  112. package/dist/node/{column-views.465e593b.js.map → column-views.5908556a.js.map} +1 -1
  113. package/dist/node/column-views.5c02450b.js +2 -0
  114. package/dist/node/column-views.5c02450b.js.map +1 -0
  115. package/dist/node/column-views.5e73411d.js +2 -0
  116. package/dist/node/column-views.5e73411d.js.map +1 -0
  117. package/dist/node/{column-views.825d2719.js → column-views.5f3f8ccf.js} +2 -2
  118. package/dist/node/{column-views.825d2719.js.map → column-views.5f3f8ccf.js.map} +1 -1
  119. package/dist/node/{column-views.0a2596c2.js → column-views.6051e986.js} +2 -2
  120. package/dist/node/{column-views.0a2596c2.js.map → column-views.6051e986.js.map} +1 -1
  121. package/dist/node/{column-views.c921fa1a.js → column-views.64fc40d6.js} +2 -2
  122. package/dist/node/{column-views.c921fa1a.js.map → column-views.64fc40d6.js.map} +1 -1
  123. package/dist/node/{column-views.6556e004.js → column-views.66663668.js} +2 -2
  124. package/dist/node/{column-views.6556e004.js.map → column-views.66663668.js.map} +1 -1
  125. package/dist/node/{column-views.a14f0134.js → column-views.6f0cb059.js} +2 -2
  126. package/dist/node/{column-views.a14f0134.js.map → column-views.6f0cb059.js.map} +1 -1
  127. package/dist/node/{column-views.9efa91f1.js → column-views.72c3c6e7.js} +2 -2
  128. package/dist/node/{column-views.9efa91f1.js.map → column-views.72c3c6e7.js.map} +1 -1
  129. package/dist/node/column-views.74fcfb9c.js +2 -0
  130. package/dist/node/column-views.74fcfb9c.js.map +1 -0
  131. package/dist/node/{column-views.75456275.js → column-views.784bac2a.js} +2 -2
  132. package/dist/node/{column-views.75456275.js.map → column-views.784bac2a.js.map} +1 -1
  133. package/dist/node/{column-views.0f401891.js → column-views.796fc1de.js} +2 -2
  134. package/dist/node/{column-views.0f401891.js.map → column-views.796fc1de.js.map} +1 -1
  135. package/dist/node/column-views.7b6e7d82.js +2 -0
  136. package/dist/node/column-views.7b6e7d82.js.map +1 -0
  137. package/dist/node/{column-views.7c322202.js → column-views.7e895e1a.js} +2 -2
  138. package/dist/node/{column-views.7c322202.js.map → column-views.7e895e1a.js.map} +1 -1
  139. package/dist/node/column-views.87d31e0a.js +2 -0
  140. package/dist/node/column-views.87d31e0a.js.map +1 -0
  141. package/dist/node/{column-views.59ce629d.js → column-views.94c8ce3e.js} +2 -2
  142. package/dist/node/{column-views.59ce629d.js.map → column-views.94c8ce3e.js.map} +1 -1
  143. package/dist/node/{column-views.48a3cfa3.js → column-views.951e3e9a.js} +2 -2
  144. package/dist/node/{column-views.48a3cfa3.js.map → column-views.951e3e9a.js.map} +1 -1
  145. package/dist/node/column-views.a0969fc8.js +2 -0
  146. package/dist/node/column-views.a0969fc8.js.map +1 -0
  147. package/dist/node/{column-views.67e7a200.js → column-views.b6613ab0.js} +2 -2
  148. package/dist/node/{column-views.67e7a200.js.map → column-views.b6613ab0.js.map} +1 -1
  149. package/dist/node/{column-views.d529d3aa.js → column-views.b762c9a8.js} +2 -2
  150. package/dist/node/{column-views.d529d3aa.js.map → column-views.b762c9a8.js.map} +1 -1
  151. package/dist/node/{column-views.e153680b.js → column-views.bdf05ed4.js} +2 -2
  152. package/dist/node/{column-views.e153680b.js.map → column-views.bdf05ed4.js.map} +1 -1
  153. package/dist/node/{column-views.fafbc028.js → column-views.d30231cb.js} +2 -2
  154. package/dist/node/{column-views.fafbc028.js.map → column-views.d30231cb.js.map} +1 -1
  155. package/dist/node/column-views.d86e6c7d.js +2 -0
  156. package/dist/node/column-views.d86e6c7d.js.map +1 -0
  157. package/dist/node/column-views.db3377d8.js +2 -0
  158. package/dist/node/column-views.db3377d8.js.map +1 -0
  159. package/dist/node/{column-views.2fe8feb9.js → column-views.f4063bc8.js} +2 -2
  160. package/dist/node/{column-views.2fe8feb9.js.map → column-views.f4063bc8.js.map} +1 -1
  161. package/dist/node/{column-views.3d0c2bea.js → column-views.f93b4175.js} +2 -2
  162. package/dist/node/{column-views.3d0c2bea.js.map → column-views.f93b4175.js.map} +1 -1
  163. package/dist/node/{column-views.cd54f1b1.js → column-views.fa5ee6de.js} +2 -2
  164. package/dist/node/{column-views.cd54f1b1.js.map → column-views.fa5ee6de.js.map} +1 -1
  165. package/dist/node/{column-views.08bef1f6.js → column-views.fe7a5452.js} +2 -2
  166. package/dist/node/{column-views.08bef1f6.js.map → column-views.fe7a5452.js.map} +1 -1
  167. package/dist/node/column-views.ffbffec7.js +2 -0
  168. package/dist/node/column-views.ffbffec7.js.map +1 -0
  169. package/dist/node/index.js +1 -1
  170. package/dist/node/index.js.map +1 -1
  171. package/package.json +4 -2
  172. package/src/age-model-overlay.ts +4 -2
  173. package/src/column.ts +18 -41
  174. package/src/correlation-chart/main.ts +24 -13
  175. package/src/correlation-chart/stories/correlation-chart.stories.ts +38 -17
  176. package/src/data-provider/base.ts +22 -0
  177. package/src/data-provider/core.ts +89 -0
  178. package/src/data-provider/fetch.ts +35 -10
  179. package/src/data-provider/store.ts +79 -88
  180. package/src/data-provider/unit-selection.ts +265 -159
  181. package/src/maps/column-correlation/core.ts +1 -1
  182. package/src/maps/column-correlation/state.ts +16 -1
  183. package/src/unit-details/panel.ts +44 -26
  184. package/src/unit-details/popover.ts +21 -9
  185. package/dist/esm/column-views.04636815.js +0 -15
  186. package/dist/esm/column-views.0a010643.js.map +0 -1
  187. package/dist/esm/column-views.4b259f9e.js +0 -136
  188. package/dist/esm/column-views.4b259f9e.js.map +0 -1
  189. package/dist/esm/column-views.6f96d1c3.js.map +0 -1
  190. package/dist/esm/column-views.8c296309.js.map +0 -1
  191. package/dist/esm/column-views.9d51a5ab.js.map +0 -1
  192. package/dist/esm/column-views.ad2fe46c.js.map +0 -1
  193. package/dist/esm/column-views.b9265595.js.map +0 -1
  194. package/dist/esm/column-views.c44febd0.js +0 -169
  195. package/dist/esm/column-views.c44febd0.js.map +0 -1
  196. package/dist/esm/column-views.ce3a3ac8.js.map +0 -1
  197. package/dist/esm/column-views.e075af15.js.map +0 -1
  198. package/dist/esm/column-views.e3f0cd7b.js.map +0 -1
  199. package/dist/node/column-views.0beae29d.js +0 -2
  200. package/dist/node/column-views.0beae29d.js.map +0 -1
  201. package/dist/node/column-views.46efb749.js +0 -2
  202. package/dist/node/column-views.46efb749.js.map +0 -1
  203. package/dist/node/column-views.7425d37b.js +0 -2
  204. package/dist/node/column-views.7425d37b.js.map +0 -1
  205. package/dist/node/column-views.868c04dc.js +0 -2
  206. package/dist/node/column-views.868c04dc.js.map +0 -1
  207. package/dist/node/column-views.8e846c57.js +0 -2
  208. package/dist/node/column-views.8e846c57.js.map +0 -1
  209. package/dist/node/column-views.c007152b.js +0 -2
  210. package/dist/node/column-views.c007152b.js.map +0 -1
  211. package/dist/node/column-views.d818b387.js +0 -2
  212. package/dist/node/column-views.d818b387.js.map +0 -1
  213. package/dist/node/column-views.dfe9a971.js +0 -2
  214. package/dist/node/column-views.dfe9a971.js.map +0 -1
  215. package/dist/node/column-views.e264a767.js +0 -2
  216. package/dist/node/column-views.e264a767.js.map +0 -1
  217. package/dist/node/column-views.ed2fd268.js +0 -2
  218. package/dist/node/column-views.ed2fd268.js.map +0 -1
  219. package/dist/node/column-views.fee4e65d.js +0 -2
  220. package/dist/node/column-views.fee4e65d.js.map +0 -1
@@ -1,11 +1,4 @@
1
- import {
2
- createContext,
3
- ReactNode,
4
- useContext,
5
- useEffect,
6
- useMemo,
7
- useRef,
8
- } from "react";
1
+ import { createContext, ReactNode, useContext, useMemo } from "react";
9
2
  import h from "@macrostrat/hyper";
10
3
  import {
11
4
  CompositeColumnScale,
@@ -13,84 +6,98 @@ import {
13
6
  } from "../prepare-units/composite-scale";
14
7
  import { ColumnAxisType } from "@macrostrat/column-components";
15
8
  import type { ExtUnit, PackageLayoutData } from "../prepare-units";
16
- // An isolated jotai store for Macrostrat column usage
17
- // TODO: there might be a better way to do this using the MacrostratDataProvider or similar
18
- import { createIsolation } from "jotai-scope";
19
- import { atom, PrimitiveAtom, type WritableAtom } from "jotai";
20
-
21
- const { Provider, useSetAtom, useAtomValue, useStore } = createIsolation();
22
-
23
- type ProviderProps = {
9
+ import {
10
+ allowUnitSelectionAtom,
11
+ selectedUnitIDAtom,
12
+ UnitSelectionCallbacks,
13
+ UnitSelectionCallbackManager,
14
+ } from "./unit-selection";
15
+ import { BaseUnit } from "@macrostrat/api-types";
16
+ import {
17
+ AtomMap,
18
+ columnUnitsAtom,
19
+ columnUnitsMapAtom,
20
+ scope,
21
+ ScopedProvider,
22
+ } from "./core";
23
+
24
+ export interface ColumnStateProviderProps<
25
+ T extends BaseUnit,
26
+ > extends Partial<UnitSelectionCallbacks> {
24
27
  children: ReactNode;
25
- initialValues?: Iterable<[WritableAtom<any, any, any>, any]>;
26
- };
27
-
28
- const columnUnitsAtom = atom<ExtUnit[]>();
29
-
30
- const columnUnitsMapAtom = atom<Map<number, ExtUnit> | null>((get) => {
31
- const units = get(columnUnitsAtom);
32
- if (!units) return null;
33
- const unitMap = new Map<number, ExtUnit>();
34
- units.forEach((unit) => {
35
- unitMap.set(unit.unit_id, unit);
36
- });
37
- return unitMap;
38
- });
39
-
40
- function ScopedProvider({ children, ...rest }: ProviderProps) {
41
- // Always use the same store instance in this tree
42
- let val = null;
43
- try {
44
- val = useStore();
45
- } catch {
46
- // No store found, create a new one
47
- val = null;
48
- }
49
- return h(Provider, { store: val, ...rest }, children);
28
+ units: T[];
29
+ selectedUnit: number | null;
30
+ allowUnitSelection?: boolean;
50
31
  }
51
32
 
52
- export function MacrostratColumnStateProvider({
33
+ export function MacrostratColumnStateProvider<T extends BaseUnit>({
53
34
  children,
54
35
  units,
55
- }: {
56
- children?: ReactNode;
57
- units: ExtUnit[];
58
- }) {
36
+ allowUnitSelection = false,
37
+ onUnitSelected,
38
+ selectedUnit,
39
+ }: ColumnStateProviderProps<T>) {
59
40
  /** Top-level provider for Macrostrat column data.
60
41
  * It is either provided by the Column component itself, or
61
42
  * can be hoisted higher in the tree to provide a common data context
62
43
  */
63
44
 
64
- const atomMap: [[PrimitiveAtom<ExtUnit[]>, ExtUnit[]]] = [
45
+ /* By default, unit selection is disabled. However, if any related props are passed,
46
+ we enable it.
47
+ */
48
+ const _allowSelection = useMemo(() => {
49
+ if (allowUnitSelection) {
50
+ return true;
51
+ }
52
+ return selectedUnit != null || onUnitSelected != null;
53
+ }, []);
54
+
55
+ const atomMap: AtomMap = [
65
56
  [columnUnitsAtom, units],
57
+ [allowUnitSelectionAtom, _allowSelection],
58
+ [selectedUnitIDAtom, selectedUnit],
66
59
  ];
67
60
 
61
+ let selectionHandlers: ReactNode = null;
62
+ if (_allowSelection) {
63
+ selectionHandlers = h(UnitSelectionCallbackManager, { onUnitSelected });
64
+ }
65
+
68
66
  return h(
69
67
  ScopedProvider,
70
68
  {
71
- initialValues: atomMap,
69
+ atoms: atomMap,
72
70
  },
73
- [h(AtomUpdater, { atoms: atomMap }), children],
71
+ [selectionHandlers, children],
74
72
  );
75
73
  }
76
74
 
77
- export interface MacrostratColumnDataContext {
78
- units: ExtUnit[];
75
+ export interface MacrostratColumnDataContext<T extends BaseUnit> {
76
+ units: T[];
79
77
  sections: PackageLayoutData[];
80
78
  totalHeight?: number;
81
79
  axisType?: ColumnAxisType;
80
+ allowUnitSelection?: boolean;
81
+ }
82
+
83
+ export interface ColumnDataProviderProps<T extends BaseUnit>
84
+ extends MacrostratColumnDataContext<T>, ColumnStateProviderProps<T> {
85
+ children: ReactNode;
82
86
  }
83
87
 
84
88
  const MacrostratColumnDataContext =
85
- createContext<MacrostratColumnDataContext>(null);
89
+ createContext<MacrostratColumnDataContext<any>>(null);
86
90
 
87
- export function MacrostratColumnDataProvider({
91
+ export function MacrostratColumnDataProvider<T extends BaseUnit>({
88
92
  children,
89
93
  units,
90
94
  sections,
91
95
  totalHeight,
92
96
  axisType,
93
- }: MacrostratColumnDataContext & { children: ReactNode }) {
97
+ allowUnitSelection,
98
+ onUnitSelected,
99
+ selectedUnit,
100
+ }: ColumnDataProviderProps<T>) {
94
101
  /** Internal provider for Macrostrat column data.
95
102
  * As a general rule, we want to provide data and column-axis
96
103
  * height calculations through the context, since these need to
@@ -114,11 +121,26 @@ export function MacrostratColumnDataProvider({
114
121
 
115
122
  return h(
116
123
  MacrostratColumnStateProvider,
117
- { units },
124
+ {
125
+ units,
126
+ allowUnitSelection,
127
+ onUnitSelected,
128
+ selectedUnit,
129
+ },
118
130
  h(MacrostratColumnDataContext.Provider, { value }, children),
119
131
  );
120
132
  }
121
133
 
134
+ export function UnitSelectionProvider(props: ColumnStateProviderProps<any>) {
135
+ /* A basic unit selection provider without column data context.
136
+ Mostly for use with the CorrelationChart component.
137
+ */
138
+ return h(MacrostratColumnStateProvider, {
139
+ ...props,
140
+ allowUnitSelection: true,
141
+ });
142
+ }
143
+
122
144
  export function useMacrostratColumnData() {
123
145
  const ctx = useContext(MacrostratColumnDataContext);
124
146
  if (!ctx) {
@@ -130,12 +152,12 @@ export function useMacrostratColumnData() {
130
152
  }
131
153
 
132
154
  export function useMacrostratUnits() {
133
- return useAtomValue(columnUnitsAtom);
155
+ return scope.useAtomValue(columnUnitsAtom);
134
156
  }
135
157
 
136
158
  export function useColumnUnitsMap(): Map<number, ExtUnit> | null {
137
159
  try {
138
- return useAtomValue(columnUnitsMapAtom);
160
+ return scope.useAtomValue(columnUnitsMapAtom) as Map<number, ExtUnit>;
139
161
  } catch {
140
162
  return null;
141
163
  }
@@ -148,34 +170,3 @@ export function useCompositeScale(): CompositeColumnScale {
148
170
  [ctx.sections],
149
171
  );
150
172
  }
151
-
152
- function AtomUpdater({
153
- atoms,
154
- }: {
155
- atoms: [WritableAtom<any, any, any>, any][];
156
- }) {
157
- /**
158
- * A generic updater to sync Jotai atoms with state passed as props.
159
- * Useful for scoped providers where state needs to be synced outside
160
- * of the current context.
161
- */
162
- /** TODO: this is an awkward way to keep atoms updated */
163
- // The scoped store
164
- const store = useStore();
165
-
166
- // Warn on atoms changing length
167
- const prevLengthRef = useRef(atoms.length);
168
- useEffect(() => {
169
- if (prevLengthRef.current !== atoms.length) {
170
- console.error("Error: number of atoms in ScopedAtomUpdater has changed.");
171
- prevLengthRef.current = atoms.length;
172
- }
173
- }, [atoms.length]);
174
-
175
- for (const [atom, value] of atoms) {
176
- useEffect(() => {
177
- store.set(atom, value);
178
- }, [store, value]);
179
- }
180
- return null;
181
- }