FeatureCollectionInput

Form input for drawing and editing a GeoJSON.FeatureCollection. Each drawn shape becomes a Feature in the collection; properties are carried forward from the previous form value by index on every edit.

Installation

pnpm dlx shadcn@latest add @shadmin/feature-collection-input

Usage

import { FeatureCollectionInput } from "@/components/leaflet";
 
<Create>
  <SimpleForm>
    <FeatureCollectionInput
      source="geom"
      label="Feature collection"
      defaultCenter={[48.85, 2.35]}
      height={500}
    />
  </SimpleForm>
</Create>;

The default toolbar exposes Point, LineString, and Polygon draw modes. Restrict via allowedShapes:

<FeatureCollectionInput source="geom" allowedShapes={["Polygon"]} />

Props

PropRequiredTypeDefaultDescription
sourceRequiredstring-RHF field to write the FeatureCollection to.
allowedShapesOptionalArray<"Point" | "LineString" | "Polygon" | "MultiPoint" | "MultiLineString" | "MultiPolygon">["Point", "LineString", "Polygon"]Which draw tools to expose.
zoomOptionalnumber13Initial zoom level.
defaultCenterOptional[number, number][0, 0]Initial map center [lat, lng].
heightOptionalnumber | string300Height of the map container.
tileUrlOptionalstringOpenStreetMap tile URLTile layer URL template.
attributionOptionalstringOSM attributionTile attribution string.
pathOptionsOptionalL.PathOptions-Vector styling for the drawn shapes.
snappableOptionalbooleantrueEnable Geoman snap-to-vertex.
snapDistanceOptionalnumber20Snap radius in pixels.
labelOptionalReactNode-Label rendered above the map.
helperTextOptionalReactNode-Helper text rendered below the map.
disabledOptionalbooleanfalseDisable editing.
validateOptional(v) => string | undefined-RHF-compatible validator(s).

Property preservation

Per-feature properties are matched by index to the previous form value. Removing a feature can shift subsequent indices, so this is best-effort: if attribute fidelity across removal is critical, persist properties keyed on a stable id in the host application instead of relying on positional matching.