Skip to content

Commit 77c0b5e

Browse files
committed
Add link to SGP facet
1 parent afe04a3 commit 77c0b5e

File tree

2 files changed

+92
-1
lines changed

2 files changed

+92
-1
lines changed

pages/columns/@column/column-inspector/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
MacrostratDataProvider,
1111
PBDBFossilsColumn,
1212
ReferencesField,
13-
SGPMeasurementsColumn,
1413
} from "@macrostrat/column-views";
1514
import { hyperStyled } from "@macrostrat/hyper";
1615
import { ReactNode, useCallback, useEffect, useMemo, useRef } from "react";
@@ -37,6 +36,7 @@ import {
3736
NumericInput,
3837
} from "@blueprintjs/core";
3938
import { useHydrateAtoms } from "jotai/utils";
39+
import { SGPMeasurementsColumn } from "./sgp-facet";
4040

4141
interface ColumnHashState {
4242
unit?: number;
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import h from "@macrostrat/hyper";
2+
import { useAPIResult } from "@macrostrat/ui-components";
3+
import {
4+
BaseMeasurementsColumn,
5+
groupNotesByPixelDistance,
6+
standardizeMeasurementHeight,
7+
TruncatedList,
8+
useCompositeScale,
9+
useMacrostratColumnData,
10+
} from "@macrostrat/column-views";
11+
import type { UnitLong } from "@macrostrat/api-types";
12+
import type { ColumnAxisType } from "@macrostrat/column-components";
13+
import type { CompositeColumnScale } from "@macrostrat/column-views";
14+
15+
function useSGPData({ col_id }) {
16+
return useAPIResult(
17+
"https://dev.macrostrat.org/api/pg/sgp_unit_matches",
18+
{
19+
col_id: `eq.${col_id}`,
20+
},
21+
(d) => d
22+
);
23+
}
24+
25+
interface SGPSampleData {
26+
col_id: number;
27+
unit_id: number;
28+
sgp_samples: { name: string; id: number }[];
29+
}
30+
31+
export function SGPMeasurementsColumn({ columnID }) {
32+
const data: SGPSampleData[] | null = useSGPData({ col_id: columnID });
33+
const { axisType, units } = useMacrostratColumnData();
34+
const scale = useCompositeScale();
35+
36+
if (data == null || units == null || scale == null) return null;
37+
38+
const data1 = prepareSGPData(data, scale, units, axisType);
39+
40+
return h(BaseMeasurementsColumn, {
41+
data: data1,
42+
noteComponent: SGPSamplesNote,
43+
focusedNoteComponent: SGPSamplesNote,
44+
});
45+
}
46+
47+
function SGPSamplesNote(props: { note: any; focused: boolean }) {
48+
const { note, focused } = props;
49+
const sgp_samples = note?.data;
50+
51+
if (sgp_samples == null || sgp_samples.length === 0) return null;
52+
53+
return h(TruncatedList, {
54+
className: "sgp-samples",
55+
data: sgp_samples,
56+
itemRenderer: (p) => {
57+
const sgpLink = `https://test.sgp-search.io/samples/${p.data.id}`;
58+
return h("a", {href: sgpLink, target: "_blank"}, p.data.name);
59+
},
60+
maxItems: focused ? Infinity : 5,
61+
});
62+
}
63+
64+
function prepareSGPData(
65+
data: SGPSampleData[],
66+
scale: CompositeColumnScale,
67+
units: UnitLong[],
68+
axisType: ColumnAxisType
69+
) {
70+
// Find matching units for samples
71+
const d1 = data
72+
.map((sample) => {
73+
const data = sample.sgp_samples;
74+
if (data == null || data.length === 0) return null;
75+
const heightData = standardizeMeasurementHeight(
76+
{ unit_id: sample.unit_id },
77+
units,
78+
axisType
79+
);
80+
if (heightData == null) return null;
81+
data.sort((a, b) => a.id - b.id);
82+
return {
83+
...heightData,
84+
data,
85+
id: sample.unit_id,
86+
};
87+
})
88+
.filter(Boolean);
89+
90+
return groupNotesByPixelDistance(d1, scale, axisType, 5);
91+
}

0 commit comments

Comments
 (0)