@macrostrat/column-views 3.0.3 → 3.1.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 +8 -0
- package/dist/data-provider/column-nav.js +1 -1
- package/dist/data-provider/index.d.ts +0 -2
- package/dist/data-provider/store.cjs +49 -6
- package/dist/data-provider/store.cjs.map +1 -1
- package/dist/data-provider/store.js +46 -3
- package/dist/data-provider/store.js.map +1 -1
- package/dist/data-provider/unit-selection.cjs +9 -9
- 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 +2 -2
- package/dist/data-provider/unit-selection.js.map +1 -1
- package/dist/index.cjs +5 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -23
- package/dist/index.js.map +1 -1
- package/dist/maps/column-correlation/state.cjs +2 -2
- package/dist/maps/column-correlation/state.cjs.map +1 -1
- package/dist/maps/column-correlation/state.d.ts +1 -0
- package/dist/maps/column-correlation/state.js +1 -1
- package/dist/maps/column-correlation/state.js.map +1 -1
- package/dist/maps/column-navigation/mapbox/state.cjs +3 -3
- package/dist/maps/column-navigation/mapbox/state.cjs.map +1 -1
- package/dist/maps/column-navigation/mapbox/state.js +1 -1
- package/dist/maps/column-navigation/mapbox/state.js.map +1 -1
- package/dist/maps/column-navigation/svg/data-fetcher.cjs +25 -0
- package/dist/maps/column-navigation/svg/data-fetcher.cjs.map +1 -0
- package/dist/maps/column-navigation/svg/data-fetcher.d.ts +6 -0
- package/dist/maps/column-navigation/svg/data-fetcher.js +25 -0
- package/dist/maps/column-navigation/svg/data-fetcher.js.map +1 -0
- package/dist/maps/column-navigation/svg/layers.cjs +2 -3
- package/dist/maps/column-navigation/svg/layers.cjs.map +1 -1
- package/dist/maps/column-navigation/svg/layers.js +1 -2
- package/dist/maps/column-navigation/svg/layers.js.map +1 -1
- package/dist/section.cjs +3 -3
- package/dist/section.cjs.map +1 -1
- package/dist/section.js +2 -2
- package/dist/section.js.map +1 -1
- package/dist/unit-details/panel.cjs +76 -57
- package/dist/unit-details/panel.cjs.map +1 -1
- package/dist/unit-details/panel.js +72 -53
- package/dist/unit-details/panel.js.map +1 -1
- package/dist/units/boxes.cjs +1 -0
- package/dist/units/boxes.cjs.map +1 -1
- package/dist/units/boxes.js +1 -0
- package/dist/units/boxes.js.map +1 -1
- package/dist/units/index.cjs +4 -4
- package/dist/units/index.cjs.map +1 -1
- package/dist/units/index.js +1 -1
- package/dist/units/index.js.map +1 -1
- package/package.json +3 -2
- package/src/correlation-chart/stories/correlation-chart.stories.ts +29 -22
- package/src/data-provider/index.ts +0 -2
- package/src/data-provider/store.ts +51 -10
- package/src/data-provider/unit-selection.ts +4 -4
- package/src/maps/column-correlation/state.ts +2 -1
- package/src/maps/column-navigation/mapbox/state.ts +1 -1
- package/src/maps/column-navigation/svg/column-navigation-svg-map.stories.ts +1 -1
- package/src/maps/column-navigation/svg/data-fetcher.ts +34 -0
- package/src/maps/column-navigation/svg/layers.ts +1 -1
- package/src/section.ts +1 -1
- package/src/unit-details/panel.ts +97 -60
- package/src/units/boxes.ts +2 -1
- package/src/units/index.ts +1 -1
- package/dist/data-provider/base.cjs +0 -352
- package/dist/data-provider/base.cjs.map +0 -1
- package/dist/data-provider/base.d.ts +0 -65
- package/dist/data-provider/base.js +0 -349
- package/dist/data-provider/base.js.map +0 -1
- package/dist/data-provider/core.cjs +0 -58
- package/dist/data-provider/core.cjs.map +0 -1
- package/dist/data-provider/core.d.ts +0 -31
- package/dist/data-provider/core.js +0 -56
- package/dist/data-provider/core.js.map +0 -1
- package/dist/data-provider/fetch.cjs +0 -212
- package/dist/data-provider/fetch.cjs.map +0 -1
- package/dist/data-provider/fetch.d.ts +0 -27
- package/dist/data-provider/fetch.js +0 -210
- package/dist/data-provider/fetch.js.map +0 -1
- package/dist/data-provider/store.d.ts +0 -34
- package/dist/unit-details/panel.d.ts +0 -87
- package/src/data-provider/base.ts +0 -475
- package/src/data-provider/core.ts +0 -89
- package/src/data-provider/fetch.ts +0 -278
package/dist/index.js
CHANGED
|
@@ -19,8 +19,7 @@ import { FossilDataType, useFossilData } from "./facets/fossils/provider.js";
|
|
|
19
19
|
import { HeightMethod, HybridScaleType } from "./prepare-units/types.js";
|
|
20
20
|
import { InsetMap } from "./maps/_shared/inset-map.js";
|
|
21
21
|
import { IsotopesColumn, IsotopesDataset } from "./facets/carbon-isotopes/isotopes-column.js";
|
|
22
|
-
import { LithologiesProvider,
|
|
23
|
-
import { MacrostratColumnDataProvider, MacrostratColumnStateProvider, UnitSelectionProvider, useColumnUnitsMap, useCompositeScale, useMacrostratColumnData, useMacrostratUnits } from "./data-provider/store.js";
|
|
22
|
+
import { LithologiesProvider, MacrostratColumnDataProvider, MacrostratColumnProvider, MacrostratColumnStateProvider, UnitSelectionProvider, columnUnitsAtom, columnUnitsMapAtom, scope, useColumnUnitsMap, useCompositeScale, useMacrostratColumnData, useMacrostratUnits } from "./data-provider/store.js";
|
|
24
23
|
import { MeasurementDataContext, MeasurementDataProvider, useMeasurementData } from "./facets/carbon-isotopes/data-provider.js";
|
|
25
24
|
import { MergeSectionsMode, agesOverlap, createUnitSorter, ensureArray, ensureRealFloat, getPositionWithinUnit, getUnitHeightRange, unitsOverlap } from "./prepare-units/utils.js";
|
|
26
25
|
import { PBDBFossilsColumn } from "./facets/fossils/index.js";
|
|
@@ -30,7 +29,6 @@ import { UnitDetailsPanelWithNavigation } from "./unit-details/modal-panel.js";
|
|
|
30
29
|
import { UnitDetailsPopover, UnitSelectionPopover } from "./unit-details/popover.js";
|
|
31
30
|
import { UnitKeyboardNavigation, UnitSelectionCallbackManager, allowUnitSelectionAtom, selectedUnitIDAtom, useAtomOverlayPosition, useColumnRef, useSelectedUnit, useUnitSelectionDispatch, useUnitSelectionTarget } from "./data-provider/unit-selection.js";
|
|
32
31
|
import { buildColumnsStyle } from "./maps/_shared/styles.js";
|
|
33
|
-
import { fetchAllColumns, fetchColumnUnits, fetchEnvironments, fetchIntervals, fetchLithologies, fetchRefs, fetchStratNames, fetchUnits, useColumnFeatures } from "./data-provider/fetch.js";
|
|
34
32
|
import { getMixedUnitColor } from "./units/colors.js";
|
|
35
33
|
import { parseLineFromString, stringifyLine } from "./correlation-chart/hash-string.js";
|
|
36
34
|
import { preprocessUnits } from "./prepare-units/helpers.js";
|
|
@@ -79,11 +77,9 @@ export {
|
|
|
79
77
|
LabelTrackerProvider,
|
|
80
78
|
LegendPanelHeader,
|
|
81
79
|
LithologiesProvider,
|
|
82
|
-
MacrostratAPIProvider,
|
|
83
80
|
MacrostratColumnDataProvider,
|
|
84
81
|
MacrostratColumnProvider,
|
|
85
82
|
MacrostratColumnStateProvider,
|
|
86
|
-
MacrostratDataProvider,
|
|
87
83
|
MeasurementDataContext,
|
|
88
84
|
MeasurementDataProvider,
|
|
89
85
|
MeasurementsLayer,
|
|
@@ -111,17 +107,11 @@ export {
|
|
|
111
107
|
agesOverlap,
|
|
112
108
|
allowUnitSelectionAtom,
|
|
113
109
|
buildColumnsStyle,
|
|
110
|
+
columnUnitsAtom,
|
|
111
|
+
columnUnitsMapAtom,
|
|
114
112
|
createUnitSorter,
|
|
115
113
|
ensureArray,
|
|
116
114
|
ensureRealFloat,
|
|
117
|
-
fetchAllColumns,
|
|
118
|
-
fetchColumnUnits,
|
|
119
|
-
fetchEnvironments,
|
|
120
|
-
fetchIntervals,
|
|
121
|
-
fetchLithologies,
|
|
122
|
-
fetchRefs,
|
|
123
|
-
fetchStratNames,
|
|
124
|
-
fetchUnits,
|
|
125
115
|
getMixedUnitColor,
|
|
126
116
|
getPositionWithinUnit,
|
|
127
117
|
getUnitHeightRange,
|
|
@@ -130,28 +120,19 @@ export {
|
|
|
130
120
|
parseLineFromString,
|
|
131
121
|
prepareColumnUnits,
|
|
132
122
|
preprocessUnits,
|
|
123
|
+
scope,
|
|
133
124
|
selectedUnitIDAtom,
|
|
134
125
|
standardizeMeasurementHeight,
|
|
135
126
|
stringifyLine,
|
|
136
127
|
unitsOverlap,
|
|
137
128
|
useAtomOverlayPosition,
|
|
138
|
-
useColumnFeatures,
|
|
139
129
|
useColumnNav,
|
|
140
130
|
useColumnRef,
|
|
141
131
|
useColumnUnitsMap,
|
|
142
132
|
useCompositeScale,
|
|
143
133
|
useCorrelationMapStore,
|
|
144
|
-
useEnvironments,
|
|
145
134
|
useFossilData,
|
|
146
|
-
useLithologies,
|
|
147
|
-
useMacrostratBaseURL,
|
|
148
135
|
useMacrostratColumnData,
|
|
149
|
-
useMacrostratColumnInfo,
|
|
150
|
-
useMacrostratColumns,
|
|
151
|
-
useMacrostratData,
|
|
152
|
-
useMacrostratDefs,
|
|
153
|
-
useMacrostratFetch,
|
|
154
|
-
useMacrostratStore,
|
|
155
136
|
useMacrostratUnits,
|
|
156
137
|
useMeasurementData,
|
|
157
138
|
usePreparedColumnUnits,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -8,7 +8,7 @@ const centroid = require("@turf/centroid");
|
|
|
8
8
|
const React = require("react");
|
|
9
9
|
const h = require("@macrostrat/hyper");
|
|
10
10
|
const zustandComputed = require("zustand-computed");
|
|
11
|
-
const
|
|
11
|
+
const dataProvider = require("@macrostrat/data-provider");
|
|
12
12
|
const buffer = require("@turf/buffer");
|
|
13
13
|
const booleanPointInPolygon = require("@turf/boolean-point-in-polygon");
|
|
14
14
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
@@ -54,7 +54,7 @@ function ColumnCorrelationProvider({
|
|
|
54
54
|
})
|
|
55
55
|
);
|
|
56
56
|
});
|
|
57
|
-
const _columns =
|
|
57
|
+
const _columns = dataProvider.useMacrostratColumns(projectID, inProcess);
|
|
58
58
|
React.useEffect(() => {
|
|
59
59
|
if (_columns != null) {
|
|
60
60
|
store.setState({ columns: _columns });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.cjs","sources":["../../../src/maps/column-correlation/state.ts"],"sourcesContent":["import { LineString, Point } from \"geojson\";\nimport { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecord } from \"@macrostrat/api-types\";\n// Turf intersection\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport distance from \"@turf/distance\";\nimport { nearestPointOnLine } from \"@turf/nearest-point-on-line\";\nimport { centroid } from \"@turf/centroid\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { createComputed } from \"zustand-computed\";\nimport { useMacrostratColumns } from \"
|
|
1
|
+
{"version":3,"file":"state.cjs","sources":["../../../src/maps/column-correlation/state.ts"],"sourcesContent":["import { LineString, Point } from \"geojson\";\nimport { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecord } from \"@macrostrat/api-types\";\n// Turf intersection\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport distance from \"@turf/distance\";\nimport { nearestPointOnLine } from \"@turf/nearest-point-on-line\";\nimport { centroid } from \"@turf/centroid\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { createComputed } from \"zustand-computed\";\nimport { useMacrostratColumns } from \"@macrostrat/data-provider\";\nimport { buffer } from \"@turf/buffer\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\n\nexport interface CorrelationMapInput {\n columns: ColumnGeoJSONRecord[];\n focusedLine: LineString | null;\n}\n\nexport interface CorrelationMapStore extends CorrelationMapInput {\n onClickMap: (event: mapboxgl.MapMouseEvent, point: Point) => void;\n projectID?: number;\n}\n\nexport interface CorrelationProviderProps extends CorrelationMapInput {\n projectID?: number;\n inProcess?: boolean;\n columns: ColumnGeoJSONRecord[] | null;\n children: ReactNode;\n onSelectColumns?: (\n columns: FocusedColumnGeoJSONRecord[],\n line: LineString | null,\n ) => void;\n}\n\nconst CorrelationStoreContext =\n createContext<StoreApi<CorrelationMapStore> | null>(null);\n\ntype ComputedStore = {\n focusedColumns: FocusedColumnGeoJSONRecord[];\n};\n\n/** A computed store that will automatically update when the state changes */\nconst computed = createComputed((state: CorrelationMapStore): ComputedStore => {\n return {\n // We compute the focused columns based on columns and focusedLine\n focusedColumns: buildCorrelationColumns(state.columns, state.focusedLine),\n };\n}) as any;\n\nexport function ColumnCorrelationProvider({\n children,\n columns,\n projectID,\n inProcess,\n focusedLine,\n onSelectColumns,\n}: CorrelationProviderProps) {\n const [store] = useState(() => {\n return create<CorrelationMapStore & ComputedStore>(\n computed((set, get): CorrelationMapStore => {\n return {\n focusedLine,\n projectID,\n columns: null,\n onClickMap(event: mapboxgl.MapMouseEvent, point: Point) {\n const state = get();\n // Check if shift key is pressed\n const shiftKeyPressed = event.originalEvent.shiftKey;\n let existingCoords = state.focusedLine?.coordinates ?? [];\n\n if (existingCoords.length >= 2 && !shiftKeyPressed) {\n // Reset the line to zero length\n existingCoords = [];\n }\n set({\n focusedLine: {\n type: \"LineString\",\n coordinates: [...existingCoords, point.coordinates],\n },\n });\n },\n };\n }),\n );\n });\n\n // Set up the store\n /** TODO: move the fetching of all columns to within the map */\n const _columns = useMacrostratColumns(projectID, inProcess);\n useEffect(() => {\n if (_columns != null) {\n store.setState({ columns: _columns });\n }\n }, [_columns]);\n\n // Kind of an awkward way to do this but we need to allow the selector to run\n const focusedColumns = useStore(store, (state) => state.focusedColumns);\n const _focusedLine = useStore(store, (state) => state.focusedLine);\n\n useEffect(() => {\n onSelectColumns?.(focusedColumns, _focusedLine);\n }, [focusedColumns, _focusedLine]);\n\n return h(CorrelationStoreContext.Provider, { value: store }, children);\n}\n\nexport function useCorrelationMapStore(\n selector: (state: CorrelationMapStore & ComputedStore) => any,\n) {\n const storeApi = useContext(CorrelationStoreContext);\n if (storeApi == null) {\n throw new Error(\"Missing CorrelationMapProvider\");\n }\n return useStore(storeApi, selector);\n}\n\nfunction buildCorrelationColumns(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): FocusedColumnGeoJSONRecord[] {\n if (columns == null || line == null || line.coordinates.length < 2) {\n return [];\n }\n return orderColumnsByDistance(\n computeIntersectingColumns(columns, line),\n line,\n );\n}\n\nfunction computeIntersectingColumns(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): ColumnGeoJSONRecord[] {\n if (columns == null || line == null) {\n return [];\n }\n\n /** eODP-focused process. Find buffers around line and then find columns intersecting that buffer */\n const bufferedLine = buffer(line, 1, { units: \"degrees\" });\n\n const nearbyPoints = columns.filter((col) => {\n if (col.geometry?.type != \"Point\") {\n return false;\n }\n return booleanPointInPolygon(col.geometry, bufferedLine);\n });\n\n const intersectingPolygons = columns.filter((col) => {\n const poly = col.geometry;\n\n // Some in-process datasets seem to have null geometries\n if (poly == null) return false;\n if (poly.type != \"Polygon\" && poly.type != \"MultiPolygon\") return false;\n\n const intersection = lineIntersect(line, poly);\n return intersection.features.length > 0;\n });\n\n return [...intersectingPolygons, ...nearbyPoints];\n}\n\ninterface FocusedColumnGeoJSONRecord extends ColumnGeoJSONRecord {\n properties: {\n centroid: Point;\n nearestPointOnLine: Point;\n distanceAlongLine: number;\n } & ColumnGeoJSONRecord[\"properties\"];\n}\n\nfunction orderColumnsByDistance(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): FocusedColumnGeoJSONRecord[] {\n const centroids = columns.map((col) => centroid(col.geometry));\n const projectedPoints = centroids.map((point) =>\n nearestPointOnLine(line, point),\n );\n const distances = projectedPoints.map((point) =>\n distance(point.geometry.coordinates, line.coordinates[0]),\n );\n\n let newColumns = columns.map((col, i) => {\n return {\n ...col,\n properties: {\n ...col.properties,\n centroid: centroids[i],\n nearestPointOnLine: projectedPoints[i],\n distanceAlongLine: distances[i],\n },\n };\n });\n\n return sorted(newColumns, (d) => d.properties.distanceAlongLine);\n}\n\nfunction sorted(data, accessor: (d) => number) {\n return data.sort((a, b) => accessor(a) - accessor(b));\n}\n"],"names":["createContext","createComputed","useState","create","useMacrostratColumns","useEffect","useStore","h","useContext","buffer","booleanPointInPolygon","lineIntersect","centroid","nearestPointOnLine","distance"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export interface CorrelationMapInput {
|
|
|
8
8
|
}
|
|
9
9
|
export interface CorrelationMapStore extends CorrelationMapInput {
|
|
10
10
|
onClickMap: (event: mapboxgl.MapMouseEvent, point: Point) => void;
|
|
11
|
+
projectID?: number;
|
|
11
12
|
}
|
|
12
13
|
export interface CorrelationProviderProps extends CorrelationMapInput {
|
|
13
14
|
projectID?: number;
|
|
@@ -6,7 +6,7 @@ import { centroid } from "@turf/centroid";
|
|
|
6
6
|
import { useState, useEffect, useContext, createContext } from "react";
|
|
7
7
|
import h from "@macrostrat/hyper";
|
|
8
8
|
import { createComputed } from "zustand-computed";
|
|
9
|
-
import { useMacrostratColumns } from "
|
|
9
|
+
import { useMacrostratColumns } from "@macrostrat/data-provider";
|
|
10
10
|
import { buffer } from "@turf/buffer";
|
|
11
11
|
import { booleanPointInPolygon } from "@turf/boolean-point-in-polygon";
|
|
12
12
|
const CorrelationStoreContext = createContext(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sources":["../../../src/maps/column-correlation/state.ts"],"sourcesContent":["import { LineString, Point } from \"geojson\";\nimport { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecord } from \"@macrostrat/api-types\";\n// Turf intersection\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport distance from \"@turf/distance\";\nimport { nearestPointOnLine } from \"@turf/nearest-point-on-line\";\nimport { centroid } from \"@turf/centroid\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { createComputed } from \"zustand-computed\";\nimport { useMacrostratColumns } from \"
|
|
1
|
+
{"version":3,"file":"state.js","sources":["../../../src/maps/column-correlation/state.ts"],"sourcesContent":["import { LineString, Point } from \"geojson\";\nimport { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecord } from \"@macrostrat/api-types\";\n// Turf intersection\nimport { lineIntersect } from \"@turf/line-intersect\";\nimport distance from \"@turf/distance\";\nimport { nearestPointOnLine } from \"@turf/nearest-point-on-line\";\nimport { centroid } from \"@turf/centroid\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport { createComputed } from \"zustand-computed\";\nimport { useMacrostratColumns } from \"@macrostrat/data-provider\";\nimport { buffer } from \"@turf/buffer\";\nimport { booleanPointInPolygon } from \"@turf/boolean-point-in-polygon\";\n\nexport interface CorrelationMapInput {\n columns: ColumnGeoJSONRecord[];\n focusedLine: LineString | null;\n}\n\nexport interface CorrelationMapStore extends CorrelationMapInput {\n onClickMap: (event: mapboxgl.MapMouseEvent, point: Point) => void;\n projectID?: number;\n}\n\nexport interface CorrelationProviderProps extends CorrelationMapInput {\n projectID?: number;\n inProcess?: boolean;\n columns: ColumnGeoJSONRecord[] | null;\n children: ReactNode;\n onSelectColumns?: (\n columns: FocusedColumnGeoJSONRecord[],\n line: LineString | null,\n ) => void;\n}\n\nconst CorrelationStoreContext =\n createContext<StoreApi<CorrelationMapStore> | null>(null);\n\ntype ComputedStore = {\n focusedColumns: FocusedColumnGeoJSONRecord[];\n};\n\n/** A computed store that will automatically update when the state changes */\nconst computed = createComputed((state: CorrelationMapStore): ComputedStore => {\n return {\n // We compute the focused columns based on columns and focusedLine\n focusedColumns: buildCorrelationColumns(state.columns, state.focusedLine),\n };\n}) as any;\n\nexport function ColumnCorrelationProvider({\n children,\n columns,\n projectID,\n inProcess,\n focusedLine,\n onSelectColumns,\n}: CorrelationProviderProps) {\n const [store] = useState(() => {\n return create<CorrelationMapStore & ComputedStore>(\n computed((set, get): CorrelationMapStore => {\n return {\n focusedLine,\n projectID,\n columns: null,\n onClickMap(event: mapboxgl.MapMouseEvent, point: Point) {\n const state = get();\n // Check if shift key is pressed\n const shiftKeyPressed = event.originalEvent.shiftKey;\n let existingCoords = state.focusedLine?.coordinates ?? [];\n\n if (existingCoords.length >= 2 && !shiftKeyPressed) {\n // Reset the line to zero length\n existingCoords = [];\n }\n set({\n focusedLine: {\n type: \"LineString\",\n coordinates: [...existingCoords, point.coordinates],\n },\n });\n },\n };\n }),\n );\n });\n\n // Set up the store\n /** TODO: move the fetching of all columns to within the map */\n const _columns = useMacrostratColumns(projectID, inProcess);\n useEffect(() => {\n if (_columns != null) {\n store.setState({ columns: _columns });\n }\n }, [_columns]);\n\n // Kind of an awkward way to do this but we need to allow the selector to run\n const focusedColumns = useStore(store, (state) => state.focusedColumns);\n const _focusedLine = useStore(store, (state) => state.focusedLine);\n\n useEffect(() => {\n onSelectColumns?.(focusedColumns, _focusedLine);\n }, [focusedColumns, _focusedLine]);\n\n return h(CorrelationStoreContext.Provider, { value: store }, children);\n}\n\nexport function useCorrelationMapStore(\n selector: (state: CorrelationMapStore & ComputedStore) => any,\n) {\n const storeApi = useContext(CorrelationStoreContext);\n if (storeApi == null) {\n throw new Error(\"Missing CorrelationMapProvider\");\n }\n return useStore(storeApi, selector);\n}\n\nfunction buildCorrelationColumns(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): FocusedColumnGeoJSONRecord[] {\n if (columns == null || line == null || line.coordinates.length < 2) {\n return [];\n }\n return orderColumnsByDistance(\n computeIntersectingColumns(columns, line),\n line,\n );\n}\n\nfunction computeIntersectingColumns(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): ColumnGeoJSONRecord[] {\n if (columns == null || line == null) {\n return [];\n }\n\n /** eODP-focused process. Find buffers around line and then find columns intersecting that buffer */\n const bufferedLine = buffer(line, 1, { units: \"degrees\" });\n\n const nearbyPoints = columns.filter((col) => {\n if (col.geometry?.type != \"Point\") {\n return false;\n }\n return booleanPointInPolygon(col.geometry, bufferedLine);\n });\n\n const intersectingPolygons = columns.filter((col) => {\n const poly = col.geometry;\n\n // Some in-process datasets seem to have null geometries\n if (poly == null) return false;\n if (poly.type != \"Polygon\" && poly.type != \"MultiPolygon\") return false;\n\n const intersection = lineIntersect(line, poly);\n return intersection.features.length > 0;\n });\n\n return [...intersectingPolygons, ...nearbyPoints];\n}\n\ninterface FocusedColumnGeoJSONRecord extends ColumnGeoJSONRecord {\n properties: {\n centroid: Point;\n nearestPointOnLine: Point;\n distanceAlongLine: number;\n } & ColumnGeoJSONRecord[\"properties\"];\n}\n\nfunction orderColumnsByDistance(\n columns: ColumnGeoJSONRecord[],\n line: LineString,\n): FocusedColumnGeoJSONRecord[] {\n const centroids = columns.map((col) => centroid(col.geometry));\n const projectedPoints = centroids.map((point) =>\n nearestPointOnLine(line, point),\n );\n const distances = projectedPoints.map((point) =>\n distance(point.geometry.coordinates, line.coordinates[0]),\n );\n\n let newColumns = columns.map((col, i) => {\n return {\n ...col,\n properties: {\n ...col.properties,\n centroid: centroids[i],\n nearestPointOnLine: projectedPoints[i],\n distanceAlongLine: distances[i],\n },\n };\n });\n\n return sorted(newColumns, (d) => d.properties.distanceAlongLine);\n}\n\nfunction sorted(data, accessor: (d) => number) {\n return data.sort((a, b) => accessor(a) - accessor(b));\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA0CA,MAAM,0BACJ,cAAoD,IAAI;AAO1D,MAAM,WAAW,eAAe,CAAC,UAA8C;AAC7E,SAAO;AAAA;AAAA,IAEL,gBAAgB,wBAAwB,MAAM,SAAS,MAAM,WAAW;AAAA,EAAA;AAE5E,CAAC;AAEM,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,CAAC,KAAK,IAAI,SAAS,MAAM;AAC7B,WAAO;AAAA,MACL,SAAS,CAAC,KAAK,QAA6B;AAC1C,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,WAAW,OAA+B,OAAc;AACtD,kBAAM,QAAQ,IAAA;AAEd,kBAAM,kBAAkB,MAAM,cAAc;AAC5C,gBAAI,iBAAiB,MAAM,aAAa,eAAe,CAAA;AAEvD,gBAAI,eAAe,UAAU,KAAK,CAAC,iBAAiB;AAElD,+BAAiB,CAAA;AAAA,YACnB;AACA,gBAAI;AAAA,cACF,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa,CAAC,GAAG,gBAAgB,MAAM,WAAW;AAAA,cAAA;AAAA,YACpD,CACD;AAAA,UACH;AAAA,QAAA;AAAA,MAEJ,CAAC;AAAA,IAAA;AAAA,EAEL,CAAC;AAID,QAAM,WAAW,qBAAqB,WAAW,SAAS;AAC1D,YAAU,MAAM;AACd,QAAI,YAAY,MAAM;AACpB,YAAM,SAAS,EAAE,SAAS,SAAA,CAAU;AAAA,IACtC;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,iBAAiB,SAAS,OAAO,CAAC,UAAU,MAAM,cAAc;AACtE,QAAM,eAAe,SAAS,OAAO,CAAC,UAAU,MAAM,WAAW;AAEjE,YAAU,MAAM;AACd,sBAAkB,gBAAgB,YAAY;AAAA,EAChD,GAAG,CAAC,gBAAgB,YAAY,CAAC;AAEjC,SAAO,EAAE,wBAAwB,UAAU,EAAE,OAAO,MAAA,GAAS,QAAQ;AACvE;AAEO,SAAS,uBACd,UACA;AACA,QAAM,WAAW,WAAW,uBAAuB;AACnD,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACA,SAAO,SAAS,UAAU,QAAQ;AACpC;AAEA,SAAS,wBACP,SACA,MAC8B;AAC9B,MAAI,WAAW,QAAQ,QAAQ,QAAQ,KAAK,YAAY,SAAS,GAAG;AAClE,WAAO,CAAA;AAAA,EACT;AACA,SAAO;AAAA,IACL,2BAA2B,SAAS,IAAI;AAAA,IACxC;AAAA,EAAA;AAEJ;AAEA,SAAS,2BACP,SACA,MACuB;AACvB,MAAI,WAAW,QAAQ,QAAQ,MAAM;AACnC,WAAO,CAAA;AAAA,EACT;AAGA,QAAM,eAAe,OAAO,MAAM,GAAG,EAAE,OAAO,WAAW;AAEzD,QAAM,eAAe,QAAQ,OAAO,CAAC,QAAQ;AAC3C,QAAI,IAAI,UAAU,QAAQ,SAAS;AACjC,aAAO;AAAA,IACT;AACA,WAAO,sBAAsB,IAAI,UAAU,YAAY;AAAA,EACzD,CAAC;AAED,QAAM,uBAAuB,QAAQ,OAAO,CAAC,QAAQ;AACnD,UAAM,OAAO,IAAI;AAGjB,QAAI,QAAQ,KAAM,QAAO;AACzB,QAAI,KAAK,QAAQ,aAAa,KAAK,QAAQ,eAAgB,QAAO;AAElE,UAAM,eAAe,cAAc,MAAM,IAAI;AAC7C,WAAO,aAAa,SAAS,SAAS;AAAA,EACxC,CAAC;AAED,SAAO,CAAC,GAAG,sBAAsB,GAAG,YAAY;AAClD;AAUA,SAAS,uBACP,SACA,MAC8B;AAC9B,QAAM,YAAY,QAAQ,IAAI,CAAC,QAAQ,SAAS,IAAI,QAAQ,CAAC;AAC7D,QAAM,kBAAkB,UAAU;AAAA,IAAI,CAAC,UACrC,mBAAmB,MAAM,KAAK;AAAA,EAAA;AAEhC,QAAM,YAAY,gBAAgB;AAAA,IAAI,CAAC,UACrC,SAAS,MAAM,SAAS,aAAa,KAAK,YAAY,CAAC,CAAC;AAAA,EAAA;AAG1D,MAAI,aAAa,QAAQ,IAAI,CAAC,KAAK,MAAM;AACvC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY;AAAA,QACV,GAAG,IAAI;AAAA,QACP,UAAU,UAAU,CAAC;AAAA,QACrB,oBAAoB,gBAAgB,CAAC;AAAA,QACrC,mBAAmB,UAAU,CAAC;AAAA,MAAA;AAAA,IAChC;AAAA,EAEJ,CAAC;AAED,SAAO,OAAO,YAAY,CAAC,MAAM,EAAE,WAAW,iBAAiB;AACjE;AAEA,SAAS,OAAO,MAAM,UAAyB;AAC7C,SAAO,KAAK,KAAK,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC;AACtD;"}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const zustand = require("zustand");
|
|
4
4
|
const React = require("react");
|
|
5
5
|
const h = require("@macrostrat/hyper");
|
|
6
|
-
const
|
|
6
|
+
const dataProvider = require("@macrostrat/data-provider");
|
|
7
7
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
8
8
|
const h__default = /* @__PURE__ */ _interopDefault(h);
|
|
9
9
|
const NavigationStoreContext = React.createContext(
|
|
@@ -19,7 +19,7 @@ function ColumnNavigationProvider({
|
|
|
19
19
|
onSelectColumn,
|
|
20
20
|
onHoverColumn
|
|
21
21
|
}) {
|
|
22
|
-
|
|
22
|
+
dataProvider.useMacrostratStore((s) => s.getColumns);
|
|
23
23
|
const [store] = React.useState(() => {
|
|
24
24
|
return zustand.create((set, get) => {
|
|
25
25
|
return {
|
|
@@ -41,7 +41,7 @@ function ColumnNavigationProvider({
|
|
|
41
41
|
};
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
|
-
let _columns = columns ??
|
|
44
|
+
let _columns = columns ?? dataProvider.useMacrostratColumns(projectID, inProcess);
|
|
45
45
|
if (columnIDs?.length > 0) {
|
|
46
46
|
_columns = React.useMemo(() => {
|
|
47
47
|
return _columns?.filter((d) => columnIDs.includes(d.properties.col_id));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.cjs","sources":["../../../../src/maps/column-navigation/mapbox/state.ts"],"sourcesContent":["import { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecordWithID } from \"@macrostrat/api-types\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n useMemo,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n useMacrostratColumns,\n useMacrostratStore,\n} from \"
|
|
1
|
+
{"version":3,"file":"state.cjs","sources":["../../../../src/maps/column-navigation/mapbox/state.ts"],"sourcesContent":["import { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecordWithID } from \"@macrostrat/api-types\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n useMemo,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n useMacrostratColumns,\n useMacrostratStore,\n} from \"@macrostrat/data-provider\";\n\nexport interface NavigationStore {\n columns: ColumnGeoJSONRecordWithID[];\n selectedColumn: number | null;\n hoveredColumn: number | null;\n selectColumn: (columnID: number | null) => void;\n setHoveredColumn: (columnID: number | null) => void;\n}\n\nexport interface NavigationProviderProps {\n projectID?: number;\n inProcess?: boolean;\n selectedColumn?: number | null;\n hoveredColumn?: number | null;\n columns?: ColumnGeoJSONRecordWithID[] | null;\n columnIDs?: number[] | null;\n children: ReactNode;\n onSelectColumn?: (col_id: number | null, column: any) => void;\n onHoverColumn?: (col_id: number | null, column: any) => void;\n}\n\nconst NavigationStoreContext = createContext<StoreApi<NavigationStore> | null>(\n null,\n);\n\nexport function ColumnNavigationProvider({\n children,\n columns,\n columnIDs,\n selectedColumn,\n projectID,\n inProcess,\n onSelectColumn,\n onHoverColumn,\n}: NavigationProviderProps) {\n const getColumns = useMacrostratStore((s) => s.getColumns);\n\n const [store] = useState(() => {\n return create<NavigationStore>((set, get): NavigationStore => {\n return {\n columns: null,\n selectedColumn: null,\n hoveredColumn: null,\n selectColumn(columnID: number | null) {\n set({ selectedColumn: columnID, hoveredColumn: null });\n const { columns } = get();\n const column = columns?.find((d) => d.id == columnID);\n onSelectColumn?.(columnID, column);\n },\n setHoveredColumn(columnID: number | null) {\n set({ hoveredColumn: columnID });\n const { columns } = get();\n const column = columns?.find((d) => d.id == columnID);\n onHoverColumn?.(columnID, column);\n },\n };\n });\n });\n\n // Set up the store\n /** TODO: unify handling of columns between parts of application */\n // useAsyncEffect(async () => {\n // let _columns = columns ?? (await getColumns(projectID, inProcess));\n // store.setState({ columns: _columns, selectedColumn });\n // }, [projectID, inProcess, columns, getColumns]);\n\n let _columns = columns ?? useMacrostratColumns(projectID, inProcess);\n\n // filter columns if specified\n if (columnIDs?.length > 0) {\n _columns = useMemo(() => {\n return _columns?.filter((d) => columnIDs.includes(d.properties.col_id));\n }, [columnIDs, _columns]);\n }\n\n useEffect(() => {\n if (_columns?.length > 0) {\n store.setState({ columns: _columns, selectedColumn });\n }\n }, [_columns]);\n // Update selected column if it is changed externally\n\n // Kind of an awkward way to do this but we need to allow the selector to run\n useEffect(() => {\n const { selectColumn, selectedColumn: _internalSelectedColumn } =\n store.getState();\n if (selectedColumn == _internalSelectedColumn) {\n return;\n }\n selectColumn(selectedColumn);\n }, [selectedColumn]);\n\n return h(NavigationStoreContext.Provider, { value: store }, children);\n}\n\nexport function useColumnNavigationStore(\n selector: (state: NavigationStore) => any,\n) {\n const storeApi = useContext(NavigationStoreContext);\n if (storeApi == null) {\n throw new Error(\"Missing ColumnNavigationProvider\");\n }\n return useStore(storeApi, selector);\n}\n"],"names":["createContext","useMacrostratStore","useState","create","columns","useMacrostratColumns","useMemo","useEffect","h","useContext","useStore"],"mappings":";;;;;;;;AAoCA,MAAM,yBAAyBA,MAAAA;AAAAA,EAC7B;AACF;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AACPC,kCAAmB,CAAC,MAAM,EAAE,UAAU;AAEzD,QAAM,CAAC,KAAK,IAAIC,MAAAA,SAAS,MAAM;AAC7B,WAAOC,QAAAA,OAAwB,CAAC,KAAK,QAAyB;AAC5D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,aAAa,UAAyB;AACpC,cAAI,EAAE,gBAAgB,UAAU,eAAe,MAAM;AACrD,gBAAM,EAAE,SAAAC,SAAAA,IAAY,IAAA;AACpB,gBAAM,SAASA,UAAS,KAAK,CAAC,MAAM,EAAE,MAAM,QAAQ;AACpD,2BAAiB,UAAU,MAAM;AAAA,QACnC;AAAA,QACA,iBAAiB,UAAyB;AACxC,cAAI,EAAE,eAAe,UAAU;AAC/B,gBAAM,EAAE,SAAAA,SAAAA,IAAY,IAAA;AACpB,gBAAM,SAASA,UAAS,KAAK,CAAC,MAAM,EAAE,MAAM,QAAQ;AACpD,0BAAgB,UAAU,MAAM;AAAA,QAClC;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EACH,CAAC;AASD,MAAI,WAAW,WAAWC,kCAAqB,WAAW,SAAS;AAGnE,MAAI,WAAW,SAAS,GAAG;AACzB,eAAWC,MAAAA,QAAQ,MAAM;AACvB,aAAO,UAAU,OAAO,CAAC,MAAM,UAAU,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,IACxE,GAAG,CAAC,WAAW,QAAQ,CAAC;AAAA,EAC1B;AAEAC,QAAAA,UAAU,MAAM;AACd,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,SAAS,EAAE,SAAS,UAAU,gBAAgB;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAIbA,QAAAA,UAAU,MAAM;AACd,UAAM,EAAE,cAAc,gBAAgB,wBAAA,IACpC,MAAM,SAAA;AACR,QAAI,kBAAkB,yBAAyB;AAC7C;AAAA,IACF;AACA,iBAAa,cAAc;AAAA,EAC7B,GAAG,CAAC,cAAc,CAAC;AAEnB,SAAOC,WAAAA,QAAE,uBAAuB,UAAU,EAAE,OAAO,MAAA,GAAS,QAAQ;AACtE;AAEO,SAAS,yBACd,UACA;AACA,QAAM,WAAWC,MAAAA,WAAW,sBAAsB;AAClD,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACA,SAAOC,QAAAA,SAAS,UAAU,QAAQ;AACpC;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { create, useStore } from "zustand";
|
|
2
2
|
import { useState, useMemo, useEffect, createContext, useContext } from "react";
|
|
3
3
|
import h from "@macrostrat/hyper";
|
|
4
|
-
import { useMacrostratStore, useMacrostratColumns } from "
|
|
4
|
+
import { useMacrostratStore, useMacrostratColumns } from "@macrostrat/data-provider";
|
|
5
5
|
const NavigationStoreContext = createContext(
|
|
6
6
|
null
|
|
7
7
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sources":["../../../../src/maps/column-navigation/mapbox/state.ts"],"sourcesContent":["import { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecordWithID } from \"@macrostrat/api-types\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n useMemo,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n useMacrostratColumns,\n useMacrostratStore,\n} from \"
|
|
1
|
+
{"version":3,"file":"state.js","sources":["../../../../src/maps/column-navigation/mapbox/state.ts"],"sourcesContent":["import { create, StoreApi, useStore } from \"zustand\";\nimport type { ColumnGeoJSONRecordWithID } from \"@macrostrat/api-types\";\nimport {\n createContext,\n useState,\n useContext,\n ReactNode,\n useEffect,\n useMemo,\n} from \"react\";\nimport h from \"@macrostrat/hyper\";\nimport {\n useMacrostratColumns,\n useMacrostratStore,\n} from \"@macrostrat/data-provider\";\n\nexport interface NavigationStore {\n columns: ColumnGeoJSONRecordWithID[];\n selectedColumn: number | null;\n hoveredColumn: number | null;\n selectColumn: (columnID: number | null) => void;\n setHoveredColumn: (columnID: number | null) => void;\n}\n\nexport interface NavigationProviderProps {\n projectID?: number;\n inProcess?: boolean;\n selectedColumn?: number | null;\n hoveredColumn?: number | null;\n columns?: ColumnGeoJSONRecordWithID[] | null;\n columnIDs?: number[] | null;\n children: ReactNode;\n onSelectColumn?: (col_id: number | null, column: any) => void;\n onHoverColumn?: (col_id: number | null, column: any) => void;\n}\n\nconst NavigationStoreContext = createContext<StoreApi<NavigationStore> | null>(\n null,\n);\n\nexport function ColumnNavigationProvider({\n children,\n columns,\n columnIDs,\n selectedColumn,\n projectID,\n inProcess,\n onSelectColumn,\n onHoverColumn,\n}: NavigationProviderProps) {\n const getColumns = useMacrostratStore((s) => s.getColumns);\n\n const [store] = useState(() => {\n return create<NavigationStore>((set, get): NavigationStore => {\n return {\n columns: null,\n selectedColumn: null,\n hoveredColumn: null,\n selectColumn(columnID: number | null) {\n set({ selectedColumn: columnID, hoveredColumn: null });\n const { columns } = get();\n const column = columns?.find((d) => d.id == columnID);\n onSelectColumn?.(columnID, column);\n },\n setHoveredColumn(columnID: number | null) {\n set({ hoveredColumn: columnID });\n const { columns } = get();\n const column = columns?.find((d) => d.id == columnID);\n onHoverColumn?.(columnID, column);\n },\n };\n });\n });\n\n // Set up the store\n /** TODO: unify handling of columns between parts of application */\n // useAsyncEffect(async () => {\n // let _columns = columns ?? (await getColumns(projectID, inProcess));\n // store.setState({ columns: _columns, selectedColumn });\n // }, [projectID, inProcess, columns, getColumns]);\n\n let _columns = columns ?? useMacrostratColumns(projectID, inProcess);\n\n // filter columns if specified\n if (columnIDs?.length > 0) {\n _columns = useMemo(() => {\n return _columns?.filter((d) => columnIDs.includes(d.properties.col_id));\n }, [columnIDs, _columns]);\n }\n\n useEffect(() => {\n if (_columns?.length > 0) {\n store.setState({ columns: _columns, selectedColumn });\n }\n }, [_columns]);\n // Update selected column if it is changed externally\n\n // Kind of an awkward way to do this but we need to allow the selector to run\n useEffect(() => {\n const { selectColumn, selectedColumn: _internalSelectedColumn } =\n store.getState();\n if (selectedColumn == _internalSelectedColumn) {\n return;\n }\n selectColumn(selectedColumn);\n }, [selectedColumn]);\n\n return h(NavigationStoreContext.Provider, { value: store }, children);\n}\n\nexport function useColumnNavigationStore(\n selector: (state: NavigationStore) => any,\n) {\n const storeApi = useContext(NavigationStoreContext);\n if (storeApi == null) {\n throw new Error(\"Missing ColumnNavigationProvider\");\n }\n return useStore(storeApi, selector);\n}\n"],"names":["columns"],"mappings":";;;;AAoCA,MAAM,yBAAyB;AAAA,EAC7B;AACF;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AACP,qBAAmB,CAAC,MAAM,EAAE,UAAU;AAEzD,QAAM,CAAC,KAAK,IAAI,SAAS,MAAM;AAC7B,WAAO,OAAwB,CAAC,KAAK,QAAyB;AAC5D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,aAAa,UAAyB;AACpC,cAAI,EAAE,gBAAgB,UAAU,eAAe,MAAM;AACrD,gBAAM,EAAE,SAAAA,SAAAA,IAAY,IAAA;AACpB,gBAAM,SAASA,UAAS,KAAK,CAAC,MAAM,EAAE,MAAM,QAAQ;AACpD,2BAAiB,UAAU,MAAM;AAAA,QACnC;AAAA,QACA,iBAAiB,UAAyB;AACxC,cAAI,EAAE,eAAe,UAAU;AAC/B,gBAAM,EAAE,SAAAA,SAAAA,IAAY,IAAA;AACpB,gBAAM,SAASA,UAAS,KAAK,CAAC,MAAM,EAAE,MAAM,QAAQ;AACpD,0BAAgB,UAAU,MAAM;AAAA,QAClC;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EACH,CAAC;AASD,MAAI,WAAW,WAAW,qBAAqB,WAAW,SAAS;AAGnE,MAAI,WAAW,SAAS,GAAG;AACzB,eAAW,QAAQ,MAAM;AACvB,aAAO,UAAU,OAAO,CAAC,MAAM,UAAU,SAAS,EAAE,WAAW,MAAM,CAAC;AAAA,IACxE,GAAG,CAAC,WAAW,QAAQ,CAAC;AAAA,EAC1B;AAEA,YAAU,MAAM;AACd,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,SAAS,EAAE,SAAS,UAAU,gBAAgB;AAAA,IACtD;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAIb,YAAU,MAAM;AACd,UAAM,EAAE,cAAc,gBAAgB,wBAAA,IACpC,MAAM,SAAA;AACR,QAAI,kBAAkB,yBAAyB;AAC7C;AAAA,IACF;AACA,iBAAa,cAAc;AAAA,EAC7B,GAAG,CAAC,cAAc,CAAC;AAEnB,SAAO,EAAE,uBAAuB,UAAU,EAAE,OAAO,MAAA,GAAS,QAAQ;AACtE;AAEO,SAAS,yBACd,UACA;AACA,QAAM,WAAW,WAAW,sBAAsB;AAClD,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACA,SAAO,SAAS,UAAU,QAAQ;AACpC;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const dataProvider = require("@macrostrat/data-provider");
|
|
4
|
+
const uiComponents = require("@macrostrat/ui-components");
|
|
5
|
+
function useColumnFeatures({
|
|
6
|
+
status_code,
|
|
7
|
+
project_id,
|
|
8
|
+
format = "geojson"
|
|
9
|
+
}) {
|
|
10
|
+
const fetch = dataProvider.useMacrostratFetch();
|
|
11
|
+
let statusCode = ["active"];
|
|
12
|
+
if (status_code == "in process") {
|
|
13
|
+
statusCode.push("in process");
|
|
14
|
+
}
|
|
15
|
+
return uiComponents.useAsyncMemo(async () => {
|
|
16
|
+
return await dataProvider.fetchAllColumns({
|
|
17
|
+
projectID: project_id,
|
|
18
|
+
statusCode,
|
|
19
|
+
format,
|
|
20
|
+
fetch
|
|
21
|
+
});
|
|
22
|
+
}, [project_id, status_code, format]);
|
|
23
|
+
}
|
|
24
|
+
exports.useColumnFeatures = useColumnFeatures;
|
|
25
|
+
//# sourceMappingURL=data-fetcher.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-fetcher.cjs","sources":["../../../../src/maps/column-navigation/svg/data-fetcher.ts"],"sourcesContent":["import {\n ColumnStatusCode,\n fetchAllColumns,\n useMacrostratFetch,\n} from \"@macrostrat/data-provider\";\nimport { useAsyncMemo } from \"@macrostrat/ui-components\";\n\nexport function useColumnFeatures({\n status_code,\n project_id,\n format = \"geojson\",\n}: {\n apiRoute?: string;\n status_code?: string;\n project_id?: number;\n format?: \"geojson\" | \"topojson\" | \"geojson_bare\";\n}) {\n /** Legacy fetcher for column features */\n const fetch = useMacrostratFetch();\n\n let statusCode: ColumnStatusCode[] = [\"active\"];\n if (status_code == \"in process\") {\n statusCode.push(\"in process\");\n }\n\n return useAsyncMemo(async () => {\n return await fetchAllColumns({\n projectID: project_id,\n statusCode: statusCode,\n format,\n fetch,\n });\n }, [project_id, status_code, format]);\n}\n"],"names":["useMacrostratFetch","useAsyncMemo","fetchAllColumns"],"mappings":";;;;AAOO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAKG;AAED,QAAM,QAAQA,aAAAA,mBAAA;AAEd,MAAI,aAAiC,CAAC,QAAQ;AAC9C,MAAI,eAAe,cAAc;AAC/B,eAAW,KAAK,YAAY;AAAA,EAC9B;AAEA,SAAOC,aAAAA,aAAa,YAAY;AAC9B,WAAO,MAAMC,aAAAA,gBAAgB;AAAA,MAC3B,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH,GAAG,CAAC,YAAY,aAAa,MAAM,CAAC;AACtC;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useMacrostratFetch, fetchAllColumns } from "@macrostrat/data-provider";
|
|
2
|
+
import { useAsyncMemo } from "@macrostrat/ui-components";
|
|
3
|
+
function useColumnFeatures({
|
|
4
|
+
status_code,
|
|
5
|
+
project_id,
|
|
6
|
+
format = "geojson"
|
|
7
|
+
}) {
|
|
8
|
+
const fetch = useMacrostratFetch();
|
|
9
|
+
let statusCode = ["active"];
|
|
10
|
+
if (status_code == "in process") {
|
|
11
|
+
statusCode.push("in process");
|
|
12
|
+
}
|
|
13
|
+
return useAsyncMemo(async () => {
|
|
14
|
+
return await fetchAllColumns({
|
|
15
|
+
projectID: project_id,
|
|
16
|
+
statusCode,
|
|
17
|
+
format,
|
|
18
|
+
fetch
|
|
19
|
+
});
|
|
20
|
+
}, [project_id, status_code, format]);
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
useColumnFeatures
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=data-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-fetcher.js","sources":["../../../../src/maps/column-navigation/svg/data-fetcher.ts"],"sourcesContent":["import {\n ColumnStatusCode,\n fetchAllColumns,\n useMacrostratFetch,\n} from \"@macrostrat/data-provider\";\nimport { useAsyncMemo } from \"@macrostrat/ui-components\";\n\nexport function useColumnFeatures({\n status_code,\n project_id,\n format = \"geojson\",\n}: {\n apiRoute?: string;\n status_code?: string;\n project_id?: number;\n format?: \"geojson\" | \"topojson\" | \"geojson_bare\";\n}) {\n /** Legacy fetcher for column features */\n const fetch = useMacrostratFetch();\n\n let statusCode: ColumnStatusCode[] = [\"active\"];\n if (status_code == \"in process\") {\n statusCode.push(\"in process\");\n }\n\n return useAsyncMemo(async () => {\n return await fetchAllColumns({\n projectID: project_id,\n statusCode: statusCode,\n format,\n fetch,\n });\n }, [project_id, status_code, format]);\n}\n"],"names":[],"mappings":";;AAOO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAKG;AAED,QAAM,QAAQ,mBAAA;AAEd,MAAI,aAAiC,CAAC,QAAQ;AAC9C,MAAI,eAAe,cAAc;AAC/B,eAAW,KAAK,YAAY;AAAA,EAC9B;AAEA,SAAO,aAAa,YAAY;AAC9B,WAAO,MAAM,gBAAgB;AAAA,MAC3B,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH,GAAG,CAAC,YAAY,aAAa,MAAM,CAAC;AACtC;"}
|
|
@@ -5,8 +5,8 @@ const svgMapComponents = require("@macrostrat/svg-map-components");
|
|
|
5
5
|
const uiComponents = require("@macrostrat/ui-components");
|
|
6
6
|
const chroma = require("chroma-js");
|
|
7
7
|
const React = require("react");
|
|
8
|
+
const dataFetcher = require("./data-fetcher.cjs");
|
|
8
9
|
const keyboardNavigation = require("../utils/keyboard-navigation.cjs");
|
|
9
|
-
const fetch = require("../../../data-provider/fetch.cjs");
|
|
10
10
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
11
11
|
const h__default = /* @__PURE__ */ _interopDefault(h);
|
|
12
12
|
const chroma__default = /* @__PURE__ */ _interopDefault(chroma);
|
|
@@ -133,8 +133,7 @@ const Columns = (props) => {
|
|
|
133
133
|
showDebugLayers = false,
|
|
134
134
|
format = "topojson"
|
|
135
135
|
} = props;
|
|
136
|
-
let features =
|
|
137
|
-
apiRoute,
|
|
136
|
+
let features = dataFetcher.useColumnFeatures({
|
|
138
137
|
status_code,
|
|
139
138
|
project_id,
|
|
140
139
|
format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layers.cjs","sources":["../../../../src/maps/column-navigation/svg/layers.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n Feature,\n FeatureLayer,\n MapContext,\n} from \"@macrostrat/svg-map-components\";\nimport { useAPIResult, useKeyHandler } from \"@macrostrat/ui-components\";\nimport chroma from \"chroma-js\";\nimport { ExtendedFeature } from \"d3-geo\";\nimport { Polygon } from \"geojson\";\nimport { useContext, useMemo } from \"react\";\nimport { useColumnFeatures } from \"
|
|
1
|
+
{"version":3,"file":"layers.cjs","sources":["../../../../src/maps/column-navigation/svg/layers.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n Feature,\n FeatureLayer,\n MapContext,\n} from \"@macrostrat/svg-map-components\";\nimport { useAPIResult, useKeyHandler } from \"@macrostrat/ui-components\";\nimport chroma from \"chroma-js\";\nimport { ExtendedFeature } from \"d3-geo\";\nimport { Polygon } from \"geojson\";\nimport { useContext, useMemo } from \"react\";\nimport { useColumnFeatures } from \"./data-fetcher\";\nimport {\n buildKeyMapping,\n buildTriangulation,\n} from \"../utils/keyboard-navigation\";\n\nconst defaultStyle = {\n fill: \"rgb(239, 180, 249)\",\n stroke: \"magenta\",\n};\n\nexport function MeasurementsLayer(props) {\n const { style = defaultStyle, ...params } = props;\n const res: any = useAPIResult(\"/measurements\", {\n ...params,\n format: \"geojson\",\n response: \"light\",\n });\n if (res == null) return null;\n\n return h(FeatureLayer, {\n useCanvas: false,\n style,\n features: res.features?.filter((d) => d.properties.unit_id != null) ?? [],\n });\n}\n\ntype ColumnProps = { col_id: number };\n\ntype ColumnFeature = ExtendedFeature<Polygon, ColumnProps>;\n\nfunction ColumnFeatures(props) {\n const {\n features,\n onClick,\n color = \"rgba(150,150,150, 1)\",\n singleFeature = true,\n } = props;\n\n const c = chroma(color);\n\n return h(\n FeatureLayer,\n {\n className: \"columns\",\n useCanvas: onClick == null,\n style: {\n fill: c.alpha(0.2).css(),\n stroke: c.alpha(0.4).css(),\n },\n },\n features?.map((f) => {\n return h(Feature, {\n id: f.id ?? f.properties.col_id,\n onClick,\n feature: f,\n });\n }),\n );\n}\n\nenum MacrostratStatusCode {\n InProcess = \"in process\",\n}\n\ninterface ColumnNavProps {\n col_id: number;\n status_code?: MacrostratStatusCode;\n project_id?: number;\n onChange(col_id: number): void;\n}\n\ninterface KeyboardNavProps extends ColumnNavProps {\n features: ColumnFeature[];\n showLayers: boolean;\n}\n\nfunction ColumnKeyboardNavigation(props: KeyboardNavProps) {\n /** Keyboard navigation of columns using a Delaunay triangulation */\n const {\n features = [],\n col_id = null,\n onChange,\n showLayers = false,\n ...projectArgs\n } = props;\n const { projection } = useContext(MapContext);\n const { centroids, tri } = useMemo(\n () => buildTriangulation(features),\n [features],\n );\n\n const currentIndex = useMemo(() => {\n return features.findIndex((d) => d.properties.col_id == col_id);\n }, [features, col_id]);\n\n const neighbors = tri.delaunay.neighbors[currentIndex];\n\n const keyMapping = useMemo(() => {\n return buildKeyMapping(neighbors, centroids, currentIndex, projection);\n }, [neighbors, currentIndex]);\n\n useKeyHandler(\n (event) => {\n const nextColumnIx = keyMapping[event.keyCode];\n if (nextColumnIx == null) return;\n // @ts-ignore\n onChange(features[nextColumnIx]);\n },\n [keyMapping],\n );\n\n if (neighbors == null) return null;\n const neighborFeatures = neighbors.map((d) => features[d]);\n\n return h.if(showLayers)([\n h(FeatureLayer, {\n features: tri.links().features,\n useCanvas: false,\n style: {\n stroke: \"purple\",\n fill: \"transparent\",\n },\n }),\n h(FeatureLayer, {\n features: neighborFeatures,\n useCanvas: false,\n style: {\n stroke: \"rgb(93, 101, 212)\",\n strokeWidth: 3,\n fill: \"rgba(93, 101, 212, 0.5)\",\n },\n }),\n h(FeatureLayer, {\n features: [\n {\n type: \"Feature\",\n geometry: {\n type: \"MultiPoint\",\n coordinates: centroids,\n },\n },\n ],\n useCanvas: false,\n style: {\n r: 1,\n fill: \"purple\",\n },\n }),\n ]);\n}\n\ninterface ColumnExtraInfo {\n apiRoute?: string;\n color?: string;\n filterColumns?(d: ColumnFeature): boolean;\n showDebugLayers?: boolean;\n format?: \"topojson\" | \"geojson\";\n}\n\nconst Columns = (props: ColumnNavProps & ColumnExtraInfo) => {\n const {\n apiRoute = \"/columns\",\n onChange,\n col_id = null,\n status_code,\n project_id,\n color,\n filterColumns,\n showDebugLayers = false,\n format = \"topojson\",\n } = props;\n\n let features: any[] = useColumnFeatures({\n apiRoute,\n status_code,\n project_id,\n format,\n }) as any;\n\n if (features == null) return null;\n\n if (filterColumns != null) {\n features = features.filter(filterColumns);\n }\n\n return h([\n h(ColumnKeyboardNavigation, {\n features,\n col_id,\n onChange,\n status_code,\n project_id,\n showLayers: showDebugLayers,\n }),\n h(ColumnFeatures, { features, onClick: onChange, color }),\n ]);\n};\n\nconst ColumnCenters = (props: ColumnNavProps) => {\n return h(Columns, { apiRoute: \"/defs/columns\", ...props });\n};\n\nconst CurrentColumn = (props) => {\n const { feature } = props;\n return h(FeatureLayer, {\n features: [feature],\n style: {\n fill: \"rgba(255,0,0,0.4)\",\n stroke: \"rgba(255,0,0,0.6)\",\n strokeWidth: 2,\n },\n });\n};\n\nexport {\n Columns,\n CurrentColumn,\n ColumnCenters,\n ColumnFeatures,\n ColumnKeyboardNavigation,\n};\n"],"names":["useAPIResult","h","FeatureLayer","chroma","Feature","useContext","MapContext","useMemo","buildTriangulation","buildKeyMapping","useKeyHandler","useColumnFeatures"],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { FeatureLayer, Feature, MapContext } from "@macrostrat/svg-map-component
|
|
|
3
3
|
import { useKeyHandler, useAPIResult } from "@macrostrat/ui-components";
|
|
4
4
|
import chroma from "chroma-js";
|
|
5
5
|
import { useContext, useMemo } from "react";
|
|
6
|
+
import { useColumnFeatures } from "./data-fetcher.js";
|
|
6
7
|
import { buildTriangulation, buildKeyMapping } from "../utils/keyboard-navigation.js";
|
|
7
|
-
import { useColumnFeatures } from "../../../data-provider/fetch.js";
|
|
8
8
|
const defaultStyle = {
|
|
9
9
|
fill: "rgb(239, 180, 249)",
|
|
10
10
|
stroke: "magenta"
|
|
@@ -129,7 +129,6 @@ const Columns = (props) => {
|
|
|
129
129
|
format = "topojson"
|
|
130
130
|
} = props;
|
|
131
131
|
let features = useColumnFeatures({
|
|
132
|
-
apiRoute,
|
|
133
132
|
status_code,
|
|
134
133
|
project_id,
|
|
135
134
|
format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layers.js","sources":["../../../../src/maps/column-navigation/svg/layers.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n Feature,\n FeatureLayer,\n MapContext,\n} from \"@macrostrat/svg-map-components\";\nimport { useAPIResult, useKeyHandler } from \"@macrostrat/ui-components\";\nimport chroma from \"chroma-js\";\nimport { ExtendedFeature } from \"d3-geo\";\nimport { Polygon } from \"geojson\";\nimport { useContext, useMemo } from \"react\";\nimport { useColumnFeatures } from \"
|
|
1
|
+
{"version":3,"file":"layers.js","sources":["../../../../src/maps/column-navigation/svg/layers.ts"],"sourcesContent":["import h from \"@macrostrat/hyper\";\nimport {\n Feature,\n FeatureLayer,\n MapContext,\n} from \"@macrostrat/svg-map-components\";\nimport { useAPIResult, useKeyHandler } from \"@macrostrat/ui-components\";\nimport chroma from \"chroma-js\";\nimport { ExtendedFeature } from \"d3-geo\";\nimport { Polygon } from \"geojson\";\nimport { useContext, useMemo } from \"react\";\nimport { useColumnFeatures } from \"./data-fetcher\";\nimport {\n buildKeyMapping,\n buildTriangulation,\n} from \"../utils/keyboard-navigation\";\n\nconst defaultStyle = {\n fill: \"rgb(239, 180, 249)\",\n stroke: \"magenta\",\n};\n\nexport function MeasurementsLayer(props) {\n const { style = defaultStyle, ...params } = props;\n const res: any = useAPIResult(\"/measurements\", {\n ...params,\n format: \"geojson\",\n response: \"light\",\n });\n if (res == null) return null;\n\n return h(FeatureLayer, {\n useCanvas: false,\n style,\n features: res.features?.filter((d) => d.properties.unit_id != null) ?? [],\n });\n}\n\ntype ColumnProps = { col_id: number };\n\ntype ColumnFeature = ExtendedFeature<Polygon, ColumnProps>;\n\nfunction ColumnFeatures(props) {\n const {\n features,\n onClick,\n color = \"rgba(150,150,150, 1)\",\n singleFeature = true,\n } = props;\n\n const c = chroma(color);\n\n return h(\n FeatureLayer,\n {\n className: \"columns\",\n useCanvas: onClick == null,\n style: {\n fill: c.alpha(0.2).css(),\n stroke: c.alpha(0.4).css(),\n },\n },\n features?.map((f) => {\n return h(Feature, {\n id: f.id ?? f.properties.col_id,\n onClick,\n feature: f,\n });\n }),\n );\n}\n\nenum MacrostratStatusCode {\n InProcess = \"in process\",\n}\n\ninterface ColumnNavProps {\n col_id: number;\n status_code?: MacrostratStatusCode;\n project_id?: number;\n onChange(col_id: number): void;\n}\n\ninterface KeyboardNavProps extends ColumnNavProps {\n features: ColumnFeature[];\n showLayers: boolean;\n}\n\nfunction ColumnKeyboardNavigation(props: KeyboardNavProps) {\n /** Keyboard navigation of columns using a Delaunay triangulation */\n const {\n features = [],\n col_id = null,\n onChange,\n showLayers = false,\n ...projectArgs\n } = props;\n const { projection } = useContext(MapContext);\n const { centroids, tri } = useMemo(\n () => buildTriangulation(features),\n [features],\n );\n\n const currentIndex = useMemo(() => {\n return features.findIndex((d) => d.properties.col_id == col_id);\n }, [features, col_id]);\n\n const neighbors = tri.delaunay.neighbors[currentIndex];\n\n const keyMapping = useMemo(() => {\n return buildKeyMapping(neighbors, centroids, currentIndex, projection);\n }, [neighbors, currentIndex]);\n\n useKeyHandler(\n (event) => {\n const nextColumnIx = keyMapping[event.keyCode];\n if (nextColumnIx == null) return;\n // @ts-ignore\n onChange(features[nextColumnIx]);\n },\n [keyMapping],\n );\n\n if (neighbors == null) return null;\n const neighborFeatures = neighbors.map((d) => features[d]);\n\n return h.if(showLayers)([\n h(FeatureLayer, {\n features: tri.links().features,\n useCanvas: false,\n style: {\n stroke: \"purple\",\n fill: \"transparent\",\n },\n }),\n h(FeatureLayer, {\n features: neighborFeatures,\n useCanvas: false,\n style: {\n stroke: \"rgb(93, 101, 212)\",\n strokeWidth: 3,\n fill: \"rgba(93, 101, 212, 0.5)\",\n },\n }),\n h(FeatureLayer, {\n features: [\n {\n type: \"Feature\",\n geometry: {\n type: \"MultiPoint\",\n coordinates: centroids,\n },\n },\n ],\n useCanvas: false,\n style: {\n r: 1,\n fill: \"purple\",\n },\n }),\n ]);\n}\n\ninterface ColumnExtraInfo {\n apiRoute?: string;\n color?: string;\n filterColumns?(d: ColumnFeature): boolean;\n showDebugLayers?: boolean;\n format?: \"topojson\" | \"geojson\";\n}\n\nconst Columns = (props: ColumnNavProps & ColumnExtraInfo) => {\n const {\n apiRoute = \"/columns\",\n onChange,\n col_id = null,\n status_code,\n project_id,\n color,\n filterColumns,\n showDebugLayers = false,\n format = \"topojson\",\n } = props;\n\n let features: any[] = useColumnFeatures({\n apiRoute,\n status_code,\n project_id,\n format,\n }) as any;\n\n if (features == null) return null;\n\n if (filterColumns != null) {\n features = features.filter(filterColumns);\n }\n\n return h([\n h(ColumnKeyboardNavigation, {\n features,\n col_id,\n onChange,\n status_code,\n project_id,\n showLayers: showDebugLayers,\n }),\n h(ColumnFeatures, { features, onClick: onChange, color }),\n ]);\n};\n\nconst ColumnCenters = (props: ColumnNavProps) => {\n return h(Columns, { apiRoute: \"/defs/columns\", ...props });\n};\n\nconst CurrentColumn = (props) => {\n const { feature } = props;\n return h(FeatureLayer, {\n features: [feature],\n style: {\n fill: \"rgba(255,0,0,0.4)\",\n stroke: \"rgba(255,0,0,0.6)\",\n strokeWidth: 2,\n },\n });\n};\n\nexport {\n Columns,\n CurrentColumn,\n ColumnCenters,\n ColumnFeatures,\n ColumnKeyboardNavigation,\n};\n"],"names":[],"mappings":"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"}
|
package/dist/section.cjs
CHANGED
|
@@ -5,10 +5,10 @@ const timescale = require("@macrostrat/timescale");
|
|
|
5
5
|
const columnComponents = require("@macrostrat/column-components");
|
|
6
6
|
const h$1 = require("@macrostrat/hyper");
|
|
7
7
|
const column_module = require("./column.module.sass.cjs");
|
|
8
|
+
const dataProvider = require("@macrostrat/data-provider");
|
|
8
9
|
const dataComponents = require("@macrostrat/data-components");
|
|
9
10
|
const store = require("./data-provider/store.cjs");
|
|
10
11
|
const composite = require("./units/composite.cjs");
|
|
11
|
-
const base = require("./data-provider/base.cjs");
|
|
12
12
|
const panel = require("./unit-details/panel.cjs");
|
|
13
13
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
14
14
|
const h__default = /* @__PURE__ */ _interopDefault(h$1);
|
|
@@ -126,7 +126,7 @@ function SectionUnits(props) {
|
|
|
126
126
|
"g.section",
|
|
127
127
|
{ className, style, transform: `translate(0 ${scaleInfo.offset})` },
|
|
128
128
|
h(
|
|
129
|
-
|
|
129
|
+
store.MacrostratColumnProvider,
|
|
130
130
|
{
|
|
131
131
|
units,
|
|
132
132
|
domain,
|
|
@@ -156,7 +156,7 @@ function CompositeTimescale(props) {
|
|
|
156
156
|
}
|
|
157
157
|
function CompositeTimescaleCore(props) {
|
|
158
158
|
const { levels = 3, packages, unconformityLabels = false } = props;
|
|
159
|
-
const baseURL =
|
|
159
|
+
const baseURL = dataProvider.useMacrostratBaseURL();
|
|
160
160
|
const intervals = timescale.useMacrostratIntervals(baseURL);
|
|
161
161
|
let _levels;
|
|
162
162
|
if (typeof levels === "number") {
|