@macrostrat/column-views 3.3.3 → 3.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/age-axis.d.ts +2 -2
  3. package/dist/age-model-overlay.d.ts +1 -1
  4. package/dist/column.d.ts +5 -5
  5. package/dist/correlation-chart/main.cjs +2 -2
  6. package/dist/correlation-chart/main.cjs.map +1 -1
  7. package/dist/correlation-chart/main.d.ts +1 -1
  8. package/dist/correlation-chart/main.js +2 -2
  9. package/dist/correlation-chart/main.js.map +1 -1
  10. package/dist/correlation-chart/stories/utils.d.ts +1 -1
  11. package/dist/data-provider/column-nav.d.ts +1 -1
  12. package/dist/data-provider/unit-selection.cjs +1 -1
  13. package/dist/data-provider/unit-selection.cjs.map +1 -1
  14. package/dist/data-provider/unit-selection.d.ts +4 -4
  15. package/dist/data-provider/unit-selection.js +1 -1
  16. package/dist/data-provider/unit-selection.js.map +1 -1
  17. package/dist/facets/carbon-isotopes/data-area.d.ts +3 -3
  18. package/dist/facets/carbon-isotopes/data-provider.d.ts +3 -3
  19. package/dist/facets/detrital-zircon/index.d.ts +1 -1
  20. package/dist/facets/detrital-zircon/provider.d.ts +1 -1
  21. package/dist/facets/fossils/index.d.ts +1 -1
  22. package/dist/facets/fossils/taxon-ranges.d.ts +1 -1
  23. package/dist/facets/measurements/base.d.ts +3 -3
  24. package/dist/facets/measurements/sgp.d.ts +1 -1
  25. package/dist/maps/column-correlation/state.d.ts +1 -1
  26. package/dist/maps/column-navigation/mapbox/keyboard-navigation.d.ts +1 -1
  27. package/dist/maps/column-navigation/mapbox/state.d.ts +1 -1
  28. package/dist/maps/column-navigation/svg/data-fetcher.d.ts +1 -1
  29. package/dist/maps/column-navigation/svg/index.d.ts +1 -1
  30. package/dist/maps/column-navigation/svg/layers.d.ts +3 -3
  31. package/dist/maps/column-navigation/utils/keyboard-navigation.d.ts +1 -1
  32. package/dist/maps/inset-map/index.d.ts +2 -2
  33. package/dist/maps/layers/columns.d.ts +2 -2
  34. package/dist/section.d.ts +1 -1
  35. package/dist/unit-details/age-range.cjs.map +1 -1
  36. package/dist/unit-details/age-range.d.ts +4 -3
  37. package/dist/unit-details/age-range.js.map +1 -1
  38. package/dist/unit-details/modal-panel.d.ts +1 -1
  39. package/dist/unit-details/panel.cjs +75 -72
  40. package/dist/unit-details/panel.cjs.map +1 -1
  41. package/dist/unit-details/panel.d.ts +83 -0
  42. package/dist/unit-details/panel.js +11 -7
  43. package/dist/unit-details/panel.js.map +1 -1
  44. package/dist/unit-details/popover.d.ts +5 -1
  45. package/dist/unit-details/utils.d.ts +2 -2
  46. package/dist/units/boxes.d.ts +4 -4
  47. package/dist/units/composite.d.ts +3 -3
  48. package/dist/units/index.d.ts +6 -6
  49. package/dist/units/names.d.ts +3 -2
  50. package/dist/units/resolvers.d.ts +1 -1
  51. package/package.json +15 -15
  52. package/src/correlation-chart/main.ts +2 -2
  53. package/src/data-provider/unit-selection.ts +1 -1
  54. package/src/unit-details/age-range.ts +1 -0
  55. package/src/unit-details/panel.ts +24 -15
@@ -1 +1 @@
1
- {"version":3,"file":"panel.cjs","sources":["../../src/unit-details/panel.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport styles from \"./panel.module.sass\";\nimport { JSONView } from \"@macrostrat/ui-components\";\nimport { Button, ButtonGroup } from \"@blueprintjs/core\";\nimport { ReactNode, useMemo, useState } from \"react\";\nimport {\n DataField,\n EnvironmentsList,\n isClickable,\n ItemInteractionProps,\n ItemList,\n LithologyList,\n LithologyTagFeature,\n MacrostratInteractionManager,\n MacrostratInteractionProvider,\n MacrostratItemIdentifier,\n Parenthetical,\n useInteractionManager,\n useInteractionProps,\n Value,\n} from \"@macrostrat/data-components\";\nimport { useColumnUnitsMap } from \"../data-provider\";\nimport {\n useMacrostratColumnInfo,\n useMacrostratData,\n useMacrostratDefs,\n useStratNames,\n} from \"@macrostrat/data-provider\";\nimport type {\n Environment,\n Interval,\n Lithology,\n UnitLong,\n UnitLongFull,\n} from \"@macrostrat/api-types\";\nimport { defaultNameFunction } from \"../units/names\";\nimport classNames from \"classnames\";\nimport { AgeField, Duration, IntervalProportions } from \"./age-range\";\nimport { formatRange, formatSignificance } from \"./utils.ts\";\n\nconst h = hyper.styled(styles);\n\nexport interface UnitDetailsPanelProps {\n unit: any;\n onClose?: any;\n className?: string;\n actions?: ReactNode;\n hiddenActions?: ReactNode;\n features?: Set<UnitDetailsFeature>;\n lithologyFeatures?: Set<LithologyTagFeature>;\n onSelectUnit?: (unitID: number) => void;\n onClickItem?: MacrostratItemClickHandler;\n interactionManager?: MacrostratInteractionManager;\n}\n\nexport function UnitDetailsPanel({\n unit,\n onClose,\n className,\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.JSONToggle,\n UnitDetailsFeature.DepthRange,\n ]),\n lithologyFeatures,\n actions,\n hiddenActions = null,\n onSelectUnit,\n onClickItem,\n}: UnitDetailsPanelProps) {\n const [showJSON, setShowJSON] = useState(false);\n\n let content = null;\n if (showJSON) {\n content = h(JSONView, { data: unit, showRoot: false });\n } else {\n content = h(UnitDetailsContent, {\n unit,\n features,\n lithologyFeatures,\n onClickItem,\n });\n }\n\n let title = defaultNameFunction(unit);\n\n if (features.has(UnitDetailsFeature.JSONToggle)) {\n hiddenActions = h([\n h(Button, {\n icon: \"code\",\n small: true,\n minimal: true,\n key: \"json-view-toggle\",\n className: classNames(\"json-view-toggle\", { enabled: setShowJSON }),\n onClick(evt) {\n setShowJSON(!showJSON);\n evt.stopPropagation();\n },\n }),\n hiddenActions,\n ]);\n }\n\n const main = h(\"div.unit-details-panel\", { className }, [\n h(LegendPanelHeader, {\n onClose,\n title,\n id: unit.unit_id,\n actions,\n hiddenActions,\n }),\n h(\"div.unit-details-content-holder\", content),\n ]);\n\n /** Handle unit selection clicks */\n const clickHandlerForItem = useMemo(() => {\n if (onSelectUnit == null && onClickItem == null) return null;\n return (item: MacrostratItemIdentifier) => {\n if (\"unit_id\" in item && !(\"col_id\" in item)) {\n // We are selecting a unit within the column\n return (event: MouseEvent) => {\n onSelectUnit(item.unit_id);\n // Don't allow event to propagate further (e.g., to open a link)\n event.preventDefault();\n };\n }\n return undefined;\n };\n }, [onSelectUnit, onClickItem]);\n\n if (clickHandlerForItem != null) {\n // We wrap this in a MacrostratInteractionManager to handle unit selection\n return h(\n MacrostratInteractionProvider,\n {\n clickHandlerForItem,\n inherit: true,\n },\n main,\n );\n }\n\n return main;\n}\n\nexport function LegendPanelHeader({\n title,\n id,\n onClose,\n actions = null,\n hiddenActions,\n}: {\n title?: string | null;\n id?: number | null;\n onClose?: () => void;\n actions?: ReactNode | null;\n hiddenActions?: ReactNode | null;\n}) {\n return h(\"header.legend-panel-header\", [\n h(\"div.title-container\", [\n h.if(title != null)(\"h3\", title),\n h.if(hiddenActions != null)(\n \"span.hidden-actions-container\",\n h(\"div.hidden-actions\", hiddenActions),\n ),\n ]),\n h(\"div.spacer\"),\n h.if(id != null)(\"code.unit-id\", id),\n h.if(actions != null)(ButtonGroup, { minimal: true }, actions),\n h.if(onClose != null)(Button, {\n icon: \"cross\",\n minimal: true,\n small: true,\n onClick() {\n onClose();\n },\n }),\n ]);\n}\n\nexport enum UnitDetailsFeature {\n AdjacentUnits = \"adjacent-units\",\n Color = \"color\",\n OutcropType = \"outcrop-type\",\n JSONToggle = \"json-toggle\",\n DepthRange = \"depth-range\",\n ColumnName = \"column-name\",\n}\n\nexport type MacrostratItemClickHandler = (\n event: MouseEvent,\n item:\n | Lithology\n | Environment\n | UnitLong\n | Interval\n | { strat_name_id: number },\n) => void;\n\nfunction UnitDetailsContent({\n unit,\n lithologyFeatures = new Set([\n LithologyTagFeature.Proportion,\n LithologyTagFeature.Attributes,\n ]),\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n ]),\n onClickItem,\n getItemHref,\n}: {\n unit: UnitLong;\n lithologyFeatures?: Set<LithologyTagFeature>;\n features?: Set<UnitDetailsFeature>;\n onClickItem?: MacrostratItemClickHandler;\n getItemHref?: (item: Lithology | Environment | UnitLong) => string | null;\n}) {\n const lithMap = useMacrostratDefs(\"lithologies\");\n const envMap = useMacrostratDefs(\"environments\");\n\n const environments = enhanceEnvironments(unit.environ, envMap);\n const lithologies = enhanceLithologies(unit.lith ?? [], lithMap);\n\n let outcropField = null;\n if (features.has(UnitDetailsFeature.OutcropType)) {\n // Determine outcrop type\n let outcrop = unit.outcrop;\n if (outcrop == \"both\") {\n outcrop = \"surface and subsurface\";\n }\n outcropField = h(DataField, {\n label: \"Outcrop\",\n value: outcrop,\n });\n }\n\n let thicknessOrHeightRange = null;\n const [thickness, thicknessUnit] = getThickness(unit);\n // Proxy for actual heights in t_pos and b_pos\n if (\n features.has(UnitDetailsFeature.DepthRange) &&\n unit.t_pos != null &&\n unit.b_pos != null &&\n unit.min_thick == unit.max_thick && // We have an actual fixed height\n unit.min_thick != 0 // Not a zero thickness\n ) {\n const label = unit.t_pos < unit.b_pos ? \"Depth\" : \"Height\";\n const u1 = \"m\";\n\n thicknessOrHeightRange = h(DataField, {\n unit: u1,\n label,\n value: formatRange(unit.b_pos, unit.t_pos),\n children: h(\n Parenthetical,\n h(Value, { value: thickness, unit: thicknessUnit }),\n ),\n });\n }\n thicknessOrHeightRange ??= h(DataField, {\n label: \"Thickness\",\n value: thickness,\n unit: thicknessUnit,\n });\n\n /** We are trying to move away from passing the \"color\" parameter in the API */\n let colorSwatch: ReactNode = null;\n if (\"color\" in unit && features.has(UnitDetailsFeature.Color)) {\n const unit1 = unit as UnitLongFull;\n colorSwatch = h(\"div.color-swatch\", {\n style: { backgroundColor: unit1.color },\n });\n }\n\n return h(\"div.unit-details-content\", [\n h.if(features.has(UnitDetailsFeature.ColumnName))(ColumnNameField, {\n col_id: unit.col_id,\n }),\n thicknessOrHeightRange,\n h.if(lithologies != null)(LithologyList, {\n label: \"Lithology\",\n lithologies,\n features: lithologyFeatures,\n }),\n h(AgeField, { unit }, [\n h(Parenthetical, h(Duration, { value: unit.b_age - unit.t_age })),\n h(IntervalProportions, {\n unit,\n onClickItem,\n }),\n ]),\n h.if(environments != null)(EnvironmentsList, {\n environments,\n }),\n h.if(unit.strat_name_id != null)(StratNameField, {\n strat_name_id: unit.strat_name_id,\n }),\n outcropField,\n h.if(features.has(UnitDetailsFeature.AdjacentUnits))([\n h.if(unit.units_above != null)(\n DataField,\n { label: \"Above\" },\n h(UnitIDList, {\n units: unit.units_above,\n showNames: true,\n }),\n ),\n h.if(unit.units_below != null)(\n DataField,\n { label: \"Below\" },\n h(UnitIDList, {\n units: unit.units_below,\n showNames: true,\n }),\n ),\n ]),\n colorSwatch,\n h(ReferencesField, { refs: unit.refs, inline: true }),\n ]);\n}\n\nfunction ColumnNameField({\n col_id,\n showIdentifier = false,\n}: {\n col_id: number;\n showIdentifier?: boolean;\n}) {\n const colData = useMacrostratColumnInfo(col_id);\n let inner: any = h(Identifier, { id: col_id });\n const name = colData?.col_name;\n if (name != null) {\n inner = h(\"span.value\", [\n h(\"span.col-name\", name),\n h.if(showIdentifier)([\" \", h(Parenthetical, inner)]),\n ]);\n }\n\n return h(\n DataField,\n {\n label: \"Column\",\n },\n inner,\n );\n}\n\nexport function ReferencesField({ refs, className = null, ...rest }) {\n if (refs == null || refs.length === 0) {\n return null;\n }\n\n return h(\n DataField,\n {\n label: \"References\",\n className: classNames(\"refs-field\", className),\n ...rest,\n },\n h(BibInfo, { refs }),\n );\n}\n\nfunction useStratNameData(strat_name_id: number) {\n const stratNames = useStratNames([strat_name_id]);\n return stratNames?.[0];\n}\n\nfunction StratNameField(\n props: {\n strat_name_id: number;\n className?: string;\n } & ItemInteractionProps,\n) {\n /** Handling for stratigraphic name field */\n const { strat_name_id, className, ...rest } = props;\n const data = useStratNameData(strat_name_id);\n\n const baseInteractionProps = useInteractionProps({ strat_name_id });\n\n const coreProps = {\n ...baseInteractionProps,\n ...rest,\n };\n\n let inner: any = h(Identifier, { id: strat_name_id });\n const name = data?.strat_name_long;\n if (name != null) {\n inner = h(\"span.strat-name\", name);\n }\n\n const clickable = isClickable(coreProps);\n\n return h(\n DataField,\n {\n label: \"Stratigraphic name\",\n },\n h(\n clickable ? \"a\" : \"span\",\n {\n className: classNames({ clickable }, className),\n ...coreProps,\n },\n inner,\n ),\n );\n}\n\nfunction getThickness(unit): [string, string] {\n let minThickness = unit.min_thick ?? 0;\n let maxThickness = unit.max_thick ?? unit.min_thick ?? 0;\n let _unit = \"m\";\n\n if (minThickness == 0 && maxThickness == 0) {\n return [\"Unknown\", null];\n }\n\n if (minThickness < 0.8 && maxThickness < 1.2) {\n // Convert to cm\n minThickness = minThickness * 100;\n maxThickness = maxThickness * 100;\n _unit = \"cm\";\n } else if (minThickness > 800 && maxThickness > 1200) {\n // Convert to km\n minThickness = minThickness / 1000;\n maxThickness = maxThickness / 1000;\n _unit = \"km\";\n }\n\n if (minThickness == maxThickness) {\n return [formatSignificance(minThickness), _unit];\n }\n\n return [formatRange(minThickness, maxThickness), _unit];\n}\n\nexport function ThicknessField({ unit, label = \"Thickness\" }) {\n const [value, thicknessUnit] = getThickness(unit);\n return h(DataField, {\n label,\n value,\n unit: thicknessUnit,\n });\n}\n\nfunction BibInfo({ refs }) {\n const refData = useMacrostratData(\"refs\", refs);\n\n if (refData == null || refData.length === 0) {\n return null;\n }\n\n if (refData.length == 1) {\n return h(Citation, {\n data: refData[0],\n tag: \"span\",\n key: refData[0].ref_id,\n });\n }\n\n return h(\n \"ul.refs\",\n refData.map((data, i) =>\n h(Citation, { data, tag: \"li\", key: data.ref_id }),\n ),\n );\n}\n\nfunction Citation({ data, tag = \"p\" }) {\n return h(tag, { className: \"citation\" }, [\n h(\"span.authors\", data.author),\n \", \",\n h(\"span.year\", data.pub_year),\n \", \",\n h(\"span.title\", data.ref),\n ]);\n}\n\nfunction enhanceEnvironments(\n environments: Partial<Environment>[] | null,\n envMap: Map<number, Environment>,\n) {\n return environments?.map((env) => {\n return {\n ...(envMap?.get(env.environ_id) ?? {}),\n ...env,\n };\n });\n}\n\nfunction enhanceLithologies(\n lithologies: Partial<UnitLong[\"lith\"]>,\n lithMap: Map<number, any>,\n) {\n return lithologies?.map((lith) => {\n return {\n ...(lithMap?.get(lith.lith_id) ?? {}), // get lithology details\n ...lith, // override with the unit's specific lithology data\n };\n });\n}\n\nexport function ClickableText({\n className,\n ...rest\n}: {\n className?: string;\n children: ReactNode;\n} & ItemInteractionProps) {\n /** An optionally clickable text element */\n const clickable = isClickable(rest);\n const tag = clickable ? \"a\" : \"span\";\n return h(tag, { className: classNames(className, { clickable }), ...rest });\n}\n\nexport function Identifier({\n id,\n className,\n ...rest\n}: {\n id: number | string;\n className?: string;\n} & ItemInteractionProps) {\n /** An item that displays a numeric identifier, optionally clickable */\n return h(\n ClickableText,\n {\n className: classNames(\"identifier\", className),\n ...rest,\n },\n id,\n );\n}\n\ntype UnitInfo = {\n unitID: number;\n colID?: number;\n name?: string;\n};\n\nfunction UnitIDList({ units, showNames = false }) {\n const unitsMap = useColumnUnitsMap();\n\n const interactionManager = useInteractionManager();\n\n const extUnits: UnitInfo[] = useMemo(() => {\n const u1 = units.filter((d) => d != 0);\n if (showNames) {\n return u1.map((unitID) => {\n const unitData = unitsMap?.get(unitID);\n let name: string = undefined;\n if (unitData != null) {\n name = defaultNameFunction(unitData);\n }\n return {\n unitID,\n colID: unitData?.col_id,\n name,\n };\n });\n } else {\n return u1.map((unitID) => ({ unitID }));\n }\n }, [units, unitsMap]);\n\n if (extUnits.length === 0) {\n return h(\"span.no-units\", \"None\");\n }\n\n return h(\n ItemList,\n { className: \"units-list\" },\n extUnits.map((info) => {\n return h(\n \"span.item\",\n h(UnitIdentifier, {\n ...info,\n ...interactionManager?.interactionPropsForItem({\n unit_id: info.unitID,\n }),\n }),\n );\n }),\n );\n}\n\nfunction UnitIdentifier({\n unitID,\n colID,\n name,\n ...interactionProps\n}: UnitInfo & ItemInteractionProps) {\n if (name != null) {\n return h(\n ClickableText,\n {\n className: \"unit-name\",\n ...interactionProps,\n },\n name,\n );\n }\n\n return h(Identifier, {\n className: \"unit-id\",\n key: unitID,\n id: unitID,\n ...interactionProps,\n });\n}\n"],"names":["hyper","styles","useState","JSONView","defaultNameFunction","Button","classNames","useMemo","MacrostratInteractionProvider","ButtonGroup","UnitDetailsFeature","LithologyTagFeature","useMacrostratDefs","DataField","formatRange","Parenthetical","Value","LithologyList","AgeField","Duration","IntervalProportions","EnvironmentsList","useMacrostratColumnInfo","useStratNames","useInteractionProps","isClickable","formatSignificance","useMacrostratData","useColumnUnitsMap","useInteractionManager","ItemList"],"mappings":"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"}
1
+ {"version":3,"file":"panel.cjs","sources":["../../src/unit-details/panel.ts"],"sourcesContent":["import { JSONView } from \"@macrostrat/ui-components\";\nimport { Button, ButtonGroup } from \"@blueprintjs/core\";\nimport { ReactNode, useMemo, useState } from \"react\";\nimport {\n DataField,\n EnvironmentsList,\n isClickable,\n ItemInteractionProps,\n ItemList,\n LithologyList,\n LithologyTagFeature,\n MacrostratInteractionManager,\n MacrostratInteractionProvider,\n MacrostratItemIdentifier,\n Parenthetical,\n useInteractionManager,\n useInteractionProps,\n Value,\n} from \"@macrostrat/data-components\";\nimport { useColumnUnitsMap } from \"../data-provider\";\nimport {\n useMacrostratColumnInfo,\n useMacrostratData,\n useMacrostratDefs,\n useStratNames,\n} from \"@macrostrat/data-provider\";\nimport type {\n Environment,\n Interval,\n Lithology,\n UnitLithology,\n UnitLong,\n UnitLongFull,\n} from \"@macrostrat/api-types\";\nimport { defaultNameFunction } from \"../units/names\";\nimport classNames from \"classnames\";\nimport { AgeField, Duration, IntervalProportions } from \"./age-range\";\nimport { formatRange, formatSignificance } from \"./utils.ts\";\nimport h from \"./panel.module.sass\";\n\nexport interface UnitDetailsPanelProps {\n unit: any;\n onClose?: any;\n className?: string;\n actions?: ReactNode;\n hiddenActions?: ReactNode;\n features?: Set<UnitDetailsFeature>;\n lithologyFeatures?: Set<LithologyTagFeature>;\n onSelectUnit?: (unitID: number) => void;\n onClickItem?: MacrostratItemClickHandler;\n interactionManager?: MacrostratInteractionManager;\n}\n\nexport function UnitDetailsPanel({\n unit,\n onClose,\n className,\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.JSONToggle,\n UnitDetailsFeature.DepthRange,\n ]),\n lithologyFeatures,\n actions,\n hiddenActions = null,\n onSelectUnit,\n onClickItem,\n}: UnitDetailsPanelProps) {\n const [showJSON, setShowJSON] = useState(false);\n\n let content: ReactNode = null;\n if (showJSON) {\n content = h(JSONView, { data: unit, showRoot: false });\n } else {\n content = h(UnitDetailsContent, {\n unit,\n features,\n lithologyFeatures,\n onClickItem,\n });\n }\n\n let title = defaultNameFunction(unit);\n\n if (features.has(UnitDetailsFeature.JSONToggle)) {\n hiddenActions = h([\n h(Button, {\n icon: \"code\",\n small: true,\n minimal: true,\n key: \"json-view-toggle\",\n className: classNames(\"json-view-toggle\", { enabled: setShowJSON }),\n onClick(evt) {\n setShowJSON(!showJSON);\n evt.stopPropagation();\n },\n }),\n hiddenActions,\n ]);\n }\n\n const main = h(\"div.unit-details-panel\", { className }, [\n h(LegendPanelHeader, {\n onClose,\n title,\n id: unit.unit_id,\n actions,\n hiddenActions,\n }),\n h(\"div.unit-details-content-holder\", content),\n ]);\n\n /** Handle unit selection clicks */\n const clickHandlerForItem = useMemo(() => {\n if (onSelectUnit == null || onClickItem == null) return null;\n return (item: MacrostratItemIdentifier) => {\n if (\"unit_id\" in item && !(\"col_id\" in item)) {\n // We are selecting a unit within the column\n return (event: MouseEvent) => {\n if (onSelectUnit != null) {\n onSelectUnit(item.unit_id);\n } else if (onClickItem != null) {\n console.warn(\n \"Unit selection: onClickItem is defined but onSelectUnit is not; ignoring click\",\n );\n }\n // Don't allow event to propagate further (e.g., to open a link)\n event.preventDefault();\n };\n }\n return undefined;\n };\n }, [onSelectUnit, onClickItem]);\n\n if (clickHandlerForItem != null) {\n // We wrap this in a MacrostratInteractionManager to handle unit selection\n return h(\n MacrostratInteractionProvider,\n {\n clickHandlerForItem,\n inherit: true,\n },\n main,\n );\n }\n\n return main;\n}\n\nexport function LegendPanelHeader({\n title,\n id,\n onClose,\n actions = null,\n hiddenActions,\n}: {\n title?: string | null;\n id?: number | null;\n onClose?: () => void;\n actions?: ReactNode | null;\n hiddenActions?: ReactNode | null;\n}) {\n return h(\"header.legend-panel-header\", [\n h(\"div.title-container\", [\n h.if(title != null)(\"h3\", title),\n h.if(hiddenActions != null)(\n \"span.hidden-actions-container\",\n h(\"div.hidden-actions\", hiddenActions),\n ),\n ]),\n h(\"div.spacer\"),\n h.if(id != null)(\"code.unit-id\", id),\n h.if(actions != null)(ButtonGroup, { minimal: true }, actions),\n h.if(onClose != null)(Button, {\n icon: \"cross\",\n minimal: true,\n small: true,\n onClick() {\n onClose?.();\n },\n }),\n ]);\n}\n\nexport enum UnitDetailsFeature {\n AdjacentUnits = \"adjacent-units\",\n Color = \"color\",\n OutcropType = \"outcrop-type\",\n JSONToggle = \"json-toggle\",\n DepthRange = \"depth-range\",\n ColumnName = \"column-name\",\n}\n\nexport type MacrostratItemClickHandler = (\n event: MouseEvent,\n item:\n | Lithology\n | Environment\n | UnitLong\n | Interval\n | { strat_name_id: number },\n) => void;\n\nfunction UnitDetailsContent({\n unit,\n lithologyFeatures = new Set([\n LithologyTagFeature.Proportion,\n LithologyTagFeature.Attributes,\n ]),\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n ]),\n onClickItem,\n getItemHref,\n}: {\n unit: UnitLong;\n lithologyFeatures?: Set<LithologyTagFeature>;\n features?: Set<UnitDetailsFeature>;\n onClickItem?: MacrostratItemClickHandler;\n getItemHref?: (item: Lithology | Environment | UnitLong) => string | null;\n}) {\n const lithMap = useMacrostratDefs(\"lithologies\");\n const envMap = useMacrostratDefs(\"environments\");\n\n const environments = enhanceEnvironments(unit.environ, envMap);\n const lithologies = enhanceLithologies(unit.lith ?? [], lithMap);\n\n let outcropField: ReactNode = null;\n if (features.has(UnitDetailsFeature.OutcropType)) {\n // Determine outcrop type\n let outcrop = unit.outcrop;\n if (outcrop == \"both\") {\n outcrop = \"surface and subsurface\";\n }\n outcropField = h(DataField, {\n label: \"Outcrop\",\n value: outcrop,\n });\n }\n\n let thicknessOrHeightRange: ReactNode = null;\n const [thickness, thicknessUnit] = getThickness(unit);\n // Proxy for actual heights in t_pos and b_pos\n if (\n features.has(UnitDetailsFeature.DepthRange) &&\n unit.t_pos != null &&\n unit.b_pos != null &&\n unit.min_thick == unit.max_thick && // We have an actual fixed height\n unit.min_thick != 0 // Not a zero thickness\n ) {\n const label = unit.t_pos < unit.b_pos ? \"Depth\" : \"Height\";\n const u1 = \"m\";\n\n thicknessOrHeightRange = h(DataField, {\n unit: u1,\n label,\n value: formatRange(unit.b_pos, unit.t_pos),\n children: h(\n Parenthetical,\n h(Value, { value: thickness, unit: thicknessUnit }),\n ),\n });\n }\n thicknessOrHeightRange ??= h(DataField, {\n label: \"Thickness\",\n value: thickness,\n unit: thicknessUnit,\n });\n\n /** We are trying to move away from passing the \"color\" parameter in the API */\n let colorSwatch: ReactNode = null;\n if (\"color\" in unit && features.has(UnitDetailsFeature.Color)) {\n const unit1 = unit as UnitLongFull;\n colorSwatch = h(\"div.color-swatch\", {\n style: { backgroundColor: unit1.color },\n });\n }\n\n return h(\"div.unit-details-content\", [\n h.if(features.has(UnitDetailsFeature.ColumnName))(ColumnNameField, {\n col_id: unit.col_id,\n }),\n thicknessOrHeightRange,\n h.if(lithologies != null)(LithologyList, {\n label: \"Lithology\",\n lithologies: lithologies ?? [],\n features: lithologyFeatures,\n }),\n h(AgeField, { unit }, [\n h(Parenthetical, h(Duration, { value: unit.b_age - unit.t_age })),\n h(IntervalProportions, {\n unit,\n onClickItem,\n }),\n ]),\n h.if(environments != null)(EnvironmentsList, {\n environments,\n }),\n h.if(unit.strat_name_id != null)(StratNameField, {\n strat_name_id: unit.strat_name_id,\n }),\n outcropField,\n h.if(features.has(UnitDetailsFeature.AdjacentUnits))([\n h.if(unit.units_above != null)(\n DataField,\n { label: \"Above\" },\n h(UnitIDList, {\n units: unit.units_above,\n showNames: true,\n }),\n ),\n h.if(unit.units_below != null)(\n DataField,\n { label: \"Below\" },\n h(UnitIDList, {\n units: unit.units_below,\n showNames: true,\n }),\n ),\n ]),\n colorSwatch,\n h(ReferencesField, { refs: unit.refs, inline: true }),\n ]);\n}\n\nfunction ColumnNameField({\n col_id,\n showIdentifier = false,\n}: {\n col_id: number;\n showIdentifier?: boolean;\n}) {\n const colData = useMacrostratColumnInfo(col_id);\n let inner: any = h(Identifier, { id: col_id });\n const name = colData?.col_name;\n if (name != null) {\n inner = h(\"span.value\", [\n h(\"span.col-name\", name),\n h.if(showIdentifier)([\" \", h(Parenthetical, inner)]),\n ]);\n }\n\n return h(\n DataField,\n {\n label: \"Column\",\n },\n inner,\n );\n}\n\nexport function ReferencesField({ refs, className = null, ...rest }) {\n if (refs == null || refs.length === 0) {\n return null;\n }\n\n return h(\n DataField,\n {\n label: \"References\",\n className: classNames(\"refs-field\", className),\n ...rest,\n },\n h(BibInfo, { refs }),\n );\n}\n\nfunction useStratNameData(strat_name_id: number) {\n const stratNames = useStratNames([strat_name_id]);\n return stratNames?.[0];\n}\n\nfunction StratNameField(\n props: {\n strat_name_id: number;\n className?: string;\n } & ItemInteractionProps,\n) {\n /** Handling for stratigraphic name field */\n const { strat_name_id, className, ...rest } = props;\n const data = useStratNameData(strat_name_id);\n\n const baseInteractionProps = useInteractionProps({ strat_name_id });\n\n const coreProps = {\n ...baseInteractionProps,\n ...rest,\n };\n\n let inner: any = h(Identifier, { id: strat_name_id });\n const name = data?.strat_name_long;\n if (name != null) {\n inner = h(\"span.strat-name\", name);\n }\n\n const clickable = isClickable(coreProps);\n\n return h(\n DataField,\n {\n label: \"Stratigraphic name\",\n },\n h(\n clickable ? \"a\" : \"span\",\n {\n className: classNames({ clickable }, className),\n ...coreProps,\n },\n inner,\n ),\n );\n}\n\nfunction getThickness(unit): [string, string] {\n let minThickness = unit.min_thick ?? 0;\n let maxThickness = unit.max_thick ?? unit.min_thick ?? 0;\n let _unit = \"m\";\n\n if (minThickness == 0 && maxThickness == 0) {\n return [\"Unknown\", null];\n }\n\n if (minThickness < 0.8 && maxThickness < 1.2) {\n // Convert to cm\n minThickness = minThickness * 100;\n maxThickness = maxThickness * 100;\n _unit = \"cm\";\n } else if (minThickness > 800 && maxThickness > 1200) {\n // Convert to km\n minThickness = minThickness / 1000;\n maxThickness = maxThickness / 1000;\n _unit = \"km\";\n }\n\n if (minThickness == maxThickness) {\n return [formatSignificance(minThickness), _unit];\n }\n\n return [formatRange(minThickness, maxThickness), _unit];\n}\n\nexport function ThicknessField({ unit, label = \"Thickness\" }) {\n const [value, thicknessUnit] = getThickness(unit);\n return h(DataField, {\n label,\n value,\n unit: thicknessUnit,\n });\n}\n\nfunction BibInfo({ refs }) {\n const refData = useMacrostratData(\"refs\", refs);\n\n if (refData == null || refData.length === 0) {\n return null;\n }\n\n if (refData.length == 1) {\n return h(Citation, {\n data: refData[0],\n tag: \"span\",\n key: refData[0].ref_id,\n });\n }\n\n return h(\n \"ul.refs\",\n refData.map((data, i) =>\n h(Citation, { data, tag: \"li\", key: data.ref_id }),\n ),\n );\n}\n\nfunction Citation({ data, tag = \"p\" }) {\n return h(tag, { className: \"citation\" }, [\n h(\"span.authors\", data.author),\n \", \",\n h(\"span.year\", data.pub_year),\n \", \",\n h(\"span.title\", data.ref),\n ]);\n}\n\nfunction enhanceEnvironments(\n environments?: Partial<Environment>[] | null,\n envMap?: Map<number, Environment> | null,\n) {\n return environments?.map((env) => {\n return {\n ...(envMap?.get(env.environ_id) ?? {}),\n ...env,\n };\n });\n}\n\ntype LithID =\n | (Partial<Lithology> & Pick<Lithology, \"lith_id\">)\n | UnitLithology\n | Lithology;\n\nfunction enhanceLithologies(\n lithologies?: LithID[] | null,\n lithMap?: Map<number, any> | null,\n) {\n return lithologies?.map((lith) => {\n return {\n ...(lithMap?.get(lith.lith_id) ?? {}), // get lithology details\n ...lith, // override with the unit's specific lithology data\n };\n });\n}\n\nexport function ClickableText({\n className,\n ...rest\n}: {\n className?: string;\n children: ReactNode;\n} & ItemInteractionProps) {\n /** An optionally clickable text element */\n const clickable = isClickable(rest);\n const tag = clickable ? \"a\" : \"span\";\n return h(tag, { className: classNames(className, { clickable }), ...rest });\n}\n\nexport function Identifier({\n id,\n className,\n ...rest\n}: {\n id: number | string;\n className?: string;\n} & ItemInteractionProps) {\n /** An item that displays a numeric identifier, optionally clickable */\n return h(\n ClickableText,\n {\n className: classNames(\"identifier\", className),\n ...rest,\n },\n id,\n );\n}\n\ntype UnitInfo = {\n unitID: number;\n colID?: number;\n name?: string;\n};\n\nfunction UnitIDList({ units, showNames = false }) {\n const unitsMap = useColumnUnitsMap();\n\n const interactionManager = useInteractionManager();\n\n const extUnits: UnitInfo[] = useMemo(() => {\n const u1 = units.filter((d) => d != 0);\n if (showNames) {\n return u1.map((unitID) => {\n const unitData = unitsMap?.get(unitID);\n let name: string = undefined;\n if (unitData != null) {\n name = defaultNameFunction(unitData);\n }\n return {\n unitID,\n colID: unitData?.col_id,\n name,\n };\n });\n } else {\n return u1.map((unitID) => ({ unitID }));\n }\n }, [units, unitsMap]);\n\n if (extUnits.length === 0) {\n return h(\"span.no-units\", \"None\");\n }\n\n return h(\n ItemList,\n { className: \"units-list\" },\n extUnits.map((info) => {\n return h(\n \"span.item\",\n h(UnitIdentifier, {\n ...info,\n ...interactionManager?.interactionPropsForItem({\n unit_id: info.unitID,\n }),\n }),\n );\n }),\n );\n}\n\nfunction UnitIdentifier({\n unitID,\n colID,\n name,\n ...interactionProps\n}: UnitInfo & ItemInteractionProps) {\n if (name != null) {\n return h(\n ClickableText,\n {\n className: \"unit-name\",\n ...interactionProps,\n },\n name,\n );\n }\n\n return h(Identifier, {\n className: \"unit-id\",\n key: unitID,\n id: unitID,\n ...interactionProps,\n });\n}\n"],"names":["useState","h","JSONView","defaultNameFunction","Button","classNames","useMemo","MacrostratInteractionProvider","ButtonGroup","UnitDetailsFeature","LithologyTagFeature","useMacrostratDefs","DataField","formatRange","Parenthetical","Value","LithologyList","AgeField","Duration","IntervalProportions","EnvironmentsList","useMacrostratColumnInfo","useStratNames","useInteractionProps","isClickable","formatSignificance","useMacrostratData","useColumnUnitsMap","useInteractionManager","ItemList"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { ReactNode } from 'react';
2
+ import { ItemInteractionProps, LithologyTagFeature, MacrostratInteractionManager } from '@macrostrat/data-components';
3
+ import { Environment, Interval, Lithology, UnitLong } from '@macrostrat/api-types';
4
+ export interface UnitDetailsPanelProps {
5
+ unit: any;
6
+ onClose?: any;
7
+ className?: string;
8
+ actions?: ReactNode;
9
+ hiddenActions?: ReactNode;
10
+ features?: Set<UnitDetailsFeature>;
11
+ lithologyFeatures?: Set<LithologyTagFeature>;
12
+ onSelectUnit?: (unitID: number) => void;
13
+ onClickItem?: MacrostratItemClickHandler;
14
+ interactionManager?: MacrostratInteractionManager;
15
+ }
16
+ export declare function UnitDetailsPanel({ unit, onClose, className, features, lithologyFeatures, actions, hiddenActions, onSelectUnit, onClickItem, }: UnitDetailsPanelProps): import('react').ReactElement<{
17
+ className: string | undefined;
18
+ }, string | import('react').JSXElementConstructor<any>> | import('react').FunctionComponentElement<import('@macrostrat/data-components').InteractionManagerOptions & {
19
+ children: ReactNode;
20
+ inherit?: boolean;
21
+ }>;
22
+ export declare function LegendPanelHeader({ title, id, onClose, actions, hiddenActions, }: {
23
+ title?: string | null;
24
+ id?: number | null;
25
+ onClose?: () => void;
26
+ actions?: ReactNode | null;
27
+ hiddenActions?: ReactNode | null;
28
+ }): import('react').DOMElement<import('react').DOMAttributes<Element>, Element>;
29
+ export declare enum UnitDetailsFeature {
30
+ AdjacentUnits = "adjacent-units",
31
+ Color = "color",
32
+ OutcropType = "outcrop-type",
33
+ JSONToggle = "json-toggle",
34
+ DepthRange = "depth-range",
35
+ ColumnName = "column-name"
36
+ }
37
+ export type MacrostratItemClickHandler = (event: MouseEvent, item: Lithology | Environment | UnitLong | Interval | {
38
+ strat_name_id: number;
39
+ }) => void;
40
+ export declare function ReferencesField({ refs, className, ...rest }: {
41
+ [x: string]: any;
42
+ refs: any;
43
+ className?: null | undefined;
44
+ }): import('react').FunctionComponentElement<{
45
+ label?: string;
46
+ value?: any;
47
+ inline?: boolean;
48
+ showIfEmpty?: boolean;
49
+ className?: string;
50
+ children?: any;
51
+ unit?: string;
52
+ row?: boolean;
53
+ }> | null;
54
+ export declare function ThicknessField({ unit, label }: {
55
+ unit: any;
56
+ label?: string | undefined;
57
+ }): import('react').FunctionComponentElement<{
58
+ label?: string;
59
+ value?: any;
60
+ inline?: boolean;
61
+ showIfEmpty?: boolean;
62
+ className?: string;
63
+ children?: any;
64
+ unit?: string;
65
+ row?: boolean;
66
+ }>;
67
+ export declare function ClickableText({ className, ...rest }: {
68
+ className?: string;
69
+ children: ReactNode;
70
+ } & ItemInteractionProps): import('react').ReactElement<{
71
+ children: ReactNode;
72
+ href?: string | null;
73
+ target?: string;
74
+ onClick?: (event: MouseEvent) => void;
75
+ className: string;
76
+ }, string | import('react').JSXElementConstructor<any>>;
77
+ export declare function Identifier({ id, className, ...rest }: {
78
+ id: number | string;
79
+ className?: string;
80
+ } & ItemInteractionProps): import('react').FunctionComponentElement<{
81
+ className?: string;
82
+ children: ReactNode;
83
+ } & ItemInteractionProps>;
@@ -1,5 +1,3 @@
1
- import h$1 from "@macrostrat/hyper";
2
- import h$2 from "./panel.module.sass.js";
3
1
  import { JSONView } from "@macrostrat/ui-components";
4
2
  import { ButtonGroup, Button } from "@blueprintjs/core";
5
3
  import { useState, useMemo } from "react";
@@ -9,8 +7,8 @@ import { defaultNameFunction } from "../units/names.js";
9
7
  import classNames from "classnames";
10
8
  import { AgeField, Duration, IntervalProportions } from "./age-range.js";
11
9
  import { formatSignificance, formatRange } from "./utils.js";
10
+ import h from "./panel.module.sass.js";
12
11
  import { useColumnUnitsMap } from "../data-provider/store.js";
13
- const h = h$1.styled(h$2);
14
12
  function UnitDetailsPanel({
15
13
  unit,
16
14
  onClose,
@@ -71,11 +69,17 @@ function UnitDetailsPanel({
71
69
  h("div.unit-details-content-holder", content)
72
70
  ]);
73
71
  const clickHandlerForItem = useMemo(() => {
74
- if (onSelectUnit == null && onClickItem == null) return null;
72
+ if (onSelectUnit == null || onClickItem == null) return null;
75
73
  return (item) => {
76
74
  if ("unit_id" in item && !("col_id" in item)) {
77
75
  return (event) => {
78
- onSelectUnit(item.unit_id);
76
+ if (onSelectUnit != null) {
77
+ onSelectUnit(item.unit_id);
78
+ } else if (onClickItem != null) {
79
+ console.warn(
80
+ "Unit selection: onClickItem is defined but onSelectUnit is not; ignoring click"
81
+ );
82
+ }
79
83
  event.preventDefault();
80
84
  };
81
85
  }
@@ -117,7 +121,7 @@ function LegendPanelHeader({
117
121
  minimal: true,
118
122
  small: true,
119
123
  onClick() {
120
- onClose();
124
+ onClose?.();
121
125
  }
122
126
  })
123
127
  ]);
@@ -207,7 +211,7 @@ function UnitDetailsContent({
207
211
  thicknessOrHeightRange,
208
212
  h.if(lithologies != null)(LithologyList, {
209
213
  label: "Lithology",
210
- lithologies,
214
+ lithologies: lithologies ?? [],
211
215
  features: lithologyFeatures
212
216
  }),
213
217
  h(AgeField, { unit }, [
@@ -1 +1 @@
1
- {"version":3,"file":"panel.js","sources":["../../src/unit-details/panel.ts"],"sourcesContent":["import hyper from \"@macrostrat/hyper\";\nimport styles from \"./panel.module.sass\";\nimport { JSONView } from \"@macrostrat/ui-components\";\nimport { Button, ButtonGroup } from \"@blueprintjs/core\";\nimport { ReactNode, useMemo, useState } from \"react\";\nimport {\n DataField,\n EnvironmentsList,\n isClickable,\n ItemInteractionProps,\n ItemList,\n LithologyList,\n LithologyTagFeature,\n MacrostratInteractionManager,\n MacrostratInteractionProvider,\n MacrostratItemIdentifier,\n Parenthetical,\n useInteractionManager,\n useInteractionProps,\n Value,\n} from \"@macrostrat/data-components\";\nimport { useColumnUnitsMap } from \"../data-provider\";\nimport {\n useMacrostratColumnInfo,\n useMacrostratData,\n useMacrostratDefs,\n useStratNames,\n} from \"@macrostrat/data-provider\";\nimport type {\n Environment,\n Interval,\n Lithology,\n UnitLong,\n UnitLongFull,\n} from \"@macrostrat/api-types\";\nimport { defaultNameFunction } from \"../units/names\";\nimport classNames from \"classnames\";\nimport { AgeField, Duration, IntervalProportions } from \"./age-range\";\nimport { formatRange, formatSignificance } from \"./utils.ts\";\n\nconst h = hyper.styled(styles);\n\nexport interface UnitDetailsPanelProps {\n unit: any;\n onClose?: any;\n className?: string;\n actions?: ReactNode;\n hiddenActions?: ReactNode;\n features?: Set<UnitDetailsFeature>;\n lithologyFeatures?: Set<LithologyTagFeature>;\n onSelectUnit?: (unitID: number) => void;\n onClickItem?: MacrostratItemClickHandler;\n interactionManager?: MacrostratInteractionManager;\n}\n\nexport function UnitDetailsPanel({\n unit,\n onClose,\n className,\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.JSONToggle,\n UnitDetailsFeature.DepthRange,\n ]),\n lithologyFeatures,\n actions,\n hiddenActions = null,\n onSelectUnit,\n onClickItem,\n}: UnitDetailsPanelProps) {\n const [showJSON, setShowJSON] = useState(false);\n\n let content = null;\n if (showJSON) {\n content = h(JSONView, { data: unit, showRoot: false });\n } else {\n content = h(UnitDetailsContent, {\n unit,\n features,\n lithologyFeatures,\n onClickItem,\n });\n }\n\n let title = defaultNameFunction(unit);\n\n if (features.has(UnitDetailsFeature.JSONToggle)) {\n hiddenActions = h([\n h(Button, {\n icon: \"code\",\n small: true,\n minimal: true,\n key: \"json-view-toggle\",\n className: classNames(\"json-view-toggle\", { enabled: setShowJSON }),\n onClick(evt) {\n setShowJSON(!showJSON);\n evt.stopPropagation();\n },\n }),\n hiddenActions,\n ]);\n }\n\n const main = h(\"div.unit-details-panel\", { className }, [\n h(LegendPanelHeader, {\n onClose,\n title,\n id: unit.unit_id,\n actions,\n hiddenActions,\n }),\n h(\"div.unit-details-content-holder\", content),\n ]);\n\n /** Handle unit selection clicks */\n const clickHandlerForItem = useMemo(() => {\n if (onSelectUnit == null && onClickItem == null) return null;\n return (item: MacrostratItemIdentifier) => {\n if (\"unit_id\" in item && !(\"col_id\" in item)) {\n // We are selecting a unit within the column\n return (event: MouseEvent) => {\n onSelectUnit(item.unit_id);\n // Don't allow event to propagate further (e.g., to open a link)\n event.preventDefault();\n };\n }\n return undefined;\n };\n }, [onSelectUnit, onClickItem]);\n\n if (clickHandlerForItem != null) {\n // We wrap this in a MacrostratInteractionManager to handle unit selection\n return h(\n MacrostratInteractionProvider,\n {\n clickHandlerForItem,\n inherit: true,\n },\n main,\n );\n }\n\n return main;\n}\n\nexport function LegendPanelHeader({\n title,\n id,\n onClose,\n actions = null,\n hiddenActions,\n}: {\n title?: string | null;\n id?: number | null;\n onClose?: () => void;\n actions?: ReactNode | null;\n hiddenActions?: ReactNode | null;\n}) {\n return h(\"header.legend-panel-header\", [\n h(\"div.title-container\", [\n h.if(title != null)(\"h3\", title),\n h.if(hiddenActions != null)(\n \"span.hidden-actions-container\",\n h(\"div.hidden-actions\", hiddenActions),\n ),\n ]),\n h(\"div.spacer\"),\n h.if(id != null)(\"code.unit-id\", id),\n h.if(actions != null)(ButtonGroup, { minimal: true }, actions),\n h.if(onClose != null)(Button, {\n icon: \"cross\",\n minimal: true,\n small: true,\n onClick() {\n onClose();\n },\n }),\n ]);\n}\n\nexport enum UnitDetailsFeature {\n AdjacentUnits = \"adjacent-units\",\n Color = \"color\",\n OutcropType = \"outcrop-type\",\n JSONToggle = \"json-toggle\",\n DepthRange = \"depth-range\",\n ColumnName = \"column-name\",\n}\n\nexport type MacrostratItemClickHandler = (\n event: MouseEvent,\n item:\n | Lithology\n | Environment\n | UnitLong\n | Interval\n | { strat_name_id: number },\n) => void;\n\nfunction UnitDetailsContent({\n unit,\n lithologyFeatures = new Set([\n LithologyTagFeature.Proportion,\n LithologyTagFeature.Attributes,\n ]),\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n ]),\n onClickItem,\n getItemHref,\n}: {\n unit: UnitLong;\n lithologyFeatures?: Set<LithologyTagFeature>;\n features?: Set<UnitDetailsFeature>;\n onClickItem?: MacrostratItemClickHandler;\n getItemHref?: (item: Lithology | Environment | UnitLong) => string | null;\n}) {\n const lithMap = useMacrostratDefs(\"lithologies\");\n const envMap = useMacrostratDefs(\"environments\");\n\n const environments = enhanceEnvironments(unit.environ, envMap);\n const lithologies = enhanceLithologies(unit.lith ?? [], lithMap);\n\n let outcropField = null;\n if (features.has(UnitDetailsFeature.OutcropType)) {\n // Determine outcrop type\n let outcrop = unit.outcrop;\n if (outcrop == \"both\") {\n outcrop = \"surface and subsurface\";\n }\n outcropField = h(DataField, {\n label: \"Outcrop\",\n value: outcrop,\n });\n }\n\n let thicknessOrHeightRange = null;\n const [thickness, thicknessUnit] = getThickness(unit);\n // Proxy for actual heights in t_pos and b_pos\n if (\n features.has(UnitDetailsFeature.DepthRange) &&\n unit.t_pos != null &&\n unit.b_pos != null &&\n unit.min_thick == unit.max_thick && // We have an actual fixed height\n unit.min_thick != 0 // Not a zero thickness\n ) {\n const label = unit.t_pos < unit.b_pos ? \"Depth\" : \"Height\";\n const u1 = \"m\";\n\n thicknessOrHeightRange = h(DataField, {\n unit: u1,\n label,\n value: formatRange(unit.b_pos, unit.t_pos),\n children: h(\n Parenthetical,\n h(Value, { value: thickness, unit: thicknessUnit }),\n ),\n });\n }\n thicknessOrHeightRange ??= h(DataField, {\n label: \"Thickness\",\n value: thickness,\n unit: thicknessUnit,\n });\n\n /** We are trying to move away from passing the \"color\" parameter in the API */\n let colorSwatch: ReactNode = null;\n if (\"color\" in unit && features.has(UnitDetailsFeature.Color)) {\n const unit1 = unit as UnitLongFull;\n colorSwatch = h(\"div.color-swatch\", {\n style: { backgroundColor: unit1.color },\n });\n }\n\n return h(\"div.unit-details-content\", [\n h.if(features.has(UnitDetailsFeature.ColumnName))(ColumnNameField, {\n col_id: unit.col_id,\n }),\n thicknessOrHeightRange,\n h.if(lithologies != null)(LithologyList, {\n label: \"Lithology\",\n lithologies,\n features: lithologyFeatures,\n }),\n h(AgeField, { unit }, [\n h(Parenthetical, h(Duration, { value: unit.b_age - unit.t_age })),\n h(IntervalProportions, {\n unit,\n onClickItem,\n }),\n ]),\n h.if(environments != null)(EnvironmentsList, {\n environments,\n }),\n h.if(unit.strat_name_id != null)(StratNameField, {\n strat_name_id: unit.strat_name_id,\n }),\n outcropField,\n h.if(features.has(UnitDetailsFeature.AdjacentUnits))([\n h.if(unit.units_above != null)(\n DataField,\n { label: \"Above\" },\n h(UnitIDList, {\n units: unit.units_above,\n showNames: true,\n }),\n ),\n h.if(unit.units_below != null)(\n DataField,\n { label: \"Below\" },\n h(UnitIDList, {\n units: unit.units_below,\n showNames: true,\n }),\n ),\n ]),\n colorSwatch,\n h(ReferencesField, { refs: unit.refs, inline: true }),\n ]);\n}\n\nfunction ColumnNameField({\n col_id,\n showIdentifier = false,\n}: {\n col_id: number;\n showIdentifier?: boolean;\n}) {\n const colData = useMacrostratColumnInfo(col_id);\n let inner: any = h(Identifier, { id: col_id });\n const name = colData?.col_name;\n if (name != null) {\n inner = h(\"span.value\", [\n h(\"span.col-name\", name),\n h.if(showIdentifier)([\" \", h(Parenthetical, inner)]),\n ]);\n }\n\n return h(\n DataField,\n {\n label: \"Column\",\n },\n inner,\n );\n}\n\nexport function ReferencesField({ refs, className = null, ...rest }) {\n if (refs == null || refs.length === 0) {\n return null;\n }\n\n return h(\n DataField,\n {\n label: \"References\",\n className: classNames(\"refs-field\", className),\n ...rest,\n },\n h(BibInfo, { refs }),\n );\n}\n\nfunction useStratNameData(strat_name_id: number) {\n const stratNames = useStratNames([strat_name_id]);\n return stratNames?.[0];\n}\n\nfunction StratNameField(\n props: {\n strat_name_id: number;\n className?: string;\n } & ItemInteractionProps,\n) {\n /** Handling for stratigraphic name field */\n const { strat_name_id, className, ...rest } = props;\n const data = useStratNameData(strat_name_id);\n\n const baseInteractionProps = useInteractionProps({ strat_name_id });\n\n const coreProps = {\n ...baseInteractionProps,\n ...rest,\n };\n\n let inner: any = h(Identifier, { id: strat_name_id });\n const name = data?.strat_name_long;\n if (name != null) {\n inner = h(\"span.strat-name\", name);\n }\n\n const clickable = isClickable(coreProps);\n\n return h(\n DataField,\n {\n label: \"Stratigraphic name\",\n },\n h(\n clickable ? \"a\" : \"span\",\n {\n className: classNames({ clickable }, className),\n ...coreProps,\n },\n inner,\n ),\n );\n}\n\nfunction getThickness(unit): [string, string] {\n let minThickness = unit.min_thick ?? 0;\n let maxThickness = unit.max_thick ?? unit.min_thick ?? 0;\n let _unit = \"m\";\n\n if (minThickness == 0 && maxThickness == 0) {\n return [\"Unknown\", null];\n }\n\n if (minThickness < 0.8 && maxThickness < 1.2) {\n // Convert to cm\n minThickness = minThickness * 100;\n maxThickness = maxThickness * 100;\n _unit = \"cm\";\n } else if (minThickness > 800 && maxThickness > 1200) {\n // Convert to km\n minThickness = minThickness / 1000;\n maxThickness = maxThickness / 1000;\n _unit = \"km\";\n }\n\n if (minThickness == maxThickness) {\n return [formatSignificance(minThickness), _unit];\n }\n\n return [formatRange(minThickness, maxThickness), _unit];\n}\n\nexport function ThicknessField({ unit, label = \"Thickness\" }) {\n const [value, thicknessUnit] = getThickness(unit);\n return h(DataField, {\n label,\n value,\n unit: thicknessUnit,\n });\n}\n\nfunction BibInfo({ refs }) {\n const refData = useMacrostratData(\"refs\", refs);\n\n if (refData == null || refData.length === 0) {\n return null;\n }\n\n if (refData.length == 1) {\n return h(Citation, {\n data: refData[0],\n tag: \"span\",\n key: refData[0].ref_id,\n });\n }\n\n return h(\n \"ul.refs\",\n refData.map((data, i) =>\n h(Citation, { data, tag: \"li\", key: data.ref_id }),\n ),\n );\n}\n\nfunction Citation({ data, tag = \"p\" }) {\n return h(tag, { className: \"citation\" }, [\n h(\"span.authors\", data.author),\n \", \",\n h(\"span.year\", data.pub_year),\n \", \",\n h(\"span.title\", data.ref),\n ]);\n}\n\nfunction enhanceEnvironments(\n environments: Partial<Environment>[] | null,\n envMap: Map<number, Environment>,\n) {\n return environments?.map((env) => {\n return {\n ...(envMap?.get(env.environ_id) ?? {}),\n ...env,\n };\n });\n}\n\nfunction enhanceLithologies(\n lithologies: Partial<UnitLong[\"lith\"]>,\n lithMap: Map<number, any>,\n) {\n return lithologies?.map((lith) => {\n return {\n ...(lithMap?.get(lith.lith_id) ?? {}), // get lithology details\n ...lith, // override with the unit's specific lithology data\n };\n });\n}\n\nexport function ClickableText({\n className,\n ...rest\n}: {\n className?: string;\n children: ReactNode;\n} & ItemInteractionProps) {\n /** An optionally clickable text element */\n const clickable = isClickable(rest);\n const tag = clickable ? \"a\" : \"span\";\n return h(tag, { className: classNames(className, { clickable }), ...rest });\n}\n\nexport function Identifier({\n id,\n className,\n ...rest\n}: {\n id: number | string;\n className?: string;\n} & ItemInteractionProps) {\n /** An item that displays a numeric identifier, optionally clickable */\n return h(\n ClickableText,\n {\n className: classNames(\"identifier\", className),\n ...rest,\n },\n id,\n );\n}\n\ntype UnitInfo = {\n unitID: number;\n colID?: number;\n name?: string;\n};\n\nfunction UnitIDList({ units, showNames = false }) {\n const unitsMap = useColumnUnitsMap();\n\n const interactionManager = useInteractionManager();\n\n const extUnits: UnitInfo[] = useMemo(() => {\n const u1 = units.filter((d) => d != 0);\n if (showNames) {\n return u1.map((unitID) => {\n const unitData = unitsMap?.get(unitID);\n let name: string = undefined;\n if (unitData != null) {\n name = defaultNameFunction(unitData);\n }\n return {\n unitID,\n colID: unitData?.col_id,\n name,\n };\n });\n } else {\n return u1.map((unitID) => ({ unitID }));\n }\n }, [units, unitsMap]);\n\n if (extUnits.length === 0) {\n return h(\"span.no-units\", \"None\");\n }\n\n return h(\n ItemList,\n { className: \"units-list\" },\n extUnits.map((info) => {\n return h(\n \"span.item\",\n h(UnitIdentifier, {\n ...info,\n ...interactionManager?.interactionPropsForItem({\n unit_id: info.unitID,\n }),\n }),\n );\n }),\n );\n}\n\nfunction UnitIdentifier({\n unitID,\n colID,\n name,\n ...interactionProps\n}: UnitInfo & ItemInteractionProps) {\n if (name != null) {\n return h(\n ClickableText,\n {\n className: \"unit-name\",\n ...interactionProps,\n },\n name,\n );\n }\n\n return h(Identifier, {\n className: \"unit-id\",\n key: unitID,\n id: unitID,\n ...interactionProps,\n });\n}\n"],"names":["hyper","styles","UnitDetailsFeature"],"mappings":"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"}
1
+ {"version":3,"file":"panel.js","sources":["../../src/unit-details/panel.ts"],"sourcesContent":["import { JSONView } from \"@macrostrat/ui-components\";\nimport { Button, ButtonGroup } from \"@blueprintjs/core\";\nimport { ReactNode, useMemo, useState } from \"react\";\nimport {\n DataField,\n EnvironmentsList,\n isClickable,\n ItemInteractionProps,\n ItemList,\n LithologyList,\n LithologyTagFeature,\n MacrostratInteractionManager,\n MacrostratInteractionProvider,\n MacrostratItemIdentifier,\n Parenthetical,\n useInteractionManager,\n useInteractionProps,\n Value,\n} from \"@macrostrat/data-components\";\nimport { useColumnUnitsMap } from \"../data-provider\";\nimport {\n useMacrostratColumnInfo,\n useMacrostratData,\n useMacrostratDefs,\n useStratNames,\n} from \"@macrostrat/data-provider\";\nimport type {\n Environment,\n Interval,\n Lithology,\n UnitLithology,\n UnitLong,\n UnitLongFull,\n} from \"@macrostrat/api-types\";\nimport { defaultNameFunction } from \"../units/names\";\nimport classNames from \"classnames\";\nimport { AgeField, Duration, IntervalProportions } from \"./age-range\";\nimport { formatRange, formatSignificance } from \"./utils.ts\";\nimport h from \"./panel.module.sass\";\n\nexport interface UnitDetailsPanelProps {\n unit: any;\n onClose?: any;\n className?: string;\n actions?: ReactNode;\n hiddenActions?: ReactNode;\n features?: Set<UnitDetailsFeature>;\n lithologyFeatures?: Set<LithologyTagFeature>;\n onSelectUnit?: (unitID: number) => void;\n onClickItem?: MacrostratItemClickHandler;\n interactionManager?: MacrostratInteractionManager;\n}\n\nexport function UnitDetailsPanel({\n unit,\n onClose,\n className,\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n UnitDetailsFeature.JSONToggle,\n UnitDetailsFeature.DepthRange,\n ]),\n lithologyFeatures,\n actions,\n hiddenActions = null,\n onSelectUnit,\n onClickItem,\n}: UnitDetailsPanelProps) {\n const [showJSON, setShowJSON] = useState(false);\n\n let content: ReactNode = null;\n if (showJSON) {\n content = h(JSONView, { data: unit, showRoot: false });\n } else {\n content = h(UnitDetailsContent, {\n unit,\n features,\n lithologyFeatures,\n onClickItem,\n });\n }\n\n let title = defaultNameFunction(unit);\n\n if (features.has(UnitDetailsFeature.JSONToggle)) {\n hiddenActions = h([\n h(Button, {\n icon: \"code\",\n small: true,\n minimal: true,\n key: \"json-view-toggle\",\n className: classNames(\"json-view-toggle\", { enabled: setShowJSON }),\n onClick(evt) {\n setShowJSON(!showJSON);\n evt.stopPropagation();\n },\n }),\n hiddenActions,\n ]);\n }\n\n const main = h(\"div.unit-details-panel\", { className }, [\n h(LegendPanelHeader, {\n onClose,\n title,\n id: unit.unit_id,\n actions,\n hiddenActions,\n }),\n h(\"div.unit-details-content-holder\", content),\n ]);\n\n /** Handle unit selection clicks */\n const clickHandlerForItem = useMemo(() => {\n if (onSelectUnit == null || onClickItem == null) return null;\n return (item: MacrostratItemIdentifier) => {\n if (\"unit_id\" in item && !(\"col_id\" in item)) {\n // We are selecting a unit within the column\n return (event: MouseEvent) => {\n if (onSelectUnit != null) {\n onSelectUnit(item.unit_id);\n } else if (onClickItem != null) {\n console.warn(\n \"Unit selection: onClickItem is defined but onSelectUnit is not; ignoring click\",\n );\n }\n // Don't allow event to propagate further (e.g., to open a link)\n event.preventDefault();\n };\n }\n return undefined;\n };\n }, [onSelectUnit, onClickItem]);\n\n if (clickHandlerForItem != null) {\n // We wrap this in a MacrostratInteractionManager to handle unit selection\n return h(\n MacrostratInteractionProvider,\n {\n clickHandlerForItem,\n inherit: true,\n },\n main,\n );\n }\n\n return main;\n}\n\nexport function LegendPanelHeader({\n title,\n id,\n onClose,\n actions = null,\n hiddenActions,\n}: {\n title?: string | null;\n id?: number | null;\n onClose?: () => void;\n actions?: ReactNode | null;\n hiddenActions?: ReactNode | null;\n}) {\n return h(\"header.legend-panel-header\", [\n h(\"div.title-container\", [\n h.if(title != null)(\"h3\", title),\n h.if(hiddenActions != null)(\n \"span.hidden-actions-container\",\n h(\"div.hidden-actions\", hiddenActions),\n ),\n ]),\n h(\"div.spacer\"),\n h.if(id != null)(\"code.unit-id\", id),\n h.if(actions != null)(ButtonGroup, { minimal: true }, actions),\n h.if(onClose != null)(Button, {\n icon: \"cross\",\n minimal: true,\n small: true,\n onClick() {\n onClose?.();\n },\n }),\n ]);\n}\n\nexport enum UnitDetailsFeature {\n AdjacentUnits = \"adjacent-units\",\n Color = \"color\",\n OutcropType = \"outcrop-type\",\n JSONToggle = \"json-toggle\",\n DepthRange = \"depth-range\",\n ColumnName = \"column-name\",\n}\n\nexport type MacrostratItemClickHandler = (\n event: MouseEvent,\n item:\n | Lithology\n | Environment\n | UnitLong\n | Interval\n | { strat_name_id: number },\n) => void;\n\nfunction UnitDetailsContent({\n unit,\n lithologyFeatures = new Set([\n LithologyTagFeature.Proportion,\n LithologyTagFeature.Attributes,\n ]),\n features = new Set<UnitDetailsFeature>([\n UnitDetailsFeature.AdjacentUnits,\n UnitDetailsFeature.OutcropType,\n ]),\n onClickItem,\n getItemHref,\n}: {\n unit: UnitLong;\n lithologyFeatures?: Set<LithologyTagFeature>;\n features?: Set<UnitDetailsFeature>;\n onClickItem?: MacrostratItemClickHandler;\n getItemHref?: (item: Lithology | Environment | UnitLong) => string | null;\n}) {\n const lithMap = useMacrostratDefs(\"lithologies\");\n const envMap = useMacrostratDefs(\"environments\");\n\n const environments = enhanceEnvironments(unit.environ, envMap);\n const lithologies = enhanceLithologies(unit.lith ?? [], lithMap);\n\n let outcropField: ReactNode = null;\n if (features.has(UnitDetailsFeature.OutcropType)) {\n // Determine outcrop type\n let outcrop = unit.outcrop;\n if (outcrop == \"both\") {\n outcrop = \"surface and subsurface\";\n }\n outcropField = h(DataField, {\n label: \"Outcrop\",\n value: outcrop,\n });\n }\n\n let thicknessOrHeightRange: ReactNode = null;\n const [thickness, thicknessUnit] = getThickness(unit);\n // Proxy for actual heights in t_pos and b_pos\n if (\n features.has(UnitDetailsFeature.DepthRange) &&\n unit.t_pos != null &&\n unit.b_pos != null &&\n unit.min_thick == unit.max_thick && // We have an actual fixed height\n unit.min_thick != 0 // Not a zero thickness\n ) {\n const label = unit.t_pos < unit.b_pos ? \"Depth\" : \"Height\";\n const u1 = \"m\";\n\n thicknessOrHeightRange = h(DataField, {\n unit: u1,\n label,\n value: formatRange(unit.b_pos, unit.t_pos),\n children: h(\n Parenthetical,\n h(Value, { value: thickness, unit: thicknessUnit }),\n ),\n });\n }\n thicknessOrHeightRange ??= h(DataField, {\n label: \"Thickness\",\n value: thickness,\n unit: thicknessUnit,\n });\n\n /** We are trying to move away from passing the \"color\" parameter in the API */\n let colorSwatch: ReactNode = null;\n if (\"color\" in unit && features.has(UnitDetailsFeature.Color)) {\n const unit1 = unit as UnitLongFull;\n colorSwatch = h(\"div.color-swatch\", {\n style: { backgroundColor: unit1.color },\n });\n }\n\n return h(\"div.unit-details-content\", [\n h.if(features.has(UnitDetailsFeature.ColumnName))(ColumnNameField, {\n col_id: unit.col_id,\n }),\n thicknessOrHeightRange,\n h.if(lithologies != null)(LithologyList, {\n label: \"Lithology\",\n lithologies: lithologies ?? [],\n features: lithologyFeatures,\n }),\n h(AgeField, { unit }, [\n h(Parenthetical, h(Duration, { value: unit.b_age - unit.t_age })),\n h(IntervalProportions, {\n unit,\n onClickItem,\n }),\n ]),\n h.if(environments != null)(EnvironmentsList, {\n environments,\n }),\n h.if(unit.strat_name_id != null)(StratNameField, {\n strat_name_id: unit.strat_name_id,\n }),\n outcropField,\n h.if(features.has(UnitDetailsFeature.AdjacentUnits))([\n h.if(unit.units_above != null)(\n DataField,\n { label: \"Above\" },\n h(UnitIDList, {\n units: unit.units_above,\n showNames: true,\n }),\n ),\n h.if(unit.units_below != null)(\n DataField,\n { label: \"Below\" },\n h(UnitIDList, {\n units: unit.units_below,\n showNames: true,\n }),\n ),\n ]),\n colorSwatch,\n h(ReferencesField, { refs: unit.refs, inline: true }),\n ]);\n}\n\nfunction ColumnNameField({\n col_id,\n showIdentifier = false,\n}: {\n col_id: number;\n showIdentifier?: boolean;\n}) {\n const colData = useMacrostratColumnInfo(col_id);\n let inner: any = h(Identifier, { id: col_id });\n const name = colData?.col_name;\n if (name != null) {\n inner = h(\"span.value\", [\n h(\"span.col-name\", name),\n h.if(showIdentifier)([\" \", h(Parenthetical, inner)]),\n ]);\n }\n\n return h(\n DataField,\n {\n label: \"Column\",\n },\n inner,\n );\n}\n\nexport function ReferencesField({ refs, className = null, ...rest }) {\n if (refs == null || refs.length === 0) {\n return null;\n }\n\n return h(\n DataField,\n {\n label: \"References\",\n className: classNames(\"refs-field\", className),\n ...rest,\n },\n h(BibInfo, { refs }),\n );\n}\n\nfunction useStratNameData(strat_name_id: number) {\n const stratNames = useStratNames([strat_name_id]);\n return stratNames?.[0];\n}\n\nfunction StratNameField(\n props: {\n strat_name_id: number;\n className?: string;\n } & ItemInteractionProps,\n) {\n /** Handling for stratigraphic name field */\n const { strat_name_id, className, ...rest } = props;\n const data = useStratNameData(strat_name_id);\n\n const baseInteractionProps = useInteractionProps({ strat_name_id });\n\n const coreProps = {\n ...baseInteractionProps,\n ...rest,\n };\n\n let inner: any = h(Identifier, { id: strat_name_id });\n const name = data?.strat_name_long;\n if (name != null) {\n inner = h(\"span.strat-name\", name);\n }\n\n const clickable = isClickable(coreProps);\n\n return h(\n DataField,\n {\n label: \"Stratigraphic name\",\n },\n h(\n clickable ? \"a\" : \"span\",\n {\n className: classNames({ clickable }, className),\n ...coreProps,\n },\n inner,\n ),\n );\n}\n\nfunction getThickness(unit): [string, string] {\n let minThickness = unit.min_thick ?? 0;\n let maxThickness = unit.max_thick ?? unit.min_thick ?? 0;\n let _unit = \"m\";\n\n if (minThickness == 0 && maxThickness == 0) {\n return [\"Unknown\", null];\n }\n\n if (minThickness < 0.8 && maxThickness < 1.2) {\n // Convert to cm\n minThickness = minThickness * 100;\n maxThickness = maxThickness * 100;\n _unit = \"cm\";\n } else if (minThickness > 800 && maxThickness > 1200) {\n // Convert to km\n minThickness = minThickness / 1000;\n maxThickness = maxThickness / 1000;\n _unit = \"km\";\n }\n\n if (minThickness == maxThickness) {\n return [formatSignificance(minThickness), _unit];\n }\n\n return [formatRange(minThickness, maxThickness), _unit];\n}\n\nexport function ThicknessField({ unit, label = \"Thickness\" }) {\n const [value, thicknessUnit] = getThickness(unit);\n return h(DataField, {\n label,\n value,\n unit: thicknessUnit,\n });\n}\n\nfunction BibInfo({ refs }) {\n const refData = useMacrostratData(\"refs\", refs);\n\n if (refData == null || refData.length === 0) {\n return null;\n }\n\n if (refData.length == 1) {\n return h(Citation, {\n data: refData[0],\n tag: \"span\",\n key: refData[0].ref_id,\n });\n }\n\n return h(\n \"ul.refs\",\n refData.map((data, i) =>\n h(Citation, { data, tag: \"li\", key: data.ref_id }),\n ),\n );\n}\n\nfunction Citation({ data, tag = \"p\" }) {\n return h(tag, { className: \"citation\" }, [\n h(\"span.authors\", data.author),\n \", \",\n h(\"span.year\", data.pub_year),\n \", \",\n h(\"span.title\", data.ref),\n ]);\n}\n\nfunction enhanceEnvironments(\n environments?: Partial<Environment>[] | null,\n envMap?: Map<number, Environment> | null,\n) {\n return environments?.map((env) => {\n return {\n ...(envMap?.get(env.environ_id) ?? {}),\n ...env,\n };\n });\n}\n\ntype LithID =\n | (Partial<Lithology> & Pick<Lithology, \"lith_id\">)\n | UnitLithology\n | Lithology;\n\nfunction enhanceLithologies(\n lithologies?: LithID[] | null,\n lithMap?: Map<number, any> | null,\n) {\n return lithologies?.map((lith) => {\n return {\n ...(lithMap?.get(lith.lith_id) ?? {}), // get lithology details\n ...lith, // override with the unit's specific lithology data\n };\n });\n}\n\nexport function ClickableText({\n className,\n ...rest\n}: {\n className?: string;\n children: ReactNode;\n} & ItemInteractionProps) {\n /** An optionally clickable text element */\n const clickable = isClickable(rest);\n const tag = clickable ? \"a\" : \"span\";\n return h(tag, { className: classNames(className, { clickable }), ...rest });\n}\n\nexport function Identifier({\n id,\n className,\n ...rest\n}: {\n id: number | string;\n className?: string;\n} & ItemInteractionProps) {\n /** An item that displays a numeric identifier, optionally clickable */\n return h(\n ClickableText,\n {\n className: classNames(\"identifier\", className),\n ...rest,\n },\n id,\n );\n}\n\ntype UnitInfo = {\n unitID: number;\n colID?: number;\n name?: string;\n};\n\nfunction UnitIDList({ units, showNames = false }) {\n const unitsMap = useColumnUnitsMap();\n\n const interactionManager = useInteractionManager();\n\n const extUnits: UnitInfo[] = useMemo(() => {\n const u1 = units.filter((d) => d != 0);\n if (showNames) {\n return u1.map((unitID) => {\n const unitData = unitsMap?.get(unitID);\n let name: string = undefined;\n if (unitData != null) {\n name = defaultNameFunction(unitData);\n }\n return {\n unitID,\n colID: unitData?.col_id,\n name,\n };\n });\n } else {\n return u1.map((unitID) => ({ unitID }));\n }\n }, [units, unitsMap]);\n\n if (extUnits.length === 0) {\n return h(\"span.no-units\", \"None\");\n }\n\n return h(\n ItemList,\n { className: \"units-list\" },\n extUnits.map((info) => {\n return h(\n \"span.item\",\n h(UnitIdentifier, {\n ...info,\n ...interactionManager?.interactionPropsForItem({\n unit_id: info.unitID,\n }),\n }),\n );\n }),\n );\n}\n\nfunction UnitIdentifier({\n unitID,\n colID,\n name,\n ...interactionProps\n}: UnitInfo & ItemInteractionProps) {\n if (name != null) {\n return h(\n ClickableText,\n {\n className: \"unit-name\",\n ...interactionProps,\n },\n name,\n );\n }\n\n return h(Identifier, {\n className: \"unit-id\",\n key: unitID,\n id: unitID,\n ...interactionProps,\n });\n}\n"],"names":["UnitDetailsFeature"],"mappings":"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"}
@@ -6,4 +6,8 @@ export declare function UnitDetailsPopover({ style, children, viewportPadding, }
6
6
  }): import('react').ReactElement<{
7
7
  style: object;
8
8
  }, string | import('react').JSXElementConstructor<any>>;
9
- export declare function UnitSelectionPopover(props: Omit<UnitDetailsPanelProps, "onSelectUnit" | "unit">): import('react').DOMElement<import('react').DOMAttributes<Element>, Element>;
9
+ export declare function UnitSelectionPopover(props: Omit<UnitDetailsPanelProps, "onSelectUnit" | "unit">): import('react').ReactElement<import('react').FunctionComponentElement<{
10
+ style: object;
11
+ viewportPadding?: number;
12
+ children: React.ReactNode;
13
+ }>, string | import('react').JSXElementConstructor<any>> | null;
@@ -1,3 +1,3 @@
1
1
  export declare const formatProportion: (d: any) => any;
2
- export declare function formatRange(min: any, max: any, precision?: any): any;
3
- export declare function formatSignificance(value: any, precision?: any): any;
2
+ export declare function formatRange(min: any, max: any, precision?: null): any;
3
+ export declare function formatSignificance(value: any, precision?: null): any;
@@ -32,14 +32,14 @@ export interface LabeledUnitProps extends UnitRectOptions, Clickable, Partial<Re
32
32
  export declare function MinimalUnit(props: any): import('react').ReactElement<{
33
33
  className: any;
34
34
  style: {
35
- "--column-unit-background-color": string;
36
- "--column-stroke-color": string;
35
+ "--column-unit-background-color": string | null;
36
+ "--column-stroke-color": string | null;
37
37
  };
38
38
  }, string | import('react').JSXElementConstructor<any>>;
39
39
  declare function Unit(props: UnitProps): import('react').ReactElement<{
40
40
  className: string;
41
41
  style: {
42
- "--column-unit-background-color": string;
42
+ "--column-unit-background-color": string | undefined;
43
43
  };
44
44
  }, string | import('react').JSXElementConstructor<any>>;
45
45
  declare function LabeledUnit(props: LabeledUnitProps): import('react').FunctionComponentElement<UnitProps>;
@@ -50,5 +50,5 @@ declare function UnitBoxes<T>(props: {
50
50
  unitComponentProps?: any;
51
51
  transformDivisions?(divisions: T[]): T[];
52
52
  transformDivision?: (division: any, index: number, divisions: any[]) => T | null;
53
- }): import('react').FunctionComponentElement<any>;
53
+ }): import('react').FunctionComponentElement<any> | null;
54
54
  export { LabeledUnit, Unit, UnitBoxes, UnitProps };
@@ -1,9 +1,9 @@
1
1
  import { BaseUnit } from '@macrostrat/api-types';
2
- export declare function LabelTrackerProvider(props: any): import('react').FunctionComponentElement<import('react').ProviderProps<any>>;
2
+ export declare function LabelTrackerProvider(props: any): import('react').FunctionComponentElement<import('react').ProviderProps<null>>;
3
3
  declare function TrackedLabeledUnit({ division, nameForDivision, ...rest }: {
4
4
  [x: string]: any;
5
5
  division: any;
6
- nameForDivision?: (div: any) => any;
6
+ nameForDivision?: ((div: any) => any) | undefined;
7
7
  }): import('react').FunctionComponentElement<import('./boxes').LabeledUnitProps>;
8
8
  export declare const CompositeUnitComponent: typeof TrackedLabeledUnit;
9
9
  type BaseUnitProps = {
@@ -33,7 +33,7 @@ interface CompositeUnitProps {
33
33
  clipToFrame?: boolean;
34
34
  }
35
35
  export declare function CompositeUnitsColumn(props: CompositeUnitProps): import('react').FunctionComponentElement<import('@macrostrat/column-components').LithologyColumnProps>;
36
- export declare function AnnotatedUnitsColumn(props: ICompositeUnitProps): any;
36
+ export declare function AnnotatedUnitsColumn(props: ICompositeUnitProps): null;
37
37
  export declare function SectionLabelsColumn(props: ICompositeUnitProps): import('react').DOMElement<import('react').DOMAttributes<Element>, Element>;
38
38
  export declare function ColumnNotesProvider(props: any): import('react').FunctionComponentElement<import('react').ProviderProps<import('@macrostrat/column-components').ColumnCtx<import('@macrostrat/column-components').ColumnDivision>>>;
39
39
  export { TrackedLabeledUnit, ICompositeUnitProps };
@@ -3,7 +3,7 @@ export * from './composite';
3
3
  export * from './types';
4
4
  export * from './colors';
5
5
  export declare function UnitsColumn({ width }: {
6
- width?: number;
6
+ width?: number | undefined;
7
7
  }): import('react').FunctionComponentElement<import('@macrostrat/column-components').LithologyColumnProps>;
8
8
  export declare function SimpleUnitsColumn(props: ICompositeUnitProps): import('react').ReactElement<unknown, string | import('react').JSXElementConstructor<any>>;
9
9
  export declare function BasicUnitComponent({ division, ...rest }: {
@@ -12,16 +12,16 @@ export declare function BasicUnitComponent({ division, ...rest }: {
12
12
  }): import('react').FunctionComponentElement<{
13
13
  [x: string]: any;
14
14
  division: any;
15
- nColumns?: number;
15
+ nColumns?: number | undefined;
16
16
  }>;
17
17
  export declare function UnitComponent({ division, nColumns, ...rest }: {
18
18
  [x: string]: any;
19
19
  division: any;
20
- nColumns?: number;
20
+ nColumns?: number | undefined;
21
21
  }): import('react').FunctionComponentElement<{
22
22
  [x: string]: any;
23
23
  division: any;
24
- nameForDivision?: (div: any) => any;
24
+ nameForDivision?: ((div: any) => any) | undefined;
25
25
  }>;
26
26
  interface UnitColorOptions {
27
27
  asBackground?: boolean;
@@ -30,11 +30,11 @@ export declare function useUnitColor(unit: any, opts?: UnitColorOptions): string
30
30
  export declare function ColoredUnitComponent(props: any): import('react').FunctionComponentElement<{
31
31
  [x: string]: any;
32
32
  division: any;
33
- nColumns?: number;
33
+ nColumns?: number | undefined;
34
34
  }>;
35
35
  export declare function useUnitColorByEnvironment(unit: any, opts?: UnitColorOptions): string | null;
36
36
  export declare function EnvironmentColoredUnitComponent(props: any): import('react').FunctionComponentElement<{
37
37
  [x: string]: any;
38
38
  division: any;
39
- nColumns?: number;
39
+ nColumns?: number | undefined;
40
40
  }>;
@@ -23,11 +23,12 @@ declare function noteForDivision(div: IUnit, opts: {
23
23
  nameForDivision?: (obj: IUnit) => string;
24
24
  }): UnitNote;
25
25
  declare const defaultNameFunction: (div: any) => any;
26
- declare const UnitDataColumn: React.NamedExoticComponent<UnitDataProps>;
26
+ declare function UnitDataColumn_(props: UnitDataProps): React.FunctionComponentElement<NotesColumnProps> | null;
27
+ declare const UnitDataColumn: React.MemoExoticComponent<typeof UnitDataColumn_>;
27
28
  export interface UnitNamesProps extends UnitDataProps {
28
29
  paddingLeft?: number;
29
30
  width: number;
30
31
  onClickNote?: (note: any) => void;
31
32
  }
32
- export declare function UnitNamesColumn(props: UnitNamesProps): import('react').FunctionComponentElement<UnitDataProps>;
33
+ export declare function UnitNamesColumn(props: UnitNamesProps): React.FunctionComponentElement<UnitDataProps>;
33
34
  export { defaultNameFunction, noteForDivision, UnitDataColumn };
@@ -3,6 +3,6 @@ export declare function getBestFGDCPatternForLithologyList<T extends UnitLitholo
3
3
  lith: T;
4
4
  patternID: string;
5
5
  } | null;
6
- declare const resolveID: (d: any) => any;
6
+ declare const resolveID: (d: any) => "650" | "651" | "609" | "608" | "611" | "686" | "603" | "711" | "725" | null;
7
7
  declare const scalePattern: (id: any) => any;
8
8
  export { resolveID, scalePattern };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@macrostrat/column-views",
3
- "version": "3.3.3",
3
+ "version": "3.3.5",
4
4
  "description": "Data views for Macrostrat stratigraphic columns",
5
5
  "repository": {
6
6
  "type": "git",
@@ -46,20 +46,20 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@blueprintjs/core": "^6.11.3",
49
- "@macrostrat/api-types": "^1.1.5",
50
- "@macrostrat/color-utils": "^1.2.1",
51
- "@macrostrat/column-components": "^2.0.6",
52
- "@macrostrat/data-components": "^1.1.5",
53
- "@macrostrat/data-provider": "^1.0.2",
54
- "@macrostrat/hyper": "^3.1.0",
55
- "@macrostrat/map-interface": "^2.2.3",
56
- "@macrostrat/map-styles": "^2.1.2",
57
- "@macrostrat/mapbox-react": "^3.1.3",
58
- "@macrostrat/mapbox-utils": "^1.7.3",
59
- "@macrostrat/stratigraphy-utils": "^1.2.1",
60
- "@macrostrat/svg-map-components": "^2.0.2",
61
- "@macrostrat/timescale": "^3.1.2",
62
- "@macrostrat/ui-components": "^5.0.7",
49
+ "@macrostrat/api-types": "^1.1.6",
50
+ "@macrostrat/color-utils": "^1.2.2",
51
+ "@macrostrat/column-components": "^2.0.7",
52
+ "@macrostrat/data-components": "^1.1.9",
53
+ "@macrostrat/data-provider": "^1.0.3",
54
+ "@macrostrat/hyper": "^3.1.1",
55
+ "@macrostrat/map-interface": "^2.2.5",
56
+ "@macrostrat/map-styles": "^2.2.2",
57
+ "@macrostrat/mapbox-react": "^3.2.1",
58
+ "@macrostrat/mapbox-utils": "^1.7.4",
59
+ "@macrostrat/stratigraphy-utils": "^1.2.2",
60
+ "@macrostrat/svg-map-components": "^2.0.3",
61
+ "@macrostrat/timescale": "^3.1.3",
62
+ "@macrostrat/ui-components": "^5.0.9",
63
63
  "@turf/boolean-point-in-polygon": "^7.3.2",
64
64
  "@turf/buffer": "^7.3.2",
65
65
  "@turf/centroid": "^7.3.2",
@@ -167,7 +167,7 @@ function Package({
167
167
  }) {
168
168
  return h("g.package", { transform: `translate(0 ${offset})` }, [
169
169
  // Disable the SVG overlay for now
170
- //h(PackageSVGOverlay, { data, columnSpacing }),
170
+ //h(PackageSVGOverlay, { columnData, columnSpacing }),
171
171
  h("g.column-units", [
172
172
  columnData.map((data, i) => {
173
173
  return h(Column, {
@@ -237,7 +237,7 @@ function Column(props: ColumnProps) {
237
237
  unitComponentProps: {
238
238
  nColumns: 2,
239
239
  width: columnWidth,
240
- showLabel: false,
240
+ showLabel: true,
241
241
  },
242
242
  }),
243
243
  ),
@@ -72,7 +72,7 @@ const selectedUnitAtom = atom(
72
72
  console.error("Unit selection is disabled.");
73
73
  }
74
74
 
75
- let unitID: number | null;
75
+ let unitID: number | null = null;
76
76
  let unit: BaseUnit | null = null;
77
77
  if (selectedUnit == null) {
78
78
  unitID = null;
@@ -114,6 +114,7 @@ export interface IntervalProportionsProps extends Omit<
114
114
  unit: UnitIntervalConstraints;
115
115
  showProportions?: boolean;
116
116
  calculateProportionsFromAges?: boolean;
117
+ onClickItem?: any;
117
118
  }
118
119
 
119
120
  export function IntervalProportions({