@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
package/src/column.ts CHANGED
@@ -8,8 +8,6 @@ import {
8
8
  } from "@macrostrat/ui-components";
9
9
  import classNames from "classnames";
10
10
  import {
11
- RefObject,
12
- useRef,
13
11
  HTMLAttributes,
14
12
  useCallback,
15
13
  CSSProperties,
@@ -18,8 +16,8 @@ import {
18
16
  import styles from "./column.module.sass";
19
17
  import { UnitComponent } from "./units";
20
18
  import {
21
- UnitSelectionProvider,
22
19
  UnitKeyboardNavigation,
20
+ useColumnRef,
23
21
  useUnitSelectionDispatch,
24
22
  } from "./data-provider";
25
23
 
@@ -111,14 +109,12 @@ export function Column(props: ColumnProps) {
111
109
  minPixelScale = 0.2,
112
110
  minSectionHeight = 50,
113
111
  collapseSmallUnconformities = true,
114
- allowUnitSelection,
112
+ allowUnitSelection = false,
115
113
  hybridScale,
116
114
  scale,
117
115
  axisType,
118
116
  ...rest
119
117
  } = props;
120
- const ref = useRef<HTMLElement>();
121
- // Selected item position
122
118
 
123
119
  /* Make pixelScale and targetUnitHeight mutually exclusive. PixelScale implies
124
120
  * standardization of scales in all sections */
@@ -172,46 +168,26 @@ export function Column(props: ColumnProps) {
172
168
  );
173
169
  }
174
170
 
175
- let main: any = h(
176
- ColumnInner,
177
- { columnRef: ref, ageAxisComponent, ...rest },
178
- [
171
+ return h(
172
+ MacrostratColumnDataProvider,
173
+ {
174
+ units,
175
+ sections,
176
+ totalHeight,
177
+ axisType: _axisType,
178
+ allowUnitSelection: showUnitPopover || allowUnitSelection,
179
+ onUnitSelected,
180
+ selectedUnit,
181
+ },
182
+ h(ColumnInner, { ageAxisComponent, ...rest }, [
179
183
  children,
180
184
  h.if(showUnitPopover)(UnitSelectionPopover),
181
185
  h.if(keyboardNavigation)(UnitKeyboardNavigation, { units }),
182
- ],
183
- );
184
-
185
- /* By default, unit selection is disabled. However, if any related props are passed,
186
- we enable it.
187
- */
188
- let _allowUnitSelection = allowUnitSelection ?? false;
189
- if (showUnitPopover || selectedUnit != null || onUnitSelected != null) {
190
- _allowUnitSelection = true;
191
- }
192
-
193
- if (_allowUnitSelection) {
194
- main = h(
195
- UnitSelectionProvider,
196
- {
197
- columnRef: ref,
198
- onUnitSelected,
199
- selectedUnit,
200
- units,
201
- },
202
- main,
203
- );
204
- }
205
-
206
- return h(
207
- MacrostratColumnDataProvider,
208
- { units, sections, totalHeight, axisType: _axisType },
209
- main,
186
+ ]),
210
187
  );
211
188
  }
212
189
 
213
190
  interface ColumnInnerProps extends BaseColumnProps {
214
- columnRef: RefObject<HTMLElement>;
215
191
  ageAxisComponent?: ComponentType;
216
192
  }
217
193
 
@@ -234,7 +210,6 @@ function ColumnInner(props: ColumnInnerProps) {
234
210
  columnWidth: _columnWidth = 150,
235
211
  showLabelColumn: _showLabelColumn = true,
236
212
  className,
237
- columnRef,
238
213
  clipUnits = false,
239
214
  children,
240
215
  showTimescale,
@@ -246,6 +221,8 @@ function ColumnInner(props: ColumnInnerProps) {
246
221
 
247
222
  const { axisType } = useMacrostratColumnData();
248
223
 
224
+ const columnRef = useColumnRef();
225
+
249
226
  // Coalesce unconformity label setting to a boolean
250
227
  let _timescaleUnconformityLabels = false;
251
228
  let _sectionUnconformityLabels = false;
@@ -314,7 +291,7 @@ function useMouseEventHandlers(
314
291
  const dispatch = useUnitSelectionDispatch();
315
292
  const onClick = useCallback(
316
293
  (evt) => {
317
- dispatch?.(null, null, evt as any);
294
+ dispatch?.(null, null);
318
295
  },
319
296
  [dispatch],
320
297
  );
@@ -2,12 +2,13 @@
2
2
  import {
3
3
  UnitSelectionProvider,
4
4
  UnitKeyboardNavigation,
5
- useUnitSelectionStore,
5
+ useUnitSelectionDispatch,
6
+ useColumnRef,
6
7
  } from "../data-provider";
7
- import { UnitSelectionPopover } from "../unit-details";
8
+ import { UnitDetailsFeature, UnitSelectionPopover } from "../unit-details";
8
9
  import hyper from "@macrostrat/hyper";
9
10
  import styles from "./main.module.sass";
10
- import { useMemo, useRef } from "react";
11
+ import { useMemo } from "react";
11
12
  import { useInDarkMode } from "@macrostrat/ui-components";
12
13
  import { CompositeTimescaleCore } from "../section";
13
14
  import classNames from "classnames";
@@ -49,6 +50,18 @@ export interface CorrelationChartProps extends CorrelationChartSettings {
49
50
  onUnitSelected?: (unitID: number | null, unit: BaseUnit | null) => void;
50
51
  }
51
52
 
53
+ function MainChartArea({ children }) {
54
+ const columnRef = useColumnRef();
55
+ return h("div.main-chart", { ref: columnRef }, children);
56
+ }
57
+
58
+ const unitPopoverFeatures = new Set([
59
+ UnitDetailsFeature.AdjacentUnits,
60
+ UnitDetailsFeature.OutcropType,
61
+ UnitDetailsFeature.DepthRange,
62
+ UnitDetailsFeature.ColumnName,
63
+ ]);
64
+
52
65
  export function CorrelationChart({
53
66
  data,
54
67
  columnSpacing = 0,
@@ -75,8 +88,6 @@ export function CorrelationChart({
75
88
  });
76
89
  }, [data, ...Object.values(scaleProps)]);
77
90
 
78
- const columnRef = useRef(null);
79
-
80
91
  // A flattened units array is used to support keyboard navigation
81
92
  const units = useMemo(() => {
82
93
  return data?.map((d0) => d0.units).flat() ?? [];
@@ -101,14 +112,14 @@ export function CorrelationChart({
101
112
  { className: "correlation-diagram" },
102
113
  h(
103
114
  UnitSelectionProvider,
104
- { columnRef, selectedUnit, onUnitSelected, units },
115
+ { selectedUnit, onUnitSelected, units },
105
116
  h(ChartArea, [
106
117
  h(TimescaleColumn, {
107
118
  key: "timescale",
108
119
  scaleInfo,
109
120
  unconformityLabels,
110
121
  }),
111
- h("div.main-chart", { ref: columnRef }, [
122
+ h(MainChartArea, [
112
123
  h(
113
124
  SVG,
114
125
  {
@@ -133,9 +144,11 @@ export function CorrelationChart({
133
144
  });
134
145
  }),
135
146
  ),
136
- h.if(showUnitPopover)(UnitSelectionPopover),
147
+ h.if(showUnitPopover)(UnitSelectionPopover, {
148
+ features: unitPopoverFeatures,
149
+ }),
137
150
  // Navigation only works within a column for now...
138
- h(UnitKeyboardNavigation, { units }),
151
+ h(UnitKeyboardNavigation, { columnData: data }),
139
152
  ]),
140
153
  ]),
141
154
  ),
@@ -296,15 +309,13 @@ function StratColSpan({
296
309
  }
297
310
 
298
311
  function ChartArea({ children }) {
299
- const setSelectedUnit = useUnitSelectionStore(
300
- (state) => state.setSelectedUnit,
301
- );
312
+ const setSelectedUnit = useUnitSelectionDispatch();
302
313
 
303
314
  return h(
304
315
  "div.correlation-chart-inner",
305
316
  {
306
317
  onClick() {
307
- setSelectedUnit(null);
318
+ setSelectedUnit(null, null);
308
319
  },
309
320
  },
310
321
  children,
@@ -6,8 +6,11 @@ import {
6
6
  ColumnCorrelationMap,
7
7
  ColumnCorrelationProvider,
8
8
  fetchUnits,
9
+ MacrostratDataProvider,
9
10
  MergeSectionsMode,
10
11
  useCorrelationMapStore,
12
+ useMacrostratBaseURL,
13
+ useMacrostratFetch,
11
14
  } from "../..";
12
15
  import { hyperStyled } from "@macrostrat/hyper";
13
16
 
@@ -35,30 +38,37 @@ function CorrelationStoryUI({
35
38
  ...rest
36
39
  }: any) {
37
40
  return h(
38
- ColumnCorrelationProvider,
39
- {
40
- focusedLine,
41
- columns: null,
42
- onSelectColumns(cols, line) {
43
- setFocusedLine(line);
41
+ MacrostratDataProvider,
42
+ { baseURL: "https://dev.macrostrat.org/api/v2" },
43
+ h(
44
+ ColumnCorrelationProvider,
45
+ {
46
+ focusedLine,
47
+ columns: null,
48
+ projectID,
49
+ onSelectColumns(cols, line) {
50
+ setFocusedLine(line);
51
+ },
44
52
  },
45
- },
46
- h("div.correlation-ui", [
47
- h("div.correlation-container", h(CorrelationDiagramWrapper, rest)),
48
- h("div.right-column", [
49
- h(ColumnCorrelationMap, {
50
- accessToken: mapboxToken,
51
- className: "correlation-map",
52
- //showLogo: false,
53
- }),
53
+ h("div.correlation-ui", [
54
+ h("div.correlation-container", h(CorrelationDiagramWrapper, rest)),
55
+ h("div.right-column", [
56
+ h(ColumnCorrelationMap, {
57
+ accessToken: mapboxToken,
58
+ className: "correlation-map",
59
+ //showLogo: false,
60
+ }),
61
+ ]),
54
62
  ]),
55
- ]),
63
+ ),
56
64
  );
57
65
  }
58
66
 
59
67
  function CorrelationDiagramWrapper(props: Omit<CorrelationChartProps, "data">) {
60
68
  /** This state management is a bit too complicated, but it does kinda sorta work */
61
69
 
70
+ const fetch = useMacrostratFetch();
71
+
62
72
  // Sync focused columns with map
63
73
  const focusedColumns = useCorrelationMapStore(
64
74
  (state) => state.focusedColumns,
@@ -66,7 +76,7 @@ function CorrelationDiagramWrapper(props: Omit<CorrelationChartProps, "data">) {
66
76
 
67
77
  const columnUnits = useAsyncMemo(async () => {
68
78
  const col_ids = focusedColumns.map((col) => col.properties.col_id);
69
- return await fetchUnits(col_ids);
79
+ return await fetchUnits(col_ids, fetch);
70
80
  }, [focusedColumns]);
71
81
 
72
82
  return h("div.correlation-diagram", [
@@ -161,6 +171,11 @@ export default {
161
171
  type: "number",
162
172
  },
163
173
  },
174
+ projectID: {
175
+ control: {
176
+ type: "number",
177
+ },
178
+ },
164
179
  },
165
180
  } as Meta<typeof CorrelationStoryUI>;
166
181
 
@@ -221,3 +236,9 @@ WithPowerScaleMerged.args = {
221
236
  scale: scalePow().exponent(0.3).domain([0, 2500]).range([0, 1000]),
222
237
  mergeSections: MergeSectionsMode.ALL,
223
238
  };
239
+
240
+ export const eODPCorrelationChart = Template.bind({});
241
+ eODPCorrelationChart.args = {
242
+ focusedLine: "-125,38 -120,32",
243
+ projectID: 3,
244
+ };
@@ -288,6 +288,14 @@ export function useMacrostratBaseURL(
288
288
  return ctx.getState().baseURL;
289
289
  }
290
290
 
291
+ export function useMacrostratFetch() {
292
+ const ctx = useContext(MacrostratDataProviderContext);
293
+ if (ctx == null) {
294
+ throw new Error("Missing MacrostratDataProvider");
295
+ }
296
+ return ctx.getState().fetch;
297
+ }
298
+
291
299
  type DataTypeKey =
292
300
  | "lithologies"
293
301
  | "intervals"
@@ -345,6 +353,20 @@ export function useMacrostratColumns(
345
353
  }, [colData, inProcess]);
346
354
  }
347
355
 
356
+ export function useMacrostratColumnInfo(
357
+ columnID: number,
358
+ ): ColumnGeoJSONRecord["properties"] | null {
359
+ /** Get basic info for a column, without automatically fetching it (assumes the overall set of relevant columns has already been fetched) */
360
+ const columnsMap = useMacrostratStore((s) => s.columnFootprints);
361
+ return useMemo(() => {
362
+ for (const colData of columnsMap.values()) {
363
+ const col = colData.columns.find((d) => d.properties.col_id === columnID);
364
+ if (col != null) return col.properties;
365
+ }
366
+ return null;
367
+ }, [columnsMap, columnID]);
368
+ }
369
+
348
370
  export function useMacrostratData(dataType: DataTypeKey, ...args: any[]) {
349
371
  const selector = dataTypeMapping[dataType];
350
372
  const operator = useMacrostratStore(selector);
@@ -0,0 +1,89 @@
1
+ import { atom, type WritableAtom } from "jotai";
2
+ import { createIsolation } from "jotai-scope";
3
+ import { BaseUnit } from "@macrostrat/api-types";
4
+ import { ReactNode, useEffect, useRef } from "react";
5
+ import h from "@macrostrat/hyper";
6
+
7
+ interface StateIsolation {
8
+ Provider: (props: {
9
+ store?: any;
10
+ initialValues?: AtomMap;
11
+ children: ReactNode;
12
+ }) => ReactNode;
13
+ useStore: () => any;
14
+ useAtom: any;
15
+ useAtomValue: any;
16
+ useSetAtom: any;
17
+ }
18
+
19
+ export const scope: StateIsolation = createIsolation();
20
+
21
+ export type AtomMap = [WritableAtom<any, any, any>, any][];
22
+
23
+ type ProviderProps = {
24
+ children: ReactNode;
25
+ atoms?: AtomMap;
26
+ shouldUpdateAtoms?: boolean;
27
+ };
28
+
29
+ export function ScopedProvider({
30
+ children,
31
+ atoms,
32
+ shouldUpdateAtoms = true,
33
+ }: ProviderProps) {
34
+ // Always use the same store instance in this tree
35
+ let val = null;
36
+ try {
37
+ val = scope.useStore();
38
+ // This store has already been provided
39
+ return children;
40
+ } catch {
41
+ return h(scope.Provider, { store: null, initialValues: atoms }, [
42
+ h.if(shouldUpdateAtoms)(AtomUpdater, { atoms }),
43
+ children,
44
+ ]);
45
+ }
46
+ }
47
+
48
+ function AtomUpdater({
49
+ atoms,
50
+ }: {
51
+ atoms: [WritableAtom<any, any, any>, any][];
52
+ }) {
53
+ /**
54
+ * A generic updater to sync Jotai atoms with state passed as props.
55
+ * Useful for scoped providers where state needs to be synced outside
56
+ * the current context.
57
+ */
58
+ /** TODO: this is an awkward way to keep atoms updated */
59
+ // The scoped store
60
+ const store = scope.useStore();
61
+
62
+ // Warn on atoms changing length
63
+ const prevLengthRef = useRef(atoms.length);
64
+ useEffect(() => {
65
+ if (prevLengthRef.current !== atoms.length) {
66
+ console.error("Error: number of atoms in ScopedAtomUpdater has changed.");
67
+ prevLengthRef.current = atoms.length;
68
+ }
69
+ }, [atoms.length]);
70
+
71
+ for (const [atom, value] of atoms) {
72
+ useEffect(() => {
73
+ store.set(atom, value);
74
+ }, [store, value]);
75
+ }
76
+ return null;
77
+ }
78
+
79
+ export const columnUnitsAtom = atom<BaseUnit[]>();
80
+
81
+ export const columnUnitsMapAtom = atom<Map<number, BaseUnit> | null>((get) => {
82
+ const units = get(columnUnitsAtom);
83
+ if (!units) return null;
84
+ const unitMap = new Map<number, BaseUnit>();
85
+ units.forEach((unit) => {
86
+ unitMap.set(unit.unit_id, unit);
87
+ });
88
+ return unitMap;
89
+ });
@@ -3,7 +3,6 @@ import {
3
3
  ColumnGeoJSONRecordWithID,
4
4
  MacrostratRef,
5
5
  StratName,
6
- StratUnit,
7
6
  UnitLong,
8
7
  } from "@macrostrat/api-types";
9
8
  import {
@@ -14,16 +13,15 @@ import {
14
13
  import crossFetch from "cross-fetch";
15
14
  import { feature } from "topojson-client";
16
15
  import { geoArea } from "d3-geo";
17
- import _ from "underscore";
18
16
 
19
- function defaultFetch(
20
- url: string,
21
- options: RequestInit | undefined = undefined,
22
- ) {
23
- const baseURL = "https://macrostrat.org/api/v2";
24
- return crossFetch(baseURL + url, options);
17
+ function createScopedFetch(baseURL: string) {
18
+ return function (url: string, options: RequestInit | undefined = undefined) {
19
+ return crossFetch(baseURL + url, options);
20
+ };
25
21
  }
26
22
 
23
+ const defaultFetch = createScopedFetch("https://macrostrat.org/api/v2");
24
+
27
25
  export type ColumnStatusCode = "in process" | "active" | "obsolete";
28
26
 
29
27
  export interface ColumnFetchOptions {
@@ -232,8 +230,35 @@ export async function fetchUnits(
232
230
  columns: number[],
233
231
  fetch = defaultFetch,
234
232
  ): Promise<ColumnData[]> {
235
- const promises = columns.map((col_id) => fetchColumnUnits(col_id, fetch));
236
- return await Promise.all(promises);
233
+ const params = new URLSearchParams();
234
+ params.append("response", "long");
235
+
236
+ if (columns.length == 0) {
237
+ return [];
238
+ }
239
+
240
+ const col_string = columns.map((column) => column.toString()).join(",");
241
+ params.append("col_id", col_string);
242
+
243
+ const res = await fetch("/units" + "?" + params.toString());
244
+ const data = await res.json();
245
+ if (!data.success) {
246
+ throw new Error("Failed to fetch column units");
247
+ }
248
+ const units = data.success.data;
249
+ const unitsMap = new Map<number, UnitLong[]>();
250
+ for (const unit of units) {
251
+ const colID = unit.col_id;
252
+ if (!unitsMap.has(colID)) {
253
+ unitsMap.set(colID, []);
254
+ }
255
+ unitsMap.get(colID).push(unit);
256
+ }
257
+ const result: ColumnData[] = [];
258
+ for (const colID of columns) {
259
+ result.push({ columnID: colID, units: unitsMap.get(colID) || [] });
260
+ }
261
+ return result;
237
262
  }
238
263
 
239
264
  export async function fetchColumnUnits(