@macrostrat/column-views 3.6.1 → 3.8.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.
- package/CHANGELOG.md +44 -0
- package/dist/column-views.css +118 -89
- package/dist/column.cjs +1 -2
- package/dist/column.cjs.map +1 -1
- package/dist/column.js +1 -2
- package/dist/column.js.map +1 -1
- package/dist/column.module.sass.cjs +15 -15
- package/dist/column.module.sass.js +15 -15
- package/dist/correlation-chart/main.cjs +136 -34
- package/dist/correlation-chart/main.cjs.map +1 -1
- package/dist/correlation-chart/main.d.ts +33 -2
- package/dist/correlation-chart/main.js +118 -15
- package/dist/correlation-chart/main.js.map +1 -1
- package/dist/correlation-chart/main.module.sass.cjs +23 -20
- package/dist/correlation-chart/main.module.sass.cjs.map +1 -1
- package/dist/correlation-chart/main.module.sass.js +23 -20
- package/dist/correlation-chart/main.module.sass.js.map +1 -1
- package/dist/correlation-chart/prepare-data.cjs +0 -1
- package/dist/correlation-chart/prepare-data.cjs.map +1 -1
- package/dist/correlation-chart/prepare-data.js +0 -1
- package/dist/correlation-chart/prepare-data.js.map +1 -1
- package/dist/data-provider/unit-selection.cjs +4 -1
- package/dist/data-provider/unit-selection.cjs.map +1 -1
- package/dist/data-provider/unit-selection.d.ts +1 -1
- package/dist/data-provider/unit-selection.js +4 -1
- package/dist/data-provider/unit-selection.js.map +1 -1
- package/dist/index.cjs +14 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -2
- package/dist/maps/column-correlation/core.cjs +127 -6
- package/dist/maps/column-correlation/core.cjs.map +1 -1
- package/dist/maps/column-correlation/core.js +128 -7
- package/dist/maps/column-correlation/core.js.map +1 -1
- package/dist/maps/column-correlation/state.cjs +63 -2
- package/dist/maps/column-correlation/state.cjs.map +1 -1
- package/dist/maps/column-correlation/state.d.ts +31 -1
- package/dist/maps/column-correlation/state.js +63 -2
- package/dist/maps/column-correlation/state.js.map +1 -1
- package/dist/maps/layers/columns.cjs +5 -1
- package/dist/maps/layers/columns.cjs.map +1 -1
- package/dist/maps/layers/columns.js +5 -1
- package/dist/maps/layers/columns.js.map +1 -1
- package/dist/section.cjs +8 -2
- package/dist/section.cjs.map +1 -1
- package/dist/section.d.ts +2 -0
- package/dist/section.js +8 -2
- package/dist/section.js.map +1 -1
- package/dist/unit-details/age-range.cjs +2 -1
- package/dist/unit-details/age-range.cjs.map +1 -1
- package/dist/unit-details/age-range.js +2 -1
- package/dist/unit-details/age-range.js.map +1 -1
- package/dist/unit-details/index.d.ts +1 -1
- package/dist/unit-details/panel.cjs +2 -3
- package/dist/unit-details/panel.cjs.map +1 -1
- package/dist/unit-details/panel.js +1 -2
- package/dist/unit-details/panel.js.map +1 -1
- package/dist/unit-details/panel.module.sass.cjs +18 -22
- package/dist/unit-details/panel.module.sass.cjs.map +1 -1
- package/dist/unit-details/panel.module.sass.js +18 -22
- package/dist/unit-details/panel.module.sass.js.map +1 -1
- package/dist/unit-details/strat-names.cjs +1 -2
- package/dist/unit-details/strat-names.cjs.map +1 -1
- package/dist/unit-details/strat-names.js +1 -2
- package/dist/unit-details/strat-names.js.map +1 -1
- package/dist/units/boxes.cjs +2 -1
- package/dist/units/boxes.cjs.map +1 -1
- package/dist/units/boxes.js +2 -1
- package/dist/units/boxes.js.map +1 -1
- package/package.json +7 -7
- package/src/column.module.sass +6 -0
- package/src/correlation-chart/main.module.sass +46 -2
- package/src/correlation-chart/main.ts +180 -9
- package/src/correlation-chart/prepare-data.ts +0 -1
- package/src/data-provider/unit-selection.ts +13 -2
- package/src/maps/column-correlation/column-correlation-map.stories.ts +12 -0
- package/src/maps/column-correlation/core.ts +155 -9
- package/src/maps/column-correlation/state.ts +110 -2
- package/src/maps/layers/columns.ts +7 -1
- package/src/section.ts +9 -1
- package/src/unit-details/age-range.ts +3 -1
- package/src/unit-details/index.ts +7 -1
- package/src/unit-details/panel.module.sass +0 -8
- package/src/unit-details/panel.ts +6 -6
- package/src/unit-details/strat-names.ts +1 -1
- package/src/units/boxes.ts +4 -2
- package/dist/correlation-chart/stories/utils.d.ts +0 -6
- package/dist/unit-details/identifiers.cjs +0 -56
- package/dist/unit-details/identifiers.cjs.map +0 -1
- package/dist/unit-details/identifiers.d.ts +0 -31
- package/dist/unit-details/identifiers.js +0 -54
- package/dist/unit-details/identifiers.js.map +0 -1
- package/src/correlation-chart/stories/correlation-chart.stories.ts +0 -228
- package/src/correlation-chart/stories/namibia-correlation.stories.ts +0 -151
- package/src/correlation-chart/stories/stories.module.sass +0 -18
- package/src/correlation-chart/stories/utils.ts +0 -24
- package/src/unit-details/identifiers.ts +0 -67
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import { CorrelationChartSettings } from './prepare-data';
|
|
2
|
-
import { ColumnData } from '
|
|
2
|
+
import { ColumnData } from '@macrostrat/data-provider';
|
|
3
3
|
import { BaseUnit } from '@macrostrat/api-types';
|
|
4
|
+
import { ExtUnit } from '../prepare-units/types';
|
|
5
|
+
import { TimescaleClickHandler } from '@macrostrat/timescale';
|
|
6
|
+
/** Standard props passed to a `columnHeaderComponent`. Everything a header
|
|
7
|
+
* needs is provided here, so the component can be a pure function of its props
|
|
8
|
+
* (no hooks required). Column-level hover/click are handled by the chart. */
|
|
9
|
+
export interface ColumnHeaderProps {
|
|
10
|
+
/** The column data (units + identifier) for this column */
|
|
11
|
+
column: ColumnData;
|
|
12
|
+
/** The column's ID (col_id) */
|
|
13
|
+
columnID: number;
|
|
14
|
+
/** The column's index (left-to-right) within the chart */
|
|
15
|
+
columnIndex: number;
|
|
16
|
+
/** The units within the column */
|
|
17
|
+
units: ExtUnit[];
|
|
18
|
+
/** The rendered width of the column, in pixels */
|
|
19
|
+
width: number;
|
|
20
|
+
/** The column's name, resolved from column metadata when available */
|
|
21
|
+
columnName?: string | null;
|
|
22
|
+
}
|
|
4
23
|
export interface CorrelationChartProps extends CorrelationChartSettings {
|
|
5
24
|
data: ColumnData[];
|
|
6
25
|
columnWidth?: number;
|
|
@@ -10,6 +29,18 @@ export interface CorrelationChartProps extends CorrelationChartSettings {
|
|
|
10
29
|
selectedUnit?: number | null;
|
|
11
30
|
showUnitPopover?: boolean;
|
|
12
31
|
unitComponent?: any;
|
|
32
|
+
/** Arbitrary content (e.g. column title and/or ID) rendered above each column */
|
|
33
|
+
columnHeaderComponent?: React.ComponentType<ColumnHeaderProps>;
|
|
34
|
+
/** Content rendered above the timescale axis (top-left), beside the column
|
|
35
|
+
* headers — e.g. a zoom/filter indicator. */
|
|
36
|
+
axisTopContent?: React.ReactNode;
|
|
13
37
|
onUnitSelected?: (unitID: number | null, unit: BaseUnit | null) => void;
|
|
38
|
+
/** Called when a timescale interval is clicked (e.g. to zoom the age range) */
|
|
39
|
+
onClickTimescaleInterval?: TimescaleClickHandler;
|
|
40
|
+
/** Called when the pointer enters/leaves a column (header or body). Passes
|
|
41
|
+
* the column ID, or null on leave. */
|
|
42
|
+
onColumnMouseOver?: (columnID: number | null) => void;
|
|
43
|
+
/** Called when a column header is clicked (e.g. to frame it on a map) */
|
|
44
|
+
onColumnClick?: (columnID: number) => void;
|
|
14
45
|
}
|
|
15
|
-
export declare function CorrelationChart({ data, columnSpacing, columnWidth, unconformityLabels, showUnitPopover, selectedUnit, onUnitSelected, unitComponent, ...scaleProps }: CorrelationChartProps): import('react').FunctionComponentElement<import('..').ColumnContainerProps> | null;
|
|
46
|
+
export declare function CorrelationChart({ data, columnSpacing, columnWidth, unconformityLabels, showUnitPopover, selectedUnit, onUnitSelected, unitComponent, columnHeaderComponent, axisTopContent, onClickTimescaleInterval, onColumnMouseOver, onColumnClick, ...scaleProps }: CorrelationChartProps): import('react').FunctionComponentElement<import('..').ColumnContainerProps> | null;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import h
|
|
2
|
-
import h$2 from "./main.module.sass.js";
|
|
1
|
+
import h from "./main.module.sass.js";
|
|
3
2
|
import { useMemo } from "react";
|
|
4
3
|
import { useInDarkMode } from "@macrostrat/ui-components";
|
|
5
4
|
import { CompositeTimescaleCore } from "../section.js";
|
|
@@ -10,11 +9,12 @@ import { SVG, ColumnProvider, ColumnAxisType } from "@macrostrat/column-componen
|
|
|
10
9
|
import { ColoredUnitComponent } from "../units/index.js";
|
|
11
10
|
import { UnitBoxes } from "../units/boxes.js";
|
|
12
11
|
import { ColumnContainer } from "../column.js";
|
|
12
|
+
import { useMacrostratColumnInfo } from "@macrostrat/data-provider";
|
|
13
13
|
import { UnitSelectionProvider } from "../data-provider/store.js";
|
|
14
14
|
import { UnitDetailsFeature } from "../unit-details/panel.js";
|
|
15
15
|
import { UnitSelectionPopover } from "../unit-details/popover.js";
|
|
16
16
|
import { UnitKeyboardNavigation, useUnitSelectionDispatch, useColumnRef } from "../data-provider/unit-selection.js";
|
|
17
|
-
const
|
|
17
|
+
const chartPaddingH = 4;
|
|
18
18
|
function MainChartArea({ children }) {
|
|
19
19
|
const columnRef = useColumnRef();
|
|
20
20
|
return h("div.main-chart", { ref: columnRef }, children);
|
|
@@ -34,6 +34,11 @@ function CorrelationChart({
|
|
|
34
34
|
selectedUnit,
|
|
35
35
|
onUnitSelected,
|
|
36
36
|
unitComponent,
|
|
37
|
+
columnHeaderComponent,
|
|
38
|
+
axisTopContent,
|
|
39
|
+
onClickTimescaleInterval,
|
|
40
|
+
onColumnMouseOver,
|
|
41
|
+
onColumnClick,
|
|
37
42
|
...scaleProps
|
|
38
43
|
}) {
|
|
39
44
|
const defaultScaleProps = {
|
|
@@ -69,9 +74,9 @@ function CorrelationChart({
|
|
|
69
74
|
{ selectedUnit, onUnitSelected, units },
|
|
70
75
|
h(ChartArea, [
|
|
71
76
|
h(TimescaleColumn, {
|
|
72
|
-
key: "timescale",
|
|
73
77
|
scaleInfo,
|
|
74
|
-
unconformityLabels
|
|
78
|
+
unconformityLabels,
|
|
79
|
+
onClickInterval: onClickTimescaleInterval
|
|
75
80
|
}),
|
|
76
81
|
h(MainChartArea, [
|
|
77
82
|
h(
|
|
@@ -80,7 +85,7 @@ function CorrelationChart({
|
|
|
80
85
|
className,
|
|
81
86
|
innerWidth: mainWidth,
|
|
82
87
|
height: scaleInfo.totalHeight,
|
|
83
|
-
paddingH:
|
|
88
|
+
paddingH: chartPaddingH
|
|
84
89
|
},
|
|
85
90
|
packages.map((pkg, i) => {
|
|
86
91
|
const { offset, domain, pixelScale, scale, key } = scaleInfo.packages[i];
|
|
@@ -93,7 +98,8 @@ function CorrelationChart({
|
|
|
93
98
|
domain,
|
|
94
99
|
pixelScale,
|
|
95
100
|
scale,
|
|
96
|
-
unitComponent
|
|
101
|
+
unitComponent,
|
|
102
|
+
onColumnMouseOver
|
|
97
103
|
});
|
|
98
104
|
})
|
|
99
105
|
),
|
|
@@ -102,7 +108,18 @@ function CorrelationChart({
|
|
|
102
108
|
}),
|
|
103
109
|
// Navigation only works within a column for now...
|
|
104
110
|
h(UnitKeyboardNavigation, { columnData: data })
|
|
105
|
-
])
|
|
111
|
+
]),
|
|
112
|
+
// Rendered last so the sticky header paints above the unit boxes
|
|
113
|
+
// (positioned siblings paint in document order at the same z-index)
|
|
114
|
+
h(ColumnHeaderRow, {
|
|
115
|
+
data,
|
|
116
|
+
columnWidth,
|
|
117
|
+
columnSpacing,
|
|
118
|
+
columnHeaderComponent,
|
|
119
|
+
axisTopContent,
|
|
120
|
+
onColumnMouseOver,
|
|
121
|
+
onColumnClick
|
|
122
|
+
})
|
|
106
123
|
])
|
|
107
124
|
)
|
|
108
125
|
);
|
|
@@ -115,7 +132,8 @@ function Package({
|
|
|
115
132
|
offset,
|
|
116
133
|
domain,
|
|
117
134
|
pixelScale,
|
|
118
|
-
scale
|
|
135
|
+
scale,
|
|
136
|
+
onColumnMouseOver
|
|
119
137
|
}) {
|
|
120
138
|
return h("g.package", { transform: `translate(0 ${offset})` }, [
|
|
121
139
|
// Disable the SVG overlay for now
|
|
@@ -124,13 +142,15 @@ function Package({
|
|
|
124
142
|
columnData.map((data, i) => {
|
|
125
143
|
return h(Column, {
|
|
126
144
|
units: data.units,
|
|
145
|
+
columnID: data.columnID,
|
|
127
146
|
unitComponent,
|
|
128
147
|
width: columnWidth,
|
|
129
148
|
key: i,
|
|
130
149
|
domain,
|
|
131
150
|
pixelScale,
|
|
132
151
|
scale,
|
|
133
|
-
offsetLeft: i * (columnWidth + columnSpacing)
|
|
152
|
+
offsetLeft: i * (columnWidth + columnSpacing),
|
|
153
|
+
onColumnMouseOver
|
|
134
154
|
});
|
|
135
155
|
})
|
|
136
156
|
])
|
|
@@ -139,21 +159,28 @@ function Package({
|
|
|
139
159
|
function Column(props) {
|
|
140
160
|
const {
|
|
141
161
|
units,
|
|
162
|
+
columnID,
|
|
142
163
|
width = 150,
|
|
143
164
|
offsetLeft,
|
|
144
165
|
domain,
|
|
145
166
|
pixelScale,
|
|
146
167
|
scale,
|
|
147
|
-
unitComponent = ColoredUnitComponent
|
|
168
|
+
unitComponent = ColoredUnitComponent,
|
|
169
|
+
onColumnMouseOver
|
|
148
170
|
} = props;
|
|
149
171
|
const columnWidth = width;
|
|
150
172
|
if (units.length == 0) {
|
|
151
173
|
return null;
|
|
152
174
|
}
|
|
175
|
+
const hoverHandlers = onColumnMouseOver != null && columnID != null ? {
|
|
176
|
+
onMouseEnter: () => onColumnMouseOver(columnID),
|
|
177
|
+
onMouseLeave: () => onColumnMouseOver(null)
|
|
178
|
+
} : {};
|
|
153
179
|
return h(
|
|
154
180
|
"g.section",
|
|
155
181
|
{
|
|
156
|
-
transform: `translate(${offsetLeft} 0)
|
|
182
|
+
transform: `translate(${offsetLeft} 0)`,
|
|
183
|
+
...hoverHandlers
|
|
157
184
|
},
|
|
158
185
|
h(
|
|
159
186
|
ColumnProvider,
|
|
@@ -169,7 +196,6 @@ function Column(props) {
|
|
|
169
196
|
h(UnitBoxes, {
|
|
170
197
|
unitComponent,
|
|
171
198
|
unitComponentProps: {
|
|
172
|
-
nColumns: 2,
|
|
173
199
|
width: columnWidth,
|
|
174
200
|
showLabel: true
|
|
175
201
|
}
|
|
@@ -189,11 +215,88 @@ function ChartArea({ children }) {
|
|
|
189
215
|
children
|
|
190
216
|
);
|
|
191
217
|
}
|
|
218
|
+
function ColumnHeaderRow({
|
|
219
|
+
data,
|
|
220
|
+
columnWidth,
|
|
221
|
+
columnSpacing,
|
|
222
|
+
columnHeaderComponent,
|
|
223
|
+
axisTopContent,
|
|
224
|
+
onColumnMouseOver,
|
|
225
|
+
onColumnClick
|
|
226
|
+
}) {
|
|
227
|
+
const Component = columnHeaderComponent;
|
|
228
|
+
if (Component == null && axisTopContent == null) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
return h([
|
|
232
|
+
h("div.column-header-spacer", axisTopContent),
|
|
233
|
+
h.if(Component != null)(
|
|
234
|
+
"div.column-header-row",
|
|
235
|
+
{
|
|
236
|
+
style: {
|
|
237
|
+
paddingLeft: chartPaddingH,
|
|
238
|
+
paddingRight: chartPaddingH,
|
|
239
|
+
gap: columnSpacing
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
data.map((column, i) => {
|
|
243
|
+
return h(ColumnHeaderCell, {
|
|
244
|
+
key: column.columnID ?? i,
|
|
245
|
+
column,
|
|
246
|
+
columnIndex: i,
|
|
247
|
+
columnWidth,
|
|
248
|
+
Component,
|
|
249
|
+
onColumnMouseOver,
|
|
250
|
+
onColumnClick
|
|
251
|
+
});
|
|
252
|
+
})
|
|
253
|
+
)
|
|
254
|
+
]);
|
|
255
|
+
}
|
|
256
|
+
function ColumnHeaderCell({
|
|
257
|
+
column,
|
|
258
|
+
columnIndex,
|
|
259
|
+
columnWidth,
|
|
260
|
+
Component,
|
|
261
|
+
onColumnMouseOver,
|
|
262
|
+
onColumnClick
|
|
263
|
+
}) {
|
|
264
|
+
const columnID = column.columnID;
|
|
265
|
+
const info = useMacrostratColumnInfo(columnID);
|
|
266
|
+
return h(
|
|
267
|
+
"div.column-header-cell",
|
|
268
|
+
{
|
|
269
|
+
style: {
|
|
270
|
+
width: columnWidth,
|
|
271
|
+
minWidth: columnWidth,
|
|
272
|
+
maxWidth: columnWidth
|
|
273
|
+
},
|
|
274
|
+
onMouseEnter: () => onColumnMouseOver?.(columnID),
|
|
275
|
+
onMouseLeave: () => onColumnMouseOver?.(null),
|
|
276
|
+
onClick: onColumnClick ? (e) => {
|
|
277
|
+
e.stopPropagation();
|
|
278
|
+
onColumnClick(columnID);
|
|
279
|
+
} : void 0
|
|
280
|
+
},
|
|
281
|
+
h(Component, {
|
|
282
|
+
column,
|
|
283
|
+
columnID,
|
|
284
|
+
columnIndex,
|
|
285
|
+
units: column.units,
|
|
286
|
+
width: columnWidth,
|
|
287
|
+
columnName: info?.col_name ?? null
|
|
288
|
+
})
|
|
289
|
+
);
|
|
290
|
+
}
|
|
192
291
|
function TimescaleColumn(props) {
|
|
193
|
-
const { scaleInfo, unconformityLabels = true } = props;
|
|
292
|
+
const { scaleInfo, unconformityLabels = true, onClickInterval } = props;
|
|
194
293
|
return h("div.column-container.age-axis-container", [
|
|
195
294
|
h(CompositeAgeAxisCore, { ...scaleInfo }),
|
|
196
|
-
h(CompositeTimescaleCore, {
|
|
295
|
+
h(CompositeTimescaleCore, {
|
|
296
|
+
...scaleInfo,
|
|
297
|
+
unconformityLabels,
|
|
298
|
+
onClickInterval
|
|
299
|
+
})
|
|
197
300
|
]);
|
|
198
301
|
}
|
|
199
302
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sources":["../../src/correlation-chart/main.ts"],"sourcesContent":["/** Correlation chart */\nimport {\n UnitSelectionProvider,\n UnitKeyboardNavigation,\n useUnitSelectionDispatch,\n useColumnRef,\n} from \"../data-provider\";\nimport { UnitDetailsFeature, UnitSelectionPopover } from \"../unit-details\";\nimport hyper from \"@macrostrat/hyper\";\nimport styles from \"./main.module.sass\";\nimport { useMemo } from \"react\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { CompositeTimescaleCore } from \"../section\";\nimport classNames from \"classnames\";\nimport {\n findLaterallyExtensiveUnits,\n splitStratIntoBoxes,\n UnitGroupBox,\n CorrelationChartSettings,\n buildCorrelationChartData,\n} from \"./prepare-data\";\nimport {\n CompositeAgeAxisCore,\n CompositeStratigraphicScaleInfo,\n} from \"../age-axis\";\nimport {\n ColumnAxisType,\n ColumnProvider,\n SVG,\n} from \"@macrostrat/column-components\";\nimport { ColoredUnitComponent } from \"../units\";\nimport { UnitBoxes } from \"../units/boxes\";\nimport { ColumnContainer } from \"../column\";\nimport { ColumnData } from \"../data-provider\";\nimport { BaseUnit } from \"@macrostrat/api-types\";\nimport { ScaleContinuousNumeric } from \"d3-scale\";\nimport { ExtUnit } from \"../prepare-units/types\";\n\nconst h = hyper.styled(styles);\n\nexport interface CorrelationChartProps extends CorrelationChartSettings {\n data: ColumnData[];\n columnWidth?: number;\n columnSpacing?: number;\n targetUnitHeight?: number;\n unconformityLabels?: boolean;\n selectedUnit?: number | null;\n showUnitPopover?: boolean;\n unitComponent?: any;\n onUnitSelected?: (unitID: number | null, unit: BaseUnit | null) => void;\n}\n\nfunction MainChartArea({ children }) {\n const columnRef = useColumnRef();\n return h(\"div.main-chart\", { ref: columnRef }, children);\n}\n\nconst unitPopoverFeatures = new Set([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.DepthRange,\n UnitDetailsFeature.ColumnName,\n]);\n\nexport function CorrelationChart({\n data,\n columnSpacing = 0,\n columnWidth = 130,\n unconformityLabels = true,\n showUnitPopover = true,\n selectedUnit,\n onUnitSelected,\n unitComponent,\n ...scaleProps\n}: CorrelationChartProps) {\n const defaultScaleProps = {\n targetUnitHeight: 10,\n unconformityHeight: 60,\n minSectionHeight: 60,\n collapseSmallUnconformities: true,\n };\n\n const chartData = useMemo(() => {\n if (!data) return null;\n return buildCorrelationChartData(data, {\n ...defaultScaleProps,\n ...scaleProps,\n });\n }, [data, ...Object.values(scaleProps)]);\n\n // A flattened units array is used to support keyboard navigation\n const units = useMemo(() => {\n return data?.map((d0) => d0.units).flat() ?? [];\n }, [data]);\n\n const inDarkMode = useInDarkMode();\n\n const className = classNames({\n \"dark-mode\": inDarkMode,\n });\n\n if (chartData == null) {\n return null;\n }\n\n const { packages, scaleInfo, nColumns } = chartData;\n\n const mainWidth = (columnWidth + columnSpacing) * nColumns;\n\n return h(\n ColumnContainer,\n { className: \"correlation-diagram\" },\n h(\n UnitSelectionProvider,\n { selectedUnit, onUnitSelected, units },\n h(ChartArea, [\n h(TimescaleColumn, {\n key: \"timescale\",\n scaleInfo,\n unconformityLabels,\n }),\n h(MainChartArea, [\n h(\n SVG,\n {\n className,\n innerWidth: mainWidth,\n height: scaleInfo.totalHeight,\n paddingH: 4,\n },\n packages.map((pkg, i) => {\n const { offset, domain, pixelScale, scale, key } =\n scaleInfo.packages[i];\n return h(Package, {\n columnData: pkg.columnData,\n key,\n columnWidth,\n columnSpacing,\n offset,\n domain,\n pixelScale,\n scale,\n unitComponent,\n });\n }),\n ),\n h.if(showUnitPopover)(UnitSelectionPopover, {\n features: unitPopoverFeatures,\n }),\n // Navigation only works within a column for now...\n h(UnitKeyboardNavigation, { columnData: data }),\n ]),\n ]),\n ),\n );\n}\n\nfunction Package({\n columnData,\n columnSpacing,\n columnWidth,\n unitComponent,\n offset,\n domain,\n pixelScale,\n scale,\n}) {\n return h(\"g.package\", { transform: `translate(0 ${offset})` }, [\n // Disable the SVG overlay for now\n //h(PackageSVGOverlay, { columnData, columnSpacing }),\n h(\"g.column-units\", [\n columnData.map((data, i) => {\n return h(Column, {\n units: data.units,\n unitComponent,\n width: columnWidth,\n key: i,\n domain,\n pixelScale,\n scale,\n offsetLeft: i * (columnWidth + columnSpacing),\n });\n }),\n ]),\n ]);\n}\n\ninterface ColumnProps {\n units: ExtUnit[];\n unitComponent?: React.FunctionComponent<any>;\n unitComponentProps?: any;\n showLabels?: boolean;\n width?: number;\n columnWidth?: number;\n columnSpacing?: number;\n targetUnitHeight?: number;\n offsetLeft?: number;\n domain: [number, number];\n pixelScale: number;\n scale?: ScaleContinuousNumeric<number, number>;\n}\n\nfunction Column(props: ColumnProps) {\n const {\n units,\n width = 150,\n offsetLeft,\n domain,\n pixelScale,\n scale,\n unitComponent = ColoredUnitComponent,\n } = props;\n\n const columnWidth = width;\n\n if (units.length == 0) {\n return null;\n }\n\n return h(\n \"g.section\",\n {\n transform: `translate(${offsetLeft} 0)`,\n },\n h(\n ColumnProvider,\n {\n // Need to tighten up types here...\n divisions: units as any[],\n range: domain,\n scale,\n pixelsPerMeter: pixelScale, // Actually pixels per myr\n axisType: ColumnAxisType.AGE,\n },\n h(UnitBoxes, {\n unitComponent,\n unitComponentProps: {\n nColumns: 2,\n width: columnWidth,\n showLabel: true,\n },\n }),\n ),\n );\n}\n\nfunction PackageSVGOverlay({ data, columnWidth = 100, columnSpacing = 0 }) {\n const { b_age, t_age, bestPixelScale, columnData } = data;\n\n const width = (columnWidth + columnSpacing) * columnData.length;\n const height = Math.ceil((b_age - t_age) * bestPixelScale) + 2;\n\n const extensiveUnits = findLaterallyExtensiveUnits(data);\n\n const scale = (val: number) => {\n return (val - t_age) * bestPixelScale;\n };\n\n return h(\n \"div.package-overlay\",\n { style: { width, height } },\n extensiveUnits.map((d) => {\n return h(LaterallyExtensiveUnit, {\n data: d,\n scale,\n pixelScale: bestPixelScale,\n columnSpacing,\n });\n }),\n );\n}\n\nfunction LaterallyExtensiveUnit({ data, scale, pixelScale, columnSpacing }) {\n const { b_age, t_age, strat_name_long, units } = data;\n // Build boxes by column groups\n const boxes: UnitGroupBox[] = splitStratIntoBoxes(data);\n\n return h(\n \"div.laterally-extensive-unit\",\n boxes.map((d, i) => {\n return h(StratColSpan, {\n scale,\n data: d,\n pixelScale,\n key: i,\n columnSpacing,\n });\n }),\n );\n}\n\nfunction StratColSpan({\n data,\n scale,\n columnWidth = 100,\n columnSpacing = 0,\n pixelScale = 1,\n}) {\n const { startCol, endCol, strat_name_long, t_age, b_age } = data;\n const top = scale(t_age);\n const left = startCol * (columnWidth + columnSpacing);\n const width = (endCol - startCol + 1) * (columnWidth + columnSpacing);\n const height = (b_age - t_age) * pixelScale;\n return h(\n \"div.strat-col-span\",\n { style: { top, height, width, left } },\n strat_name_long,\n );\n}\n\nfunction ChartArea({ children }) {\n const setSelectedUnit = useUnitSelectionDispatch();\n\n return h(\n \"div.correlation-chart-inner\",\n {\n onClick() {\n setSelectedUnit(null, null);\n },\n },\n children,\n );\n}\n\ninterface TimescaleColumnProps {\n scaleInfo: CompositeStratigraphicScaleInfo;\n showLabels?: boolean;\n unconformityLabels?: boolean;\n}\n\nfunction TimescaleColumn(props: TimescaleColumnProps) {\n const { scaleInfo, unconformityLabels = true } = props;\n return h(\"div.column-container.age-axis-container\", [\n h(CompositeAgeAxisCore, { ...scaleInfo }),\n h(CompositeTimescaleCore, { ...scaleInfo, unconformityLabels }),\n ]);\n}\n"],"names":["hyper","styles"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sources":["../../src/correlation-chart/main.ts"],"sourcesContent":["/** Correlation chart */\nimport {\n UnitSelectionProvider,\n UnitKeyboardNavigation,\n useUnitSelectionDispatch,\n useColumnRef,\n} from \"../data-provider\";\nimport { UnitDetailsFeature, UnitSelectionPopover } from \"../unit-details\";\nimport h from \"./main.module.sass\";\nimport { useMemo } from \"react\";\nimport { useInDarkMode } from \"@macrostrat/ui-components\";\nimport { CompositeTimescaleCore } from \"../section\";\nimport classNames from \"classnames\";\nimport {\n findLaterallyExtensiveUnits,\n splitStratIntoBoxes,\n UnitGroupBox,\n CorrelationChartSettings,\n buildCorrelationChartData,\n} from \"./prepare-data\";\nimport {\n CompositeAgeAxisCore,\n CompositeStratigraphicScaleInfo,\n} from \"../age-axis\";\nimport {\n ColumnAxisType,\n ColumnProvider,\n SVG,\n} from \"@macrostrat/column-components\";\nimport { ColoredUnitComponent } from \"../units\";\nimport { UnitBoxes } from \"../units/boxes\";\nimport { ColumnContainer } from \"../column\";\nimport type { ColumnData } from \"@macrostrat/data-provider\";\nimport { BaseUnit } from \"@macrostrat/api-types\";\nimport { ScaleContinuousNumeric } from \"d3-scale\";\nimport { ExtUnit } from \"../prepare-units/types\";\nimport type { TimescaleClickHandler } from \"@macrostrat/timescale\";\nimport { useMacrostratColumnInfo } from \"@macrostrat/data-provider\";\n\n/** Standard props passed to a `columnHeaderComponent`. Everything a header\n * needs is provided here, so the component can be a pure function of its props\n * (no hooks required). Column-level hover/click are handled by the chart. */\nexport interface ColumnHeaderProps {\n /** The column data (units + identifier) for this column */\n column: ColumnData;\n /** The column's ID (col_id) */\n columnID: number;\n /** The column's index (left-to-right) within the chart */\n columnIndex: number;\n /** The units within the column */\n units: ExtUnit[];\n /** The rendered width of the column, in pixels */\n width: number;\n /** The column's name, resolved from column metadata when available */\n columnName?: string | null;\n}\n\nexport interface CorrelationChartProps extends CorrelationChartSettings {\n data: ColumnData[];\n columnWidth?: number;\n columnSpacing?: number;\n targetUnitHeight?: number;\n unconformityLabels?: boolean;\n selectedUnit?: number | null;\n showUnitPopover?: boolean;\n unitComponent?: any;\n /** Arbitrary content (e.g. column title and/or ID) rendered above each column */\n columnHeaderComponent?: React.ComponentType<ColumnHeaderProps>;\n /** Content rendered above the timescale axis (top-left), beside the column\n * headers — e.g. a zoom/filter indicator. */\n axisTopContent?: React.ReactNode;\n onUnitSelected?: (unitID: number | null, unit: BaseUnit | null) => void;\n /** Called when a timescale interval is clicked (e.g. to zoom the age range) */\n onClickTimescaleInterval?: TimescaleClickHandler;\n /** Called when the pointer enters/leaves a column (header or body). Passes\n * the column ID, or null on leave. */\n onColumnMouseOver?: (columnID: number | null) => void;\n /** Called when a column header is clicked (e.g. to frame it on a map) */\n onColumnClick?: (columnID: number) => void;\n}\n\n/** Horizontal padding of the main chart SVG. Column headers are aligned to\n * this so that they line up with the columns beneath them. */\nconst chartPaddingH = 4;\n\nfunction MainChartArea({ children }) {\n const columnRef = useColumnRef();\n return h(\"div.main-chart\", { ref: columnRef }, children);\n}\n\nconst unitPopoverFeatures = new Set([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.DepthRange,\n UnitDetailsFeature.ColumnName,\n]);\n\nexport function CorrelationChart({\n data,\n columnSpacing = 0,\n columnWidth = 130,\n unconformityLabels = true,\n showUnitPopover = true,\n selectedUnit,\n onUnitSelected,\n unitComponent,\n columnHeaderComponent,\n axisTopContent,\n onClickTimescaleInterval,\n onColumnMouseOver,\n onColumnClick,\n ...scaleProps\n}: CorrelationChartProps) {\n const defaultScaleProps = {\n targetUnitHeight: 10,\n unconformityHeight: 60,\n minSectionHeight: 60,\n collapseSmallUnconformities: true,\n };\n\n const chartData = useMemo(() => {\n if (!data) return null;\n return buildCorrelationChartData(data, {\n ...defaultScaleProps,\n ...scaleProps,\n });\n }, [data, ...Object.values(scaleProps)]);\n\n // A flattened units array is used to support keyboard navigation\n const units = useMemo(() => {\n return data?.map((d0) => d0.units).flat() ?? [];\n }, [data]);\n\n const inDarkMode = useInDarkMode();\n\n const className = classNames({\n \"dark-mode\": inDarkMode,\n });\n\n if (chartData == null) {\n return null;\n }\n\n const { packages, scaleInfo, nColumns } = chartData;\n\n const mainWidth = (columnWidth + columnSpacing) * nColumns;\n\n return h(\n ColumnContainer,\n { className: \"correlation-diagram\" },\n h(\n UnitSelectionProvider,\n { selectedUnit, onUnitSelected, units },\n h(ChartArea, [\n h(TimescaleColumn, {\n scaleInfo,\n unconformityLabels,\n onClickInterval: onClickTimescaleInterval,\n }),\n h(MainChartArea, [\n h(\n SVG,\n {\n className,\n innerWidth: mainWidth,\n height: scaleInfo.totalHeight,\n paddingH: chartPaddingH,\n },\n packages.map((pkg, i) => {\n const { offset, domain, pixelScale, scale, key } =\n scaleInfo.packages[i];\n return h(Package, {\n columnData: pkg.columnData,\n key,\n columnWidth,\n columnSpacing,\n offset,\n domain,\n pixelScale,\n scale,\n unitComponent,\n onColumnMouseOver,\n });\n }),\n ),\n h.if(showUnitPopover)(UnitSelectionPopover, {\n features: unitPopoverFeatures,\n }),\n // Navigation only works within a column for now...\n h(UnitKeyboardNavigation, { columnData: data }),\n ]),\n // Rendered last so the sticky header paints above the unit boxes\n // (positioned siblings paint in document order at the same z-index)\n h(ColumnHeaderRow, {\n data,\n columnWidth,\n columnSpacing,\n columnHeaderComponent,\n axisTopContent,\n onColumnMouseOver,\n onColumnClick,\n }),\n ]),\n ),\n );\n}\n\nfunction Package({\n columnData,\n columnSpacing,\n columnWidth,\n unitComponent,\n offset,\n domain,\n pixelScale,\n scale,\n onColumnMouseOver,\n}) {\n return h(\"g.package\", { transform: `translate(0 ${offset})` }, [\n // Disable the SVG overlay for now\n //h(PackageSVGOverlay, { columnData, columnSpacing }),\n h(\"g.column-units\", [\n columnData.map((data, i) => {\n return h(Column, {\n units: data.units,\n columnID: data.columnID,\n unitComponent,\n width: columnWidth,\n key: i,\n domain,\n pixelScale,\n scale,\n offsetLeft: i * (columnWidth + columnSpacing),\n onColumnMouseOver,\n });\n }),\n ]),\n ]);\n}\n\ninterface ColumnProps {\n units: ExtUnit[];\n columnID?: number;\n unitComponent?: React.FunctionComponent<any>;\n unitComponentProps?: any;\n showLabels?: boolean;\n width?: number;\n columnWidth?: number;\n columnSpacing?: number;\n targetUnitHeight?: number;\n offsetLeft?: number;\n domain: [number, number];\n pixelScale: number;\n scale?: ScaleContinuousNumeric<number, number>;\n onColumnMouseOver?: (columnID: number | null) => void;\n}\n\nfunction Column(props: ColumnProps) {\n const {\n units,\n columnID,\n width = 150,\n offsetLeft,\n domain,\n pixelScale,\n scale,\n unitComponent = ColoredUnitComponent,\n onColumnMouseOver,\n } = props;\n\n const columnWidth = width;\n\n if (units.length == 0) {\n return null;\n }\n\n const hoverHandlers =\n onColumnMouseOver != null && columnID != null\n ? {\n onMouseEnter: () => onColumnMouseOver(columnID),\n onMouseLeave: () => onColumnMouseOver(null),\n }\n : {};\n\n return h(\n \"g.section\",\n {\n transform: `translate(${offsetLeft} 0)`,\n ...hoverHandlers,\n },\n h(\n ColumnProvider,\n {\n // Need to tighten up types here...\n divisions: units as any[],\n range: domain,\n scale,\n pixelsPerMeter: pixelScale, // Actually pixels per myr\n axisType: ColumnAxisType.AGE,\n },\n h(UnitBoxes, {\n unitComponent,\n unitComponentProps: {\n width: columnWidth,\n showLabel: true,\n },\n }),\n ),\n );\n}\n\nfunction PackageSVGOverlay({ data, columnWidth = 100, columnSpacing = 0 }) {\n const { b_age, t_age, bestPixelScale, columnData } = data;\n\n const width = (columnWidth + columnSpacing) * columnData.length;\n const height = Math.ceil((b_age - t_age) * bestPixelScale) + 2;\n\n const extensiveUnits = findLaterallyExtensiveUnits(data);\n\n const scale = (val: number) => {\n return (val - t_age) * bestPixelScale;\n };\n\n return h(\n \"div.package-overlay\",\n { style: { width, height } },\n extensiveUnits.map((d) => {\n return h(LaterallyExtensiveUnit, {\n data: d,\n scale,\n pixelScale: bestPixelScale,\n columnSpacing,\n });\n }),\n );\n}\n\nfunction LaterallyExtensiveUnit({ data, scale, pixelScale, columnSpacing }) {\n const { b_age, t_age, strat_name_long, units } = data;\n // Build boxes by column groups\n const boxes: UnitGroupBox[] = splitStratIntoBoxes(data);\n\n return h(\n \"div.laterally-extensive-unit\",\n boxes.map((d, i) => {\n return h(StratColSpan, {\n scale,\n data: d,\n pixelScale,\n key: i,\n columnSpacing,\n });\n }),\n );\n}\n\nfunction StratColSpan({\n data,\n scale,\n columnWidth = 100,\n columnSpacing = 0,\n pixelScale = 1,\n}) {\n const { startCol, endCol, strat_name_long, t_age, b_age } = data;\n const top = scale(t_age);\n const left = startCol * (columnWidth + columnSpacing);\n const width = (endCol - startCol + 1) * (columnWidth + columnSpacing);\n const height = (b_age - t_age) * pixelScale;\n return h(\n \"div.strat-col-span\",\n { style: { top, height, width, left } },\n strat_name_long,\n );\n}\n\nfunction ChartArea({ children }) {\n const setSelectedUnit = useUnitSelectionDispatch();\n\n return h(\n \"div.correlation-chart-inner\",\n {\n onClick() {\n setSelectedUnit(null, null);\n },\n },\n children,\n );\n}\n\ninterface ColumnHeaderRowProps {\n data: ColumnData[];\n columnWidth: number;\n columnSpacing: number;\n columnHeaderComponent?: React.ComponentType<ColumnHeaderProps>;\n axisTopContent?: React.ReactNode;\n onColumnMouseOver?: (columnID: number | null) => void;\n onColumnClick?: (columnID: number) => void;\n}\n\nfunction ColumnHeaderRow({\n data,\n columnWidth,\n columnSpacing,\n columnHeaderComponent,\n axisTopContent,\n onColumnMouseOver,\n onColumnClick,\n}: ColumnHeaderRowProps) {\n /** The top grid row: arbitrary content above the timescale axis (top-left)\n * and, when a header component is provided, per-column headers aligned with\n * the columns. Collapses to nothing when neither is present. */\n const Component = columnHeaderComponent;\n if (Component == null && axisTopContent == null) {\n return null;\n }\n\n return h([\n h(\"div.column-header-spacer\", axisTopContent),\n h.if(Component != null)(\n \"div.column-header-row\",\n {\n style: {\n paddingLeft: chartPaddingH,\n paddingRight: chartPaddingH,\n gap: columnSpacing,\n },\n },\n data.map((column, i) => {\n return h(ColumnHeaderCell, {\n key: column.columnID ?? i,\n column,\n columnIndex: i,\n columnWidth,\n Component: Component!,\n onColumnMouseOver,\n onColumnClick,\n });\n }),\n ),\n ]);\n}\n\nfunction ColumnHeaderCell({\n column,\n columnIndex,\n columnWidth,\n Component,\n onColumnMouseOver,\n onColumnClick,\n}: {\n column: ColumnData;\n columnIndex: number;\n columnWidth: number;\n Component: React.ComponentType<ColumnHeaderProps>;\n onColumnMouseOver?: (columnID: number | null) => void;\n onColumnClick?: (columnID: number) => void;\n}) {\n /** Resolves the column name and wires column-level hover/click so the header\n * component itself can stay a pure function of props. */\n const columnID = column.columnID;\n const info = useMacrostratColumnInfo(columnID);\n\n return h(\n \"div.column-header-cell\",\n {\n style: {\n width: columnWidth,\n minWidth: columnWidth,\n maxWidth: columnWidth,\n },\n onMouseEnter: () => onColumnMouseOver?.(columnID),\n onMouseLeave: () => onColumnMouseOver?.(null),\n onClick: onColumnClick\n ? (e: React.MouseEvent) => {\n e.stopPropagation();\n onColumnClick(columnID);\n }\n : undefined,\n },\n h(Component, {\n column,\n columnID,\n columnIndex,\n units: column.units as ExtUnit[],\n width: columnWidth,\n columnName: info?.col_name ?? null,\n }),\n );\n}\n\ninterface TimescaleColumnProps {\n scaleInfo: CompositeStratigraphicScaleInfo;\n showLabels?: boolean;\n unconformityLabels?: boolean;\n onClickInterval?: TimescaleClickHandler;\n}\n\nfunction TimescaleColumn(props: TimescaleColumnProps) {\n const { scaleInfo, unconformityLabels = true, onClickInterval } = props;\n return h(\"div.column-container.age-axis-container\", [\n h(CompositeAgeAxisCore, { ...scaleInfo }),\n h(CompositeTimescaleCore, {\n ...scaleInfo,\n unconformityLabels,\n onClickInterval,\n }),\n ]);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAmFA,MAAM,gBAAgB;AAEtB,SAAS,cAAc,EAAE,YAAY;AACnC,QAAM,YAAY,aAAA;AAClB,SAAO,EAAE,kBAAkB,EAAE,KAAK,UAAA,GAAa,QAAQ;AACzD;AAEA,MAAM,0CAA0B,IAAI;AAAA,EAClC,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,mBAAmB;AACrB,CAAC;AAEM,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA0B;AACxB,QAAM,oBAAoB;AAAA,IACxB,kBAAkB;AAAA,IAClB,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,6BAA6B;AAAA,EAAA;AAG/B,QAAM,YAAY,QAAQ,MAAM;AAC9B,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,0BAA0B,MAAM;AAAA,MACrC,GAAG;AAAA,MACH,GAAG;AAAA,IAAA,CACJ;AAAA,EACH,GAAG,CAAC,MAAM,GAAG,OAAO,OAAO,UAAU,CAAC,CAAC;AAGvC,QAAM,QAAQ,QAAQ,MAAM;AAC1B,WAAO,MAAM,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,KAAA,KAAU,CAAA;AAAA,EAC/C,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,aAAa,cAAA;AAEnB,QAAM,YAAY,WAAW;AAAA,IAC3B,aAAa;AAAA,EAAA,CACd;AAED,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,UAAU,WAAW,SAAA,IAAa;AAE1C,QAAM,aAAa,cAAc,iBAAiB;AAElD,SAAO;AAAA,IACL;AAAA,IACA,EAAE,WAAW,sBAAA;AAAA,IACb;AAAA,MACE;AAAA,MACA,EAAE,cAAc,gBAAgB,MAAA;AAAA,MAChC,EAAE,WAAW;AAAA,QACX,EAAE,iBAAiB;AAAA,UACjB;AAAA,UACA;AAAA,UACA,iBAAiB;AAAA,QAAA,CAClB;AAAA,QACD,EAAE,eAAe;AAAA,UACf;AAAA,YACE;AAAA,YACA;AAAA,cACE;AAAA,cACA,YAAY;AAAA,cACZ,QAAQ,UAAU;AAAA,cAClB,UAAU;AAAA,YAAA;AAAA,YAEZ,SAAS,IAAI,CAAC,KAAK,MAAM;AACvB,oBAAM,EAAE,QAAQ,QAAQ,YAAY,OAAO,QACzC,UAAU,SAAS,CAAC;AACtB,qBAAO,EAAE,SAAS;AAAA,gBAChB,YAAY,IAAI;AAAA,gBAChB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA,CACD;AAAA,YACH,CAAC;AAAA,UAAA;AAAA,UAEH,EAAE,GAAG,eAAe,EAAE,sBAAsB;AAAA,YAC1C,UAAU;AAAA,UAAA,CACX;AAAA;AAAA,UAED,EAAE,wBAAwB,EAAE,YAAY,MAAM;AAAA,QAAA,CAC/C;AAAA;AAAA;AAAA,QAGD,EAAE,iBAAiB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAAA,IAAA;AAAA,EACH;AAEJ;AAEA,SAAS,QAAQ;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,SAAO,EAAE,aAAa,EAAE,WAAW,eAAe,MAAM,OAAO;AAAA;AAAA;AAAA,IAG7D,EAAE,kBAAkB;AAAA,MAClB,WAAW,IAAI,CAAC,MAAM,MAAM;AAC1B,eAAO,EAAE,QAAQ;AAAA,UACf,OAAO,KAAK;AAAA,UACZ,UAAU,KAAK;AAAA,UACf;AAAA,UACA,OAAO;AAAA,UACP,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,KAAK,cAAc;AAAA,UAC/B;AAAA,QAAA,CACD;AAAA,MACH,CAAC;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACH;AAmBA,SAAS,OAAO,OAAoB;AAClC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,EAAA,IACE;AAEJ,QAAM,cAAc;AAEpB,MAAI,MAAM,UAAU,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,gBACJ,qBAAqB,QAAQ,YAAY,OACrC;AAAA,IACE,cAAc,MAAM,kBAAkB,QAAQ;AAAA,IAC9C,cAAc,MAAM,kBAAkB,IAAI;AAAA,EAAA,IAE5C,CAAA;AAEN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,WAAW,aAAa,UAAU;AAAA,MAClC,GAAG;AAAA,IAAA;AAAA,IAEL;AAAA,MACE;AAAA,MACA;AAAA;AAAA,QAEE,WAAW;AAAA,QACX,OAAO;AAAA,QACP;AAAA,QACA,gBAAgB;AAAA;AAAA,QAChB,UAAU,eAAe;AAAA,MAAA;AAAA,MAE3B,EAAE,WAAW;AAAA,QACX;AAAA,QACA,oBAAoB;AAAA,UAClB,OAAO;AAAA,UACP,WAAW;AAAA,QAAA;AAAA,MACb,CACD;AAAA,IAAA;AAAA,EACH;AAEJ;AAkEA,SAAS,UAAU,EAAE,YAAY;AAC/B,QAAM,kBAAkB,yBAAA;AAExB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,UAAU;AACR,wBAAgB,MAAM,IAAI;AAAA,MAC5B;AAAA,IAAA;AAAA,IAEF;AAAA,EAAA;AAEJ;AAYA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AAIvB,QAAM,YAAY;AAClB,MAAI,aAAa,QAAQ,kBAAkB,MAAM;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,EAAE;AAAA,IACP,EAAE,4BAA4B,cAAc;AAAA,IAC5C,EAAE,GAAG,aAAa,IAAI;AAAA,MACpB;AAAA,MACA;AAAA,QACE,OAAO;AAAA,UACL,aAAa;AAAA,UACb,cAAc;AAAA,UACd,KAAK;AAAA,QAAA;AAAA,MACP;AAAA,MAEF,KAAK,IAAI,CAAC,QAAQ,MAAM;AACtB,eAAO,EAAE,kBAAkB;AAAA,UACzB,KAAK,OAAO,YAAY;AAAA,UACxB;AAAA,UACA,aAAa;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,CACD;AAAA,MACH,CAAC;AAAA,IAAA;AAAA,EACH,CACD;AACH;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AAGD,QAAM,WAAW,OAAO;AACxB,QAAM,OAAO,wBAAwB,QAAQ;AAE7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,MAAA;AAAA,MAEZ,cAAc,MAAM,oBAAoB,QAAQ;AAAA,MAChD,cAAc,MAAM,oBAAoB,IAAI;AAAA,MAC5C,SAAS,gBACL,CAAC,MAAwB;AACvB,UAAE,gBAAA;AACF,sBAAc,QAAQ;AAAA,MACxB,IACA;AAAA,IAAA;AAAA,IAEN,EAAE,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,OAAO;AAAA,MACP,YAAY,MAAM,YAAY;AAAA,IAAA,CAC/B;AAAA,EAAA;AAEL;AASA,SAAS,gBAAgB,OAA6B;AACpD,QAAM,EAAE,WAAW,qBAAqB,MAAM,oBAAoB;AAClE,SAAO,EAAE,2CAA2C;AAAA,IAClD,EAAE,sBAAsB,EAAE,GAAG,WAAW;AAAA,IACxC,EAAE,wBAAwB;AAAA,MACxB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;"}
|
|
@@ -3,28 +3,31 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
|
|
|
3
3
|
const h$1 = require("@macrostrat/hyper");
|
|
4
4
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
5
5
|
const h__default = /* @__PURE__ */ _interopDefault(h$1);
|
|
6
|
-
const assistant = "
|
|
6
|
+
const assistant = "_assistant_17ryg_26";
|
|
7
7
|
const styles = {
|
|
8
|
-
"page-header": "_page-
|
|
9
|
-
"diagram-container": "_diagram-
|
|
10
|
-
"map-inset": "_map-
|
|
11
|
-
"column-selection-map": "_column-selection-
|
|
12
|
-
"map-expanded": "_map-
|
|
8
|
+
"page-header": "_page-header_17ryg_1",
|
|
9
|
+
"diagram-container": "_diagram-container_17ryg_8",
|
|
10
|
+
"map-inset": "_map-inset_17ryg_14",
|
|
11
|
+
"column-selection-map": "_column-selection-map_17ryg_14",
|
|
12
|
+
"map-expanded": "_map-expanded_17ryg_22",
|
|
13
13
|
assistant,
|
|
14
|
-
"unit-details-panel": "_unit-details-
|
|
15
|
-
"main-area": "_main-
|
|
16
|
-
"correlation-map": "_correlation-
|
|
17
|
-
"correlation-diagram": "_correlation-
|
|
18
|
-
"package": "
|
|
19
|
-
"package-overlay": "_package-
|
|
20
|
-
"laterally-extensive-unit": "_laterally-extensive-
|
|
21
|
-
"strat-col-span": "_strat-col-
|
|
22
|
-
"column-container": "_column-
|
|
23
|
-
"map-expanded-button": "_map-expanded-
|
|
24
|
-
"main-panel": "_main-
|
|
25
|
-
"main-chart": "_main-
|
|
26
|
-
"correlation-chart-inner": "_correlation-chart-
|
|
27
|
-
"age-axis-container": "_age-axis-
|
|
14
|
+
"unit-details-panel": "_unit-details-panel_17ryg_31",
|
|
15
|
+
"main-area": "_main-area_17ryg_31",
|
|
16
|
+
"correlation-map": "_correlation-map_17ryg_46",
|
|
17
|
+
"correlation-diagram": "_correlation-diagram_17ryg_68",
|
|
18
|
+
"package": "_package_17ryg_76",
|
|
19
|
+
"package-overlay": "_package-overlay_17ryg_79",
|
|
20
|
+
"laterally-extensive-unit": "_laterally-extensive-unit_17ryg_85",
|
|
21
|
+
"strat-col-span": "_strat-col-span_17ryg_85",
|
|
22
|
+
"column-container": "_column-container_17ryg_89",
|
|
23
|
+
"map-expanded-button": "_map-expanded-button_17ryg_94",
|
|
24
|
+
"main-panel": "_main-panel_17ryg_101",
|
|
25
|
+
"main-chart": "_main-chart_17ryg_108",
|
|
26
|
+
"correlation-chart-inner": "_correlation-chart-inner_17ryg_114",
|
|
27
|
+
"age-axis-container": "_age-axis-container_17ryg_122",
|
|
28
|
+
"column-header-spacer": "_column-header-spacer_17ryg_135",
|
|
29
|
+
"column-header-row": "_column-header-row_17ryg_141",
|
|
30
|
+
"column-header-cell": "_column-header-cell_17ryg_152"
|
|
28
31
|
};
|
|
29
32
|
let h = h__default.default.styled(styles);
|
|
30
33
|
Object.assign(h, styles);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.module.sass.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,26 +1,29 @@
|
|
|
1
1
|
import h$1 from "@macrostrat/hyper";
|
|
2
|
-
const assistant = "
|
|
2
|
+
const assistant = "_assistant_17ryg_26";
|
|
3
3
|
const styles = {
|
|
4
|
-
"page-header": "_page-
|
|
5
|
-
"diagram-container": "_diagram-
|
|
6
|
-
"map-inset": "_map-
|
|
7
|
-
"column-selection-map": "_column-selection-
|
|
8
|
-
"map-expanded": "_map-
|
|
4
|
+
"page-header": "_page-header_17ryg_1",
|
|
5
|
+
"diagram-container": "_diagram-container_17ryg_8",
|
|
6
|
+
"map-inset": "_map-inset_17ryg_14",
|
|
7
|
+
"column-selection-map": "_column-selection-map_17ryg_14",
|
|
8
|
+
"map-expanded": "_map-expanded_17ryg_22",
|
|
9
9
|
assistant,
|
|
10
|
-
"unit-details-panel": "_unit-details-
|
|
11
|
-
"main-area": "_main-
|
|
12
|
-
"correlation-map": "_correlation-
|
|
13
|
-
"correlation-diagram": "_correlation-
|
|
14
|
-
"package": "
|
|
15
|
-
"package-overlay": "_package-
|
|
16
|
-
"laterally-extensive-unit": "_laterally-extensive-
|
|
17
|
-
"strat-col-span": "_strat-col-
|
|
18
|
-
"column-container": "_column-
|
|
19
|
-
"map-expanded-button": "_map-expanded-
|
|
20
|
-
"main-panel": "_main-
|
|
21
|
-
"main-chart": "_main-
|
|
22
|
-
"correlation-chart-inner": "_correlation-chart-
|
|
23
|
-
"age-axis-container": "_age-axis-
|
|
10
|
+
"unit-details-panel": "_unit-details-panel_17ryg_31",
|
|
11
|
+
"main-area": "_main-area_17ryg_31",
|
|
12
|
+
"correlation-map": "_correlation-map_17ryg_46",
|
|
13
|
+
"correlation-diagram": "_correlation-diagram_17ryg_68",
|
|
14
|
+
"package": "_package_17ryg_76",
|
|
15
|
+
"package-overlay": "_package-overlay_17ryg_79",
|
|
16
|
+
"laterally-extensive-unit": "_laterally-extensive-unit_17ryg_85",
|
|
17
|
+
"strat-col-span": "_strat-col-span_17ryg_85",
|
|
18
|
+
"column-container": "_column-container_17ryg_89",
|
|
19
|
+
"map-expanded-button": "_map-expanded-button_17ryg_94",
|
|
20
|
+
"main-panel": "_main-panel_17ryg_101",
|
|
21
|
+
"main-chart": "_main-chart_17ryg_108",
|
|
22
|
+
"correlation-chart-inner": "_correlation-chart-inner_17ryg_114",
|
|
23
|
+
"age-axis-container": "_age-axis-container_17ryg_122",
|
|
24
|
+
"column-header-spacer": "_column-header-spacer_17ryg_135",
|
|
25
|
+
"column-header-row": "_column-header-row_17ryg_141",
|
|
26
|
+
"column-header-cell": "_column-header-cell_17ryg_152"
|
|
24
27
|
};
|
|
25
28
|
let h = h$1.styled(styles);
|
|
26
29
|
Object.assign(h, styles);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.module.sass.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -6,7 +6,6 @@ require("@macrostrat/stratigraphy-utils");
|
|
|
6
6
|
const utils = require("../prepare-units/utils.cjs");
|
|
7
7
|
const helpers = require("../prepare-units/helpers.cjs");
|
|
8
8
|
function buildCorrelationChartData(columns, settings) {
|
|
9
|
-
console.log(settings);
|
|
10
9
|
const {
|
|
11
10
|
mergeSections = utils.MergeSectionsMode.OVERLAPPING,
|
|
12
11
|
targetUnitHeight,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-data.cjs","sources":["../../src/correlation-chart/prepare-data.ts"],"sourcesContent":["import { CompositeStratigraphicScaleInfo } from \"../age-axis\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { type ColumnGeoJSONRecord, UnitLong } from \"@macrostrat/api-types\";\nimport {\n MergeSectionsMode,\n PrepareColumnOptions,\n prepareColumnUnits,\n preprocessUnits,\n} from \"../prepare-units\";\nimport { mergeAgeRanges } from \"@macrostrat/stratigraphy-utils\";\nimport { PackageLayoutData } from \"../prepare-units/types\";\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\ninterface ColumnData {\n columnID: number;\n units: UnitLong[];\n}\n\nexport interface CorrelationChartSettings extends Omit<\n PrepareColumnOptions,\n \"axisType\"\n> {\n targetUnitHeight?: number;\n}\n\nexport interface CorrelationChartData {\n packages: MultiColumnPackageData[];\n scaleInfo: CompositeStratigraphicScaleInfo;\n nColumns: number;\n}\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\nexport function buildCorrelationChartData(\n columns: ColumnData[],\n settings: CorrelationChartSettings,\n): CorrelationChartData {\n
|
|
1
|
+
{"version":3,"file":"prepare-data.cjs","sources":["../../src/correlation-chart/prepare-data.ts"],"sourcesContent":["import { CompositeStratigraphicScaleInfo } from \"../age-axis\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { type ColumnGeoJSONRecord, UnitLong } from \"@macrostrat/api-types\";\nimport {\n MergeSectionsMode,\n PrepareColumnOptions,\n prepareColumnUnits,\n preprocessUnits,\n} from \"../prepare-units\";\nimport { mergeAgeRanges } from \"@macrostrat/stratigraphy-utils\";\nimport { PackageLayoutData } from \"../prepare-units/types\";\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\ninterface ColumnData {\n columnID: number;\n units: UnitLong[];\n}\n\nexport interface CorrelationChartSettings extends Omit<\n PrepareColumnOptions,\n \"axisType\"\n> {\n targetUnitHeight?: number;\n}\n\nexport interface CorrelationChartData {\n packages: MultiColumnPackageData[];\n scaleInfo: CompositeStratigraphicScaleInfo;\n nColumns: number;\n}\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\nexport function buildCorrelationChartData(\n columns: ColumnData[],\n settings: CorrelationChartSettings,\n): CorrelationChartData {\n const {\n mergeSections = MergeSectionsMode.OVERLAPPING,\n targetUnitHeight,\n ...rest\n } = settings;\n\n const opts: PrepareColumnOptions = {\n axisType: ColumnAxisType.AGE,\n targetUnitHeight,\n mergeSections,\n ...rest,\n };\n\n if (columns.length == 0) {\n return null;\n }\n\n // Flatten the units array to pretend that all units are in the same column\n const _units = columns.map((d) => d.units).flat();\n\n const columnIDs = columns.map((d) => d.columnID);\n\n const preparedUnits = prepareColumnUnits(_units, opts);\n\n const { sections, totalHeight } = preparedUnits;\n\n const scaleInfo: CompositeStratigraphicScaleInfo = {\n axisType: ColumnAxisType.AGE,\n totalHeight,\n packages: sections.map((d) => d.scaleInfo),\n };\n\n const packages = sections.map((d) => {\n return separateColumns(d, columnIDs);\n });\n\n return { scaleInfo, packages, nColumns: columnIDs.length };\n}\n\ninterface UnitGroup {\n b_age: number;\n t_age: number;\n strat_name_id: number;\n strat_name_long: string;\n units: (UnitLong | null)[];\n}\n\nexport interface UnitGroupBox extends UnitGroup {\n units: UnitLong[];\n startCol: number;\n endCol: number;\n}\n\ninterface ColumnExt {\n columnID: number;\n units: UnitLong[];\n}\n\ninterface MultiColumnPackageData {\n columnData: ColumnExt[];\n bestPixelScale?: number;\n b_age: number;\n t_age: number;\n}\n\nexport function findLaterallyExtensiveUnits(\n pkg: MultiColumnPackageData,\n): UnitGroup[] {\n const { columnData, b_age, t_age } = pkg;\n // Group units by strat_name_id\n const unitIndex = new Map<number, Map<number, UnitLong>>();\n for (const column of columnData) {\n const { units } = column;\n for (const unit of units) {\n if (unit.strat_name_id == null) continue;\n if (!unitIndex.has(unit.strat_name_id)) {\n unitIndex.set(unit.strat_name_id, new Map());\n }\n unitIndex.get(unit.strat_name_id).set(column.columnID, unit);\n }\n }\n\n // Prepare grouped units for rendering\n const unitGroups: UnitGroup[] = [];\n for (const [strat_name_id, unitIndex0] of unitIndex) {\n const units = columnData.map((d) => unitIndex0.get(d.columnID) ?? null);\n const filteredUnits = units.filter((d) => d != null);\n const [t_age, b_age] = mergeAgeRanges(\n filteredUnits.map((d) => [d.t_age, d.b_age]),\n );\n if (filteredUnits.length <= 1) continue;\n\n unitGroups.push({\n b_age,\n t_age,\n strat_name_id,\n strat_name_long: filteredUnits[0].strat_name_long,\n units,\n });\n }\n\n return unitGroups;\n}\n\nexport function splitStratIntoBoxes(pkg: UnitGroup): UnitGroupBox[] {\n const { strat_name_long, strat_name_id, units } = pkg;\n const boxes: UnitGroupBox[] = [];\n let currentBox: UnitGroupBox = null;\n for (let i = 0; i < units.length; i++) {\n const unit = units[i];\n if (unit == null) {\n if (currentBox != null) {\n boxes.push(currentBox);\n currentBox = null;\n }\n continue;\n }\n if (currentBox == null) {\n currentBox = {\n startCol: i,\n endCol: i,\n strat_name_id,\n strat_name_long,\n t_age: unit.t_age,\n b_age: unit.b_age,\n units: [],\n };\n } else {\n currentBox.endCol = i;\n }\n currentBox.units.push(unit);\n }\n return boxes;\n}\n\nfunction separateColumns(\n pkg: PackageLayoutData,\n columnIDs: number[],\n): MultiColumnPackageData {\n /** Separate columns by col_id */\n const { units, t_age, b_age } = pkg;\n\n return {\n columnData: columnIDs.map((d) => {\n const u1 = units.filter((unit) => unit.col_id == d);\n u1.sort((a, b) => a.t_age - b.t_age);\n return {\n columnID: d,\n // Ensure that the units correctly show overlap\n units: preprocessUnits(\n {\n ...pkg,\n units: u1,\n },\n ColumnAxisType.AGE,\n ),\n };\n }),\n bestPixelScale: pkg.scaleInfo.pixelScale,\n t_age,\n b_age,\n };\n}\n\nexport function columnGeoJSONRecordToColumnIdentifier(\n col: ColumnGeoJSONRecord,\n): ColumnIdentifier {\n return {\n col_id: col.properties.col_id,\n col_name: col.properties.col_name,\n project_id: col.properties.project_id,\n };\n}\n"],"names":["MergeSectionsMode","ColumnAxisType","prepareColumnUnits","preprocessUnits"],"mappings":";;;;;;;AA0CO,SAAS,0BACd,SACA,UACsB;AACtB,QAAM;AAAA,IACJ,gBAAgBA,MAAAA,kBAAkB;AAAA,IAClC;AAAA,IACA,GAAG;AAAA,EAAA,IACD;AAEJ,QAAM,OAA6B;AAAA,IACjC,UAAUC,iBAAAA,eAAe;AAAA,IACzB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA;AAGL,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAA;AAE3C,QAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ;AAE/C,QAAM,gBAAgBC,MAAAA,mBAAmB,QAAQ,IAAI;AAErD,QAAM,EAAE,UAAU,YAAA,IAAgB;AAElC,QAAM,YAA6C;AAAA,IACjD,UAAUD,iBAAAA,eAAe;AAAA,IACzB;AAAA,IACA,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,EAAA;AAG3C,QAAM,WAAW,SAAS,IAAI,CAAC,MAAM;AACnC,WAAO,gBAAgB,GAAG,SAAS;AAAA,EACrC,CAAC;AAED,SAAO,EAAE,WAAW,UAAU,UAAU,UAAU,OAAA;AACpD;AAkGA,SAAS,gBACP,KACA,WACwB;AAExB,QAAM,EAAE,OAAO,OAAO,MAAA,IAAU;AAEhC,SAAO;AAAA,IACL,YAAY,UAAU,IAAI,CAAC,MAAM;AAC/B,YAAM,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC;AAClD,SAAG,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,aAAO;AAAA,QACL,UAAU;AAAA;AAAA,QAEV,OAAOE,QAAAA;AAAAA,UACL;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,UAAA;AAAA,UAETF,gCAAe;AAAA,QAAA;AAAA,MACjB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAgB,IAAI,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,EAAA;AAEJ;;"}
|
|
@@ -4,7 +4,6 @@ import "@macrostrat/stratigraphy-utils";
|
|
|
4
4
|
import { MergeSectionsMode } from "../prepare-units/utils.js";
|
|
5
5
|
import { preprocessUnits } from "../prepare-units/helpers.js";
|
|
6
6
|
function buildCorrelationChartData(columns, settings) {
|
|
7
|
-
console.log(settings);
|
|
8
7
|
const {
|
|
9
8
|
mergeSections = MergeSectionsMode.OVERLAPPING,
|
|
10
9
|
targetUnitHeight,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-data.js","sources":["../../src/correlation-chart/prepare-data.ts"],"sourcesContent":["import { CompositeStratigraphicScaleInfo } from \"../age-axis\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { type ColumnGeoJSONRecord, UnitLong } from \"@macrostrat/api-types\";\nimport {\n MergeSectionsMode,\n PrepareColumnOptions,\n prepareColumnUnits,\n preprocessUnits,\n} from \"../prepare-units\";\nimport { mergeAgeRanges } from \"@macrostrat/stratigraphy-utils\";\nimport { PackageLayoutData } from \"../prepare-units/types\";\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\ninterface ColumnData {\n columnID: number;\n units: UnitLong[];\n}\n\nexport interface CorrelationChartSettings extends Omit<\n PrepareColumnOptions,\n \"axisType\"\n> {\n targetUnitHeight?: number;\n}\n\nexport interface CorrelationChartData {\n packages: MultiColumnPackageData[];\n scaleInfo: CompositeStratigraphicScaleInfo;\n nColumns: number;\n}\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\nexport function buildCorrelationChartData(\n columns: ColumnData[],\n settings: CorrelationChartSettings,\n): CorrelationChartData {\n
|
|
1
|
+
{"version":3,"file":"prepare-data.js","sources":["../../src/correlation-chart/prepare-data.ts"],"sourcesContent":["import { CompositeStratigraphicScaleInfo } from \"../age-axis\";\nimport { ColumnAxisType } from \"@macrostrat/column-components\";\nimport { type ColumnGeoJSONRecord, UnitLong } from \"@macrostrat/api-types\";\nimport {\n MergeSectionsMode,\n PrepareColumnOptions,\n prepareColumnUnits,\n preprocessUnits,\n} from \"../prepare-units\";\nimport { mergeAgeRanges } from \"@macrostrat/stratigraphy-utils\";\nimport { PackageLayoutData } from \"../prepare-units/types\";\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\ninterface ColumnData {\n columnID: number;\n units: UnitLong[];\n}\n\nexport interface CorrelationChartSettings extends Omit<\n PrepareColumnOptions,\n \"axisType\"\n> {\n targetUnitHeight?: number;\n}\n\nexport interface CorrelationChartData {\n packages: MultiColumnPackageData[];\n scaleInfo: CompositeStratigraphicScaleInfo;\n nColumns: number;\n}\n\nexport interface ColumnIdentifier {\n col_id: number;\n col_name: string;\n project_id: number;\n}\n\nexport function buildCorrelationChartData(\n columns: ColumnData[],\n settings: CorrelationChartSettings,\n): CorrelationChartData {\n const {\n mergeSections = MergeSectionsMode.OVERLAPPING,\n targetUnitHeight,\n ...rest\n } = settings;\n\n const opts: PrepareColumnOptions = {\n axisType: ColumnAxisType.AGE,\n targetUnitHeight,\n mergeSections,\n ...rest,\n };\n\n if (columns.length == 0) {\n return null;\n }\n\n // Flatten the units array to pretend that all units are in the same column\n const _units = columns.map((d) => d.units).flat();\n\n const columnIDs = columns.map((d) => d.columnID);\n\n const preparedUnits = prepareColumnUnits(_units, opts);\n\n const { sections, totalHeight } = preparedUnits;\n\n const scaleInfo: CompositeStratigraphicScaleInfo = {\n axisType: ColumnAxisType.AGE,\n totalHeight,\n packages: sections.map((d) => d.scaleInfo),\n };\n\n const packages = sections.map((d) => {\n return separateColumns(d, columnIDs);\n });\n\n return { scaleInfo, packages, nColumns: columnIDs.length };\n}\n\ninterface UnitGroup {\n b_age: number;\n t_age: number;\n strat_name_id: number;\n strat_name_long: string;\n units: (UnitLong | null)[];\n}\n\nexport interface UnitGroupBox extends UnitGroup {\n units: UnitLong[];\n startCol: number;\n endCol: number;\n}\n\ninterface ColumnExt {\n columnID: number;\n units: UnitLong[];\n}\n\ninterface MultiColumnPackageData {\n columnData: ColumnExt[];\n bestPixelScale?: number;\n b_age: number;\n t_age: number;\n}\n\nexport function findLaterallyExtensiveUnits(\n pkg: MultiColumnPackageData,\n): UnitGroup[] {\n const { columnData, b_age, t_age } = pkg;\n // Group units by strat_name_id\n const unitIndex = new Map<number, Map<number, UnitLong>>();\n for (const column of columnData) {\n const { units } = column;\n for (const unit of units) {\n if (unit.strat_name_id == null) continue;\n if (!unitIndex.has(unit.strat_name_id)) {\n unitIndex.set(unit.strat_name_id, new Map());\n }\n unitIndex.get(unit.strat_name_id).set(column.columnID, unit);\n }\n }\n\n // Prepare grouped units for rendering\n const unitGroups: UnitGroup[] = [];\n for (const [strat_name_id, unitIndex0] of unitIndex) {\n const units = columnData.map((d) => unitIndex0.get(d.columnID) ?? null);\n const filteredUnits = units.filter((d) => d != null);\n const [t_age, b_age] = mergeAgeRanges(\n filteredUnits.map((d) => [d.t_age, d.b_age]),\n );\n if (filteredUnits.length <= 1) continue;\n\n unitGroups.push({\n b_age,\n t_age,\n strat_name_id,\n strat_name_long: filteredUnits[0].strat_name_long,\n units,\n });\n }\n\n return unitGroups;\n}\n\nexport function splitStratIntoBoxes(pkg: UnitGroup): UnitGroupBox[] {\n const { strat_name_long, strat_name_id, units } = pkg;\n const boxes: UnitGroupBox[] = [];\n let currentBox: UnitGroupBox = null;\n for (let i = 0; i < units.length; i++) {\n const unit = units[i];\n if (unit == null) {\n if (currentBox != null) {\n boxes.push(currentBox);\n currentBox = null;\n }\n continue;\n }\n if (currentBox == null) {\n currentBox = {\n startCol: i,\n endCol: i,\n strat_name_id,\n strat_name_long,\n t_age: unit.t_age,\n b_age: unit.b_age,\n units: [],\n };\n } else {\n currentBox.endCol = i;\n }\n currentBox.units.push(unit);\n }\n return boxes;\n}\n\nfunction separateColumns(\n pkg: PackageLayoutData,\n columnIDs: number[],\n): MultiColumnPackageData {\n /** Separate columns by col_id */\n const { units, t_age, b_age } = pkg;\n\n return {\n columnData: columnIDs.map((d) => {\n const u1 = units.filter((unit) => unit.col_id == d);\n u1.sort((a, b) => a.t_age - b.t_age);\n return {\n columnID: d,\n // Ensure that the units correctly show overlap\n units: preprocessUnits(\n {\n ...pkg,\n units: u1,\n },\n ColumnAxisType.AGE,\n ),\n };\n }),\n bestPixelScale: pkg.scaleInfo.pixelScale,\n t_age,\n b_age,\n };\n}\n\nexport function columnGeoJSONRecordToColumnIdentifier(\n col: ColumnGeoJSONRecord,\n): ColumnIdentifier {\n return {\n col_id: col.properties.col_id,\n col_name: col.properties.col_name,\n project_id: col.properties.project_id,\n };\n}\n"],"names":[],"mappings":";;;;;AA0CO,SAAS,0BACd,SACA,UACsB;AACtB,QAAM;AAAA,IACJ,gBAAgB,kBAAkB;AAAA,IAClC;AAAA,IACA,GAAG;AAAA,EAAA,IACD;AAEJ,QAAM,OAA6B;AAAA,IACjC,UAAU,eAAe;AAAA,IACzB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EAAA;AAGL,MAAI,QAAQ,UAAU,GAAG;AACvB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAA;AAE3C,QAAM,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ;AAE/C,QAAM,gBAAgB,mBAAmB,QAAQ,IAAI;AAErD,QAAM,EAAE,UAAU,YAAA,IAAgB;AAElC,QAAM,YAA6C;AAAA,IACjD,UAAU,eAAe;AAAA,IACzB;AAAA,IACA,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,EAAA;AAG3C,QAAM,WAAW,SAAS,IAAI,CAAC,MAAM;AACnC,WAAO,gBAAgB,GAAG,SAAS;AAAA,EACrC,CAAC;AAED,SAAO,EAAE,WAAW,UAAU,UAAU,UAAU,OAAA;AACpD;AAkGA,SAAS,gBACP,KACA,WACwB;AAExB,QAAM,EAAE,OAAO,OAAO,MAAA,IAAU;AAEhC,SAAO;AAAA,IACL,YAAY,UAAU,IAAI,CAAC,MAAM;AAC/B,YAAM,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,CAAC;AAClD,SAAG,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnC,aAAO;AAAA,QACL,UAAU;AAAA;AAAA,QAEV,OAAO;AAAA,UACL;AAAA,YACE,GAAG;AAAA,YACH,OAAO;AAAA,UAAA;AAAA,UAET,eAAe;AAAA,QAAA;AAAA,MACjB;AAAA,IAEJ,CAAC;AAAA,IACD,gBAAgB,IAAI,UAAU;AAAA,IAC9B;AAAA,IACA;AAAA,EAAA;AAEJ;"}
|
|
@@ -88,6 +88,9 @@ function useUnitSelectionTarget(unit) {
|
|
|
88
88
|
const [selectedUnit, selectUnit] = useUnitSelection();
|
|
89
89
|
const selected = selectedUnit?.unit_id == unit.unit_id;
|
|
90
90
|
const selectedUnitElement = store.scope.useAtomValue(selectedUnitElementAtom);
|
|
91
|
+
const selectedStratName = selectedUnit?.strat_name_id;
|
|
92
|
+
const unitStratName = unit?.strat_name_id;
|
|
93
|
+
const linked = !selected && selectedStratName != null && unitStratName != null && unitStratName === selectedStratName;
|
|
91
94
|
const onClick = React.useCallback(
|
|
92
95
|
(evt) => {
|
|
93
96
|
selectUnit?.(unit, ref.current);
|
|
@@ -106,7 +109,7 @@ function useUnitSelectionTarget(unit) {
|
|
|
106
109
|
inline: "nearest"
|
|
107
110
|
});
|
|
108
111
|
}, [selectedUnitElement]);
|
|
109
|
-
return [ref, selected, onClick];
|
|
112
|
+
return [ref, selected, onClick, linked];
|
|
110
113
|
}
|
|
111
114
|
function UnitKeyboardNavigation({
|
|
112
115
|
columnData,
|