@panneau/fields 5.0.0-alpha.14 → 5.0.0-alpha.16
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/README.md +53 -3
- package/dist/address/AddressField.css +44 -0
- package/dist/address/AddressField.d.ts +37 -0
- package/dist/address/AddressField.d.ts.map +1 -0
- package/dist/address/AddressField.js +411 -0
- package/dist/address/AddressField.js.map +1 -0
- package/dist/address/AddressField.module.js +22 -0
- package/dist/address/AddressField.module.js.map +1 -0
- package/dist/address/address.d.ts +23 -0
- package/dist/address/address.d.ts.map +1 -0
- package/dist/address/address.js +58 -0
- package/dist/address/address.js.map +1 -0
- package/dist/address/index.d.ts +3 -0
- package/dist/address/index.d.ts.map +1 -0
- package/dist/address/index.js +3 -0
- package/dist/color/ColorField.css +9 -0
- package/dist/color/ColorField.d.ts +10 -3
- package/dist/color/ColorField.d.ts.map +1 -1
- package/dist/color/ColorField.js +341 -81
- package/dist/color/ColorField.js.map +1 -1
- package/dist/color/ColorField.module.js +4 -2
- package/dist/color/ColorField.module.js.map +1 -1
- package/dist/color/index.d.ts +1 -0
- package/dist/color/index.d.ts.map +1 -1
- package/dist/color/index.js +3 -1
- package/dist/color/palette.d.ts +23 -0
- package/dist/color/palette.d.ts.map +1 -0
- package/dist/color/palette.js +34 -0
- package/dist/color/palette.js.map +1 -0
- package/dist/country/CountryField.css +42 -0
- package/dist/country/CountryField.d.ts +19 -4
- package/dist/country/CountryField.d.ts.map +1 -1
- package/dist/country/CountryField.js +355 -82
- package/dist/country/CountryField.js.map +1 -1
- package/dist/country/CountryField.module.js +20 -0
- package/dist/country/CountryField.module.js.map +1 -0
- package/dist/country/index.d.ts +1 -1
- package/dist/country/index.d.ts.map +1 -1
- package/dist/daterange/DateRangeField.css +9 -0
- package/dist/daterange/DateRangeField.d.ts +31 -0
- package/dist/daterange/DateRangeField.d.ts.map +1 -0
- package/dist/daterange/DateRangeField.js +372 -0
- package/dist/daterange/DateRangeField.js.map +1 -0
- package/dist/daterange/DateRangeField.module.js +12 -0
- package/dist/daterange/DateRangeField.module.js.map +1 -0
- package/dist/daterange/index.d.ts +3 -0
- package/dist/daterange/index.d.ts.map +1 -0
- package/dist/daterange/index.js +3 -0
- package/dist/daterange/range.d.ts +61 -0
- package/dist/daterange/range.d.ts.map +1 -0
- package/dist/daterange/range.js +119 -0
- package/dist/daterange/range.js.map +1 -0
- package/dist/duration/DurationField.css +1 -1
- package/dist/duration/DurationField.d.ts +54 -13
- package/dist/duration/DurationField.d.ts.map +1 -1
- package/dist/duration/DurationField.js +205 -159
- package/dist/duration/DurationField.js.map +1 -1
- package/dist/duration/DurationField.module.js.map +1 -1
- package/dist/duration/index.d.ts +1 -1
- package/dist/duration/index.d.ts.map +1 -1
- package/dist/duration/index.js +1 -1
- package/dist/embed/EmbedField.d.ts +11 -2
- package/dist/embed/EmbedField.d.ts.map +1 -1
- package/dist/embed/EmbedField.js +179 -116
- package/dist/embed/EmbedField.js.map +1 -1
- package/dist/link/LinkField.css +12 -0
- package/dist/link/LinkField.d.ts +38 -0
- package/dist/link/LinkField.d.ts.map +1 -0
- package/dist/link/LinkField.js +742 -0
- package/dist/link/LinkField.js.map +1 -0
- package/dist/link/LinkField.module.js +8 -0
- package/dist/link/LinkField.module.js.map +1 -0
- package/dist/link/index.d.ts +3 -0
- package/dist/link/index.d.ts.map +1 -0
- package/dist/link/index.js +3 -0
- package/dist/link/link.d.ts +30 -0
- package/dist/link/link.d.ts.map +1 -0
- package/dist/link/link.js +63 -0
- package/dist/link/link.js.map +1 -0
- package/dist/link/pages.d.ts +17 -0
- package/dist/link/pages.d.ts.map +1 -0
- package/dist/link/pages.js +104 -0
- package/dist/link/pages.js.map +1 -0
- package/dist/location/LocationField.d.ts.map +1 -1
- package/dist/location/LocationField.js +9 -85
- package/dist/location/LocationField.js.map +1 -1
- package/dist/location/nominatim.d.ts +8 -2
- package/dist/location/nominatim.d.ts.map +1 -1
- package/dist/location/nominatim.js +32 -3
- package/dist/location/nominatim.js.map +1 -1
- package/dist/location/search.d.ts +10 -0
- package/dist/location/search.d.ts.map +1 -0
- package/dist/location/search.js +83 -0
- package/dist/location/search.js.map +1 -0
- package/dist/location/types.d.ts +8 -2
- package/dist/location/types.d.ts.map +1 -1
- package/dist/money/MoneyField.d.ts +28 -0
- package/dist/money/MoneyField.d.ts.map +1 -0
- package/dist/money/MoneyField.js +269 -0
- package/dist/money/MoneyField.js.map +1 -0
- package/dist/money/index.d.ts +3 -0
- package/dist/money/index.d.ts.map +1 -0
- package/dist/money/index.js +3 -0
- package/dist/money/money.d.ts +27 -0
- package/dist/money/money.d.ts.map +1 -0
- package/dist/money/money.js +56 -0
- package/dist/money/money.js.map +1 -0
- package/dist/region/RegionField.js +1 -1
- package/dist/shared/builtIn.d.ts +3 -1
- package/dist/shared/builtIn.d.ts.map +1 -1
- package/dist/shared/builtIn.js +18 -8
- package/dist/shared/builtIn.js.map +1 -1
- package/dist/shared/dates.js +2 -2
- package/dist/shared/dates.js.map +1 -1
- package/dist/shared/flow.d.ts.map +1 -1
- package/dist/shared/flow.js +1 -0
- package/dist/shared/flow.js.map +1 -1
- package/dist/shared/part.d.ts +26 -0
- package/dist/shared/part.d.ts.map +1 -0
- package/dist/shared/part.js +64 -0
- package/dist/shared/part.js.map +1 -0
- package/dist/tel/TelField.css +25 -0
- package/dist/tel/TelField.d.ts +14 -2
- package/dist/tel/TelField.d.ts.map +1 -1
- package/dist/tel/TelField.js +246 -145
- package/dist/tel/TelField.js.map +1 -1
- package/dist/tel/TelField.module.js +12 -0
- package/dist/tel/TelField.module.js.map +1 -0
- package/dist/tel/index.d.ts +1 -1
- package/dist/tel/index.d.ts.map +1 -1
- package/dist/tel/index.js +2 -2
- package/dist/tel/phone.d.ts +28 -0
- package/dist/tel/phone.d.ts.map +1 -1
- package/dist/tel/phone.js +48 -1
- package/dist/tel/phone.js.map +1 -1
- package/dist/url/UrlField.d.ts.map +1 -1
- package/dist/url/UrlField.js +1 -1
- package/dist/url/UrlField.js.map +1 -1
- package/package.json +24 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocationField.js","names":["X","useEffect","useRef","useState","LocationValue","ComboBox","Fieldset","IconButton","NumberInput","TextInput","usePanneauIntl","useFieldsContext","getFieldProps","getSetting","isNumber","isString","messages","FieldEntryProps","FieldProps","styles","LocationMap","Point","GeocodingResult","GeocodingSource","MapTiles","OPEN_STREET_MAP_TILES","url","attribution","maxZoom","SEARCH_DELAY","SEARCH_MIN_LENGTH","DEFAULT_CENTER","lat","lng","LocationFieldProps","geocoding","tiles","center","zoom","isLocation","value","Record","useAddressSearch","query","locale","$","_c","t0","Symbol","for","results","loading","state","setState","t1","t2","text","trim","length","controller","AbortController","timeout","window","setTimeout","_temp","search","signal","then","catch","aborted","clearTimeout","abort","t3","current","LocationField","onChange","onBlur","geocodingProp","tilesProp","label","description","errors","disabled","readOnly","required","className","undefined","intl","maps","editable","setQuery","chosen","setChosen","places","addressRef","t4","requestAnimationFrame","querySelector","focus","focusAddress","t5","t6","t7","source","draft","setDraft","t8","address","point","newAddress","next","Number","toFixed","reverse","place","_temp2","setPoint","t9","key","number","next_0","setCoordinate","t10","point_0","t11","formatMessage","searchAddress","map","_temp3","searchAddressHint","count","noPlaces","id","result_0","result","t12","next_1","t13","t14","t15","t16","latitude","t17","next_2","t18","t19","maximumFractionDigits","t20","coordinate","t21","longitude","t22","next_3","t23","t24","t25","t26","removePoint","remove","t27","coordinates","t28","address_0","t29","location","t30","index","String","isPoint","LocationFieldEntry","props","field","_temp4","fieldProps","placeholder","_placeholder","_c","styles"],"sources":["../../src/location/LocationField.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { LocationValue } from '@panneau/protocol';\nimport {\n ComboBox,\n Fieldset,\n IconButton,\n NumberInput,\n TextInput,\n usePanneauIntl,\n} from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { getFieldProps, getSetting, isNumber, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './LocationField.module.css';\nimport { LocationMap, type Point } from './LocationMap';\nimport type { GeocodingResult, GeocodingSource, MapTiles } from './types';\n\nexport type { LocationValue };\n\n/** OpenStreetMap's standard tiles: fine for an admin panel, with their credit. */\nexport const OPEN_STREET_MAP_TILES: MapTiles = {\n url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',\n attribution:\n '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors',\n maxZoom: 19,\n};\n\nconst SEARCH_DELAY = 400;\nconst SEARCH_MIN_LENGTH = 3;\nconst DEFAULT_CENTER: Point = { lat: 20, lng: 0 };\n\nexport interface LocationFieldProps extends FieldProps<LocationValue> {\n /** The address search. Defaults to that of the `FieldsProvider`; without one, there is none. */\n geocoding?: GeocodingSource | null;\n /** The tiles of the map. Defaults to those of the `FieldsProvider`, or OpenStreetMap's. */\n tiles?: MapTiles;\n /** Where the map opens without a point. Defaults to the whole world. */\n center?: Point;\n /** Zoom of the map on a point. Defaults to 15. */\n zoom?: number;\n}\n\n/** Whether a value is a point. */\nexport function isLocation(value: unknown): value is LocationValue {\n return (\n value !== null &&\n typeof value === 'object' &&\n isNumber((value as Record<string, unknown>).lat) &&\n isNumber((value as Record<string, unknown>).lng)\n );\n}\n\n/** The search of addresses: results of the text typed, after a pause. */\nfunction useAddressSearch(geocoding: GeocodingSource | null, query: string, locale: string) {\n const [state, setState] = useState<{\n query: string;\n results: GeocodingResult[];\n loading: boolean;\n }>({ query: '', results: [], loading: false });\n useEffect(() => {\n const text = query.trim();\n if (geocoding === null || text.length < SEARCH_MIN_LENGTH) {\n return undefined;\n }\n const controller = new AbortController();\n const timeout = window.setTimeout(() => {\n setState((current) => ({ ...current, loading: true }));\n geocoding\n .search(text, { signal: controller.signal, locale })\n .then((results) => setState({ query: text, results, loading: false }))\n .catch(() => {\n if (!controller.signal.aborted) {\n setState({ query: text, results: [], loading: false });\n }\n });\n }, SEARCH_DELAY);\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [geocoding, query, locale]);\n return query.trim().length >= SEARCH_MIN_LENGTH ? state : { ...state, results: [] };\n}\n\n/**\n * A point on a map, and its address. Clicking the map or dragging the marker places the point,\n * and its latitude and longitude can be typed. With an address search, a place found sets the\n * point and the address; with a reverse search, placing a point fills an empty address.\n */\nexport function LocationField({\n value,\n onChange,\n onBlur,\n geocoding: geocodingProp,\n tiles: tilesProp,\n center = DEFAULT_CENTER,\n zoom = 15,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n}: LocationFieldProps) {\n const intl = usePanneauIntl();\n const { maps } = useFieldsContext();\n const geocoding = geocodingProp === undefined ? (maps?.geocoding ?? null) : geocodingProp;\n const tiles = tilesProp ?? maps?.tiles ?? OPEN_STREET_MAP_TILES;\n const editable = disabled !== true && readOnly !== true;\n const [query, setQuery] = useState('');\n // The place chosen: the search shows its label until something else is typed\n const [chosen, setChosen] = useState<GeocodingResult | null>(null);\n const search = useAddressSearch(\n editable && query !== chosen?.label ? geocoding : null,\n query,\n intl.locale,\n );\n const places = chosen !== null && query === chosen.label ? [chosen] : search.results;\n // A place chosen moves focus to its address, which closes the results\n const addressRef = useRef<HTMLDivElement>(null);\n const focusAddress = () =>\n window.requestAnimationFrame(() =>\n addressRef.current?.querySelector<HTMLInputElement>('input')?.focus(),\n );\n\n // The coordinates as typed: a value needs both\n const [draft, setDraft] = useState<{ source: unknown; lat: number | null; lng: number | null }>(\n { source: value, lat: value?.lat ?? null, lng: value?.lng ?? null },\n );\n if (draft.source !== value) {\n setDraft({ source: value, lat: value?.lat ?? null, lng: value?.lng ?? null });\n }\n\n const setPoint = (point: Point, newAddress?: string) => {\n const address = newAddress ?? value?.address;\n const next: LocationValue = {\n lat: Number(point.lat.toFixed(6)),\n lng: Number(point.lng.toFixed(6)),\n ...(address !== undefined && address !== '' ? { address } : {}),\n };\n onChange?.(next);\n // Fills an empty address from the point\n if ((address === undefined || address === '') && geocoding?.reverse !== undefined) {\n const controller = new AbortController();\n void geocoding\n .reverse(point, { signal: controller.signal, locale: intl.locale })\n .then((place) => {\n if (place !== null) {\n onChange?.({ ...next, address: place.label });\n }\n })\n .catch(() => undefined);\n }\n };\n\n const setCoordinate = (key: 'lat' | 'lng', number: number | null) => {\n const next = { ...draft, [key]: number };\n setDraft(next);\n if (next.lat !== null && next.lng !== null) {\n setPoint({ lat: next.lat, lng: next.lng });\n } else if (next.lat === null && next.lng === null) {\n onChange?.(null);\n }\n };\n\n const point = isLocation(value) ? { lat: value.lat, lng: value.lng } : null;\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n >\n <div className={styles.location}>\n {editable && geocoding !== null ? (\n <ComboBox\n aria-label={intl.formatMessage(messages.searchAddress)}\n placeholder={intl.formatMessage(messages.searchAddress)}\n onInputChange={setQuery}\n items={places.map((result, index) => ({\n id: String(index),\n label: result.label,\n }))}\n isLoading={search.loading}\n menuTrigger=\"input\"\n emptyMessage={\n query.trim().length < SEARCH_MIN_LENGTH\n ? intl.formatMessage(messages.searchAddressHint, {\n count: SEARCH_MIN_LENGTH,\n })\n : intl.formatMessage(messages.noPlaces)\n }\n value={chosen !== null && query === chosen.label ? '0' : null}\n onChange={(id) => {\n const result = id !== null ? places[Number(id)] : undefined;\n if (result !== undefined) {\n setChosen(result);\n setPoint(result, result.label);\n focusAddress();\n }\n }}\n />\n ) : null}\n <LocationMap\n point={point}\n onChange={(next) => setPoint(next)}\n tiles={tiles}\n center={center}\n zoom={zoom}\n readOnly={!editable}\n label={intl.formatMessage(messages.map, {\n label: typeof label === 'string' ? label : '',\n })}\n />\n <div className={styles.coordinates}>\n <NumberInput\n label={intl.formatMessage(messages.latitude)}\n value={draft.lat}\n onChange={(next) => setCoordinate('lat', next)}\n onBlur={() => onBlur?.()}\n minValue={-90}\n maxValue={90}\n step={0.000001}\n formatOptions={{ maximumFractionDigits: 6 }}\n isDisabled={disabled}\n isReadOnly={readOnly}\n className={styles.coordinate}\n />\n <NumberInput\n label={intl.formatMessage(messages.longitude)}\n value={draft.lng}\n onChange={(next) => setCoordinate('lng', next)}\n onBlur={() => onBlur?.()}\n minValue={-180}\n maxValue={180}\n step={0.000001}\n formatOptions={{ maximumFractionDigits: 6 }}\n isDisabled={disabled}\n isReadOnly={readOnly}\n className={styles.coordinate}\n />\n {editable && point !== null ? (\n <IconButton\n icon={X}\n label={intl.formatMessage(messages.removePoint)}\n className={styles.remove}\n onPress={() => onChange?.(null)}\n />\n ) : null}\n </div>\n {point !== null ? (\n <div ref={addressRef}>\n <TextInput\n label={intl.formatMessage(messages.address)}\n value={value?.address ?? ''}\n onChange={(address) =>\n onChange?.({\n lat: point.lat,\n lng: point.lng,\n ...(address !== '' ? { address } : {}),\n })\n }\n onBlur={() => onBlur?.()}\n isDisabled={disabled}\n isReadOnly={readOnly}\n />\n </div>\n ) : null}\n </div>\n </Fieldset>\n );\n}\n\nfunction isPoint(value: unknown): value is Point {\n return isLocation(value);\n}\n\n/**\n * The `location` type: settings `zoom`, `center` (`{ \"lat\", \"lng\" }`, where the map opens without\n * a point) and `tiles` (`{ \"url\", \"attribution\" }`), over the maps of the `FieldsProvider`.\n */\nexport function LocationFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const zoom = getSetting(field, 'zoom', isNumber);\n const center = getSetting(field, 'center', isPoint);\n const tiles = getSetting(\n field,\n 'tiles',\n (value): value is MapTiles =>\n value !== null &&\n typeof value === 'object' &&\n isString((value as Record<string, unknown>).url) &&\n isString((value as Record<string, unknown>).attribution),\n );\n const { placeholder: _placeholder, ...fieldProps } = getFieldProps(props);\n return (\n <LocationField\n {...fieldProps}\n value={isLocation(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(zoom !== undefined ? { zoom } : {})}\n {...(center !== undefined ? { center } : {})}\n {...(tiles !== undefined ? { tiles } : {})}\n />\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LocationField.js","names":["X","useRef","useState","LocationValue","ComboBox","Fieldset","IconButton","NumberInput","TextInput","usePanneauIntl","useFieldsContext","getFieldProps","getSetting","isNumber","isString","messages","FieldEntryProps","FieldProps","styles","LocationMap","Point","SEARCH_MIN_LENGTH","useAddressSearch","GeocodingResult","GeocodingSource","MapTiles","OPEN_STREET_MAP_TILES","url","attribution","maxZoom","DEFAULT_CENTER","lat","lng","LocationFieldProps","geocoding","tiles","center","zoom","isLocation","value","Record","LocationField","t0","$","_c","onChange","onBlur","geocodingProp","tilesProp","t1","t2","label","description","errors","disabled","readOnly","required","className","undefined","intl","maps","editable","query","setQuery","chosen","setChosen","search","locale","t3","results","places","addressRef","t4","Symbol","for","window","requestAnimationFrame","current","querySelector","focus","focusAddress","t5","t6","t7","source","draft","setDraft","t8","address","point","newAddress","next","Number","toFixed","reverse","controller","AbortController","signal","then","place","catch","_temp","setPoint","t9","key","number","next_0","setCoordinate","t10","point_0","t11","formatMessage","searchAddress","map","_temp2","loading","trim","length","searchAddressHint","count","noPlaces","id","result_0","result","t12","next_1","t13","t14","t15","t16","latitude","t17","next_2","t18","t19","maximumFractionDigits","t20","coordinate","t21","longitude","t22","next_3","t23","t24","t25","t26","removePoint","remove","t27","coordinates","t28","address_0","t29","location","t30","index","String","isPoint","LocationFieldEntry","props","field","_temp3","fieldProps","placeholder","_placeholder","_c","styles"],"sources":["../../src/location/LocationField.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport { useRef, useState } from 'react';\n\nimport type { LocationValue } from '@panneau/protocol';\nimport {\n ComboBox,\n Fieldset,\n IconButton,\n NumberInput,\n TextInput,\n usePanneauIntl,\n} from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { getFieldProps, getSetting, isNumber, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './LocationField.module.css';\nimport { LocationMap, type Point } from './LocationMap';\nimport { SEARCH_MIN_LENGTH, useAddressSearch } from './search';\nimport type { GeocodingResult, GeocodingSource, MapTiles } from './types';\n\nexport type { LocationValue };\n\n/** OpenStreetMap's standard tiles: fine for an admin panel, with their credit. */\nexport const OPEN_STREET_MAP_TILES: MapTiles = {\n url: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',\n attribution:\n '© <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors',\n maxZoom: 19,\n};\n\nconst DEFAULT_CENTER: Point = { lat: 20, lng: 0 };\n\nexport interface LocationFieldProps extends FieldProps<LocationValue> {\n /** The address search. Defaults to that of the `FieldsProvider`; without one, there is none. */\n geocoding?: GeocodingSource | null;\n /** The tiles of the map. Defaults to those of the `FieldsProvider`, or OpenStreetMap's. */\n tiles?: MapTiles;\n /** Where the map opens without a point. Defaults to the whole world. */\n center?: Point;\n /** Zoom of the map on a point. Defaults to 15. */\n zoom?: number;\n}\n\n/** Whether a value is a point. */\nexport function isLocation(value: unknown): value is LocationValue {\n return (\n value !== null &&\n typeof value === 'object' &&\n isNumber((value as Record<string, unknown>).lat) &&\n isNumber((value as Record<string, unknown>).lng)\n );\n}\n\n/**\n * A point on a map, and its address. Clicking the map or dragging the marker places the point,\n * and its latitude and longitude can be typed. With an address search, a place found sets the\n * point and the address; with a reverse search, placing a point fills an empty address.\n */\nexport function LocationField({\n value,\n onChange,\n onBlur,\n geocoding: geocodingProp,\n tiles: tilesProp,\n center = DEFAULT_CENTER,\n zoom = 15,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n}: LocationFieldProps) {\n const intl = usePanneauIntl();\n const { maps } = useFieldsContext();\n const geocoding = geocodingProp === undefined ? (maps?.geocoding ?? null) : geocodingProp;\n const tiles = tilesProp ?? maps?.tiles ?? OPEN_STREET_MAP_TILES;\n const editable = disabled !== true && readOnly !== true;\n const [query, setQuery] = useState('');\n // The place chosen: the search shows its label until something else is typed\n const [chosen, setChosen] = useState<GeocodingResult | null>(null);\n const search = useAddressSearch(\n editable && query !== chosen?.label ? geocoding : null,\n query,\n intl.locale,\n );\n const places = chosen !== null && query === chosen.label ? [chosen] : search.results;\n // A place chosen moves focus to its address, which closes the results\n const addressRef = useRef<HTMLDivElement>(null);\n const focusAddress = () =>\n window.requestAnimationFrame(() =>\n addressRef.current?.querySelector<HTMLInputElement>('input')?.focus(),\n );\n\n // The coordinates as typed: a value needs both\n const [draft, setDraft] = useState<{ source: unknown; lat: number | null; lng: number | null }>(\n { source: value, lat: value?.lat ?? null, lng: value?.lng ?? null },\n );\n if (draft.source !== value) {\n setDraft({ source: value, lat: value?.lat ?? null, lng: value?.lng ?? null });\n }\n\n const setPoint = (point: Point, newAddress?: string) => {\n const address = newAddress ?? value?.address;\n const next: LocationValue = {\n lat: Number(point.lat.toFixed(6)),\n lng: Number(point.lng.toFixed(6)),\n ...(address !== undefined && address !== '' ? { address } : {}),\n };\n onChange?.(next);\n // Fills an empty address from the point\n if ((address === undefined || address === '') && geocoding?.reverse !== undefined) {\n const controller = new AbortController();\n void geocoding\n .reverse(point, { signal: controller.signal, locale: intl.locale })\n .then((place) => {\n if (place !== null) {\n onChange?.({ ...next, address: place.label });\n }\n })\n .catch(() => undefined);\n }\n };\n\n const setCoordinate = (key: 'lat' | 'lng', number: number | null) => {\n const next = { ...draft, [key]: number };\n setDraft(next);\n if (next.lat !== null && next.lng !== null) {\n setPoint({ lat: next.lat, lng: next.lng });\n } else if (next.lat === null && next.lng === null) {\n onChange?.(null);\n }\n };\n\n const point = isLocation(value) ? { lat: value.lat, lng: value.lng } : null;\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n >\n <div className={styles.location}>\n {editable && geocoding !== null ? (\n <ComboBox\n aria-label={intl.formatMessage(messages.searchAddress)}\n placeholder={intl.formatMessage(messages.searchAddress)}\n onInputChange={setQuery}\n items={places.map((result, index) => ({\n id: String(index),\n label: result.label,\n }))}\n isLoading={search.loading}\n menuTrigger=\"input\"\n emptyMessage={\n query.trim().length < SEARCH_MIN_LENGTH\n ? intl.formatMessage(messages.searchAddressHint, {\n count: SEARCH_MIN_LENGTH,\n })\n : intl.formatMessage(messages.noPlaces)\n }\n value={chosen !== null && query === chosen.label ? '0' : null}\n onChange={(id) => {\n const result = id !== null ? places[Number(id)] : undefined;\n if (result !== undefined) {\n setChosen(result);\n setPoint(result, result.label);\n focusAddress();\n }\n }}\n />\n ) : null}\n <LocationMap\n point={point}\n onChange={(next) => setPoint(next)}\n tiles={tiles}\n center={center}\n zoom={zoom}\n readOnly={!editable}\n label={intl.formatMessage(messages.map, {\n label: typeof label === 'string' ? label : '',\n })}\n />\n <div className={styles.coordinates}>\n <NumberInput\n label={intl.formatMessage(messages.latitude)}\n value={draft.lat}\n onChange={(next) => setCoordinate('lat', next)}\n onBlur={() => onBlur?.()}\n minValue={-90}\n maxValue={90}\n step={0.000001}\n formatOptions={{ maximumFractionDigits: 6 }}\n isDisabled={disabled}\n isReadOnly={readOnly}\n className={styles.coordinate}\n />\n <NumberInput\n label={intl.formatMessage(messages.longitude)}\n value={draft.lng}\n onChange={(next) => setCoordinate('lng', next)}\n onBlur={() => onBlur?.()}\n minValue={-180}\n maxValue={180}\n step={0.000001}\n formatOptions={{ maximumFractionDigits: 6 }}\n isDisabled={disabled}\n isReadOnly={readOnly}\n className={styles.coordinate}\n />\n {editable && point !== null ? (\n <IconButton\n icon={X}\n label={intl.formatMessage(messages.removePoint)}\n className={styles.remove}\n onPress={() => onChange?.(null)}\n />\n ) : null}\n </div>\n {point !== null ? (\n <div ref={addressRef}>\n <TextInput\n label={intl.formatMessage(messages.address)}\n value={value?.address ?? ''}\n onChange={(address) =>\n onChange?.({\n lat: point.lat,\n lng: point.lng,\n ...(address !== '' ? { address } : {}),\n })\n }\n onBlur={() => onBlur?.()}\n isDisabled={disabled}\n isReadOnly={readOnly}\n />\n </div>\n ) : null}\n </div>\n </Fieldset>\n );\n}\n\nfunction isPoint(value: unknown): value is Point {\n return isLocation(value);\n}\n\n/**\n * The `location` type: settings `zoom`, `center` (`{ \"lat\", \"lng\" }`, where the map opens without\n * a point) and `tiles` (`{ \"url\", \"attribution\" }`), over the maps of the `FieldsProvider`.\n */\nexport function LocationFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const zoom = getSetting(field, 'zoom', isNumber);\n const center = getSetting(field, 'center', isPoint);\n const tiles = getSetting(\n field,\n 'tiles',\n (value): value is MapTiles =>\n value !== null &&\n typeof value === 'object' &&\n isString((value as Record<string, unknown>).url) &&\n isString((value as Record<string, unknown>).attribution),\n );\n const { placeholder: _placeholder, ...fieldProps } = getFieldProps(props);\n return (\n <LocationField\n {...fieldProps}\n value={isLocation(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(zoom !== undefined ? { zoom } : {})}\n {...(center !== undefined ? { center } : {})}\n {...(tiles !== undefined ? { tiles } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,IAAa0B,wBAAkC;CAC3CC,KAAK;CACLC,aACI;CACJC,SAAS;AACb;AAEA,IAAMC,iBAAwB;CAAEC,KAAK;CAAIC,KAAK;AAAE;;AAchD,SAAgBM,WAAWC,OAAwC;CAC/D,OACIA,UAAU,QACV,OAAOA,UAAU,YACjB1B,SAAU0B,MAAkCR,GAAG,KAC/ClB,SAAU0B,MAAkCP,GAAG;AAEvD;;;;;;AAOA,SAAOS,cAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAuB,MAAA,EAAAL,OAAAM,UAAAC,QAAAZ,WAAAa,eAAAZ,OAAAa,WAAAZ,QAAAa,IAAAZ,MAAAa,IAAAC,OAAAC,aAAAC,QAAAC,UAAAC,UAAAC,UAAAC,cAAAf;CAM1B,MAAAN,SAAAa,OAAAS,KAAAA,IAAA5B,iBAAAmB;CACA,MAAAZ,OAAAa,OAAAQ,KAAAA,IAAA,KAAAR;CASA,MAAAS,OAAalD,eAAe;CAC5B,MAAA,EAAAmD,SAAiBlD,iBAAiB;CAClC,MAAAwB,YAAkBa,kBAAkBW,KAAAA,IAAaE,MAAI1B,aAAJ,OAA/Ba;CAClB,MAAAZ,QAAca,aAAaY,MAAIzB,SAAjBT;CACd,MAAAmC,WAAiBP,aAAa,QAAQC,aAAa;CACnD,MAAA,CAAAO,OAAAC,YAA0B7D,SAAS,EAAE;CAErC,MAAA,CAAA8D,QAAAC,aAA4B/D,SAAiC,IAAI;CACjE,MAAAgE,SAAe5C,iBACXuC,YAAYC,UAAUE,QAAMb,QAA5BjB,YAAA,MACA4B,OACAH,KAAIQ,MACR;CAAE,IAAAC;CAAA,IAAAzB,EAAA,OAAAqB,UAAArB,EAAA,OAAAmB,SAAAnB,EAAA,OAAAuB,QAAA;EACaE,KAAAJ,WAAW,QAAQF,UAAUE,OAAMb,QAAnC,CAA6Ca,MAAM,IAAIE,OAAMG;EAAQ1B,EAAA,KAAAqB;EAAArB,EAAA,KAAAmB;EAAAnB,EAAA,KAAAuB;EAAAvB,EAAA,KAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAApF,MAAA2B,SAAeF;CAEf,MAAAG,aAAmBtE,OAAuB,IAAI;CAAE,IAAAuE;CAAA,IAAA7B,EAAA,OAAA8B,OAAAC,IAAA,2BAAA,GAAA;EAC3BF,WACjBG,OAAMC,4BACFL,WAAUM,SAAuBC,cAAmB,OAAc,CAAC,EAAAC,MAAC,CACxE;EAACpC,EAAA,KAAA6B;CAAA,OAAAA,KAAA7B,EAAA;CAHL,MAAAqC,eAAqBR;CAOK,MAAAS,KAAA1C,OAAKR,OAAL;CAAyB,MAAAmD,KAAA3C,OAAKP,OAAL;CAAkB,IAAAmD;CAAA,IAAAxC,EAAA,OAAAsC,MAAAtC,EAAA,OAAAuC,MAAAvC,EAAA,OAAAJ,OAAA;EAAjE4C,KAAA;GAAAC,QAAU7C;GAAKR,KAAOkD;GAAkBjD,KAAOkD;EAAmB;EAACvC,EAAA,KAAAsC;EAAAtC,EAAA,KAAAuC;EAAAvC,EAAA,KAAAJ;EAAAI,EAAA,KAAAwC;CAAA,OAAAA,KAAAxC,EAAA;CADvE,MAAA,CAAA0C,OAAAC,YAA0BpF,SACtBiF,EACJ;CACA,IAAIE,MAAKD,WAAY7C,OACjB+C,SAAS;EAAAF,QAAU7C;EAAKR,KAAOQ,OAAKR,OAAL;EAAkBC,KAAOO,OAAKP,OAAL;CAAmB,CAAC;CAC/E,IAAAuD;CAAA,IAAA5C,EAAA,OAAAT,aAAAS,EAAA,QAAAgB,KAAAQ,UAAAxB,EAAA,QAAAE,YAAAF,EAAA,QAAAJ,OAAAiD,SAAA;EAEgBD,MAAAE,OAAAC,eAAA;GACb,MAAAF,UAAgBE,cAAcnD,OAAKiD;GACnC,MAAAG,OAA4B;IAAA5D,KACnB6D,OAAOH,MAAK1D,IAAI8D,QAAS,CAAC,CAAC;IAAC7D,KAC5B4D,OAAOH,MAAKzD,IAAI6D,QAAS,CAAC,CAAC;IAAC,GAC7BL,YAAY9B,KAAAA,KAAa8B,YAAY,KAArC,EAAAA,QAAyD,IAAzD,CAAyD;GACjE;GACA3C,WAAW8C,IAAI;GAEf,KAAKH,YAAY9B,KAAAA,KAAa8B,YAAY,OAAOtD,WAAS4D,YAAcpC,KAAAA,GAAS;IAC7E,MAAAqC,aAAmB,IAAIC,gBAAgB;IAClC9D,UAAS4D,QACDL,OAAO;KAAAQ,QAAUF,WAAUE;KAAO9B,QAAUR,KAAIQ;IAAQ,CAAC,CAAC,CAAA+B,MAC7DC,UAAA;KACF,IAAIA,UAAU,MACVtD,WAAW;MAAA,GAAK8C;MAAIH,SAAWW,MAAKhD;KAAO,CAAC;IAC/C,CACJ,CAAC,CAAAiD,MACKC,KAAe;GAAC;EAC9B;EACJ1D,EAAA,KAAAT;EAAAS,EAAA,MAAAgB,KAAAQ;EAAAxB,EAAA,MAAAE;EAAAF,EAAA,MAAAJ,OAAAiD;EAAA7C,EAAA,MAAA4C;CAAA,OAAAA,KAAA5C,EAAA;CApBD,MAAA2D,WAAiBf;CAoBf,IAAAgB;CAAA,IAAA5D,EAAA,QAAA0C,SAAA1C,EAAA,QAAAE,YAAAF,EAAA,QAAA2D,UAAA;EAEoBC,MAAAC,KAAAC,WAAA;GAClB,MAAAC,SAAa;IAAA,GAAKrB;KAAQmB,MAAMC;GAAO;GACvCnB,SAASK,MAAI;GACb,IAAIA,OAAI5D,QAAS,QAAQ4D,OAAI3D,QAAS,MAClCsE,SAAS;IAAAvE,KAAO4D,OAAI5D;IAAIC,KAAO2D,OAAI3D;GAAK,CAAC;QACtC,IAAI2D,OAAI5D,QAAS,QAAQ4D,OAAI3D,QAAS,MACzCa,WAAW,IAAI;EAClB;EACJF,EAAA,MAAA0C;EAAA1C,EAAA,MAAAE;EAAAF,EAAA,MAAA2D;EAAA3D,EAAA,MAAA4D;CAAA,OAAAA,KAAA5D,EAAA;CARD,MAAAgE,gBAAsBJ;CAQpB,IAAAK;CAAA,IAAAjE,EAAA,QAAAJ,OAAA;EAEYqE,MAAAtE,WAAWC,KAAiD,IAA5D;GAAAR,KAA2BQ,MAAKR;GAAIC,KAAOO,MAAKP;EAAY,IAA5D;EAA6DW,EAAA,MAAAJ;EAAAI,EAAA,MAAAiE;CAAA,OAAAA,MAAAjE,EAAA;CAA3E,MAAAkE,UAAcD;CAA8D,IAAAE;CAAA,IAAAnE,EAAA,QAAAqB,UAAArB,EAAA,QAAAkB,YAAAlB,EAAA,QAAAT,aAAAS,EAAA,QAAAgB,QAAAhB,EAAA,QAAA2B,UAAA3B,EAAA,QAAAmB,SAAAnB,EAAA,QAAAuB,UAAAvB,EAAA,QAAA2D,UAAA;EAW/DQ,MAAAjD,YAAY3B,cAAc,OACvB,oBAAC,UAAD;GACgB,cAAAyB,KAAIoD,cAAehG,SAAQiG,aAAc;GACxC,aAAArD,KAAIoD,cAAehG,SAAQiG,aAAc;GACvCjD,eAAAA;GACR,OAAAO,OAAM2C,IAAKC,MAGhB;GACS,WAAAhD,OAAMiD;GACL,aAAA;GAER,cAAArD,MAAKsD,KAAM,CAAC,CAAAC,SAAAA,IACN1D,KAAIoD,cAAehG,SAAQuG,mBAAoB,EAAAC,OAAAA,EAE/C,CACoC,IAApC5D,KAAIoD,cAAehG,SAAQyG,QAAS;GAEvC,OAAAxD,WAAW,QAAQF,UAAUE,OAAMb,QAAnC,MAAA;GACG,WAAAsE,OAAA;IACN,MAAAC,WAAeD,OAAO,OAAOnD,OAAOsB,OAAO6B,EAAE,KAA9B/D,KAAAA;IACf,IAAIiE,aAAWjE,KAAAA,GAAS;KACpBO,UAAU0D,QAAM;KAChBrB,SAASqB,UAAQA,SAAMxE,KAAM;KAC7B6B,aAAa;IAAC;GACjB;EACJ,CAAA,IA1BR;EA4BOrC,EAAA,MAAAqB;EAAArB,EAAA,MAAAkB;EAAAlB,EAAA,MAAAT;EAAAS,EAAA,MAAAgB;EAAAhB,EAAA,MAAA2B;EAAA3B,EAAA,MAAAmB;EAAAnB,EAAA,MAAAuB;EAAAvB,EAAA,MAAA2D;EAAA3D,EAAA,MAAAmE;CAAA,OAAAA,MAAAnE,EAAA;CAAA,IAAAiF;CAAA,IAAAjF,EAAA,QAAA2D,UAAA;EAGMsB,OAAAC,WAAUvB,SAASX,MAAI;EAAChD,EAAA,MAAA2D;EAAA3D,EAAA,MAAAiF;CAAA,OAAAA,MAAAjF,EAAA;CAIxB,MAAAmF,MAAA,CAACjE;CAAQ,IAAAkE;CAAA,IAAApF,EAAA,QAAAgB,QAAAhB,EAAA,QAAAQ,OAAA;EACZ4E,MAAApE,KAAIoD,cAAehG,SAAQkG,KAAM,EAAA9D,OAC7B,OAAOA,UAAU,WAAjBA,QAAA,GACX,CAAC;EAACR,EAAA,MAAAgB;EAAAhB,EAAA,MAAAQ;EAAAR,EAAA,MAAAoF;CAAA,OAAAA,MAAApF,EAAA;CAAA,IAAAqF;CAAA,IAAArF,EAAA,QAAAP,UAAAO,EAAA,QAAAkE,WAAAlE,EAAA,QAAAiF,OAAAjF,EAAA,QAAAmF,OAAAnF,EAAA,QAAAoF,OAAApF,EAAA,QAAAR,SAAAQ,EAAA,QAAAN,MAAA;EATN2F,MAAA,oBAAC,aAAD;GACWvC,OAAAA;GACG,UAAAmC;GACHzF;GACCC;GACFC;GACI,UAAAyF;GACH,OAAAC;EAEL,CAAA;EACJpF,EAAA,MAAAP;EAAAO,EAAA,MAAAkE;EAAAlE,EAAA,MAAAiF;EAAAjF,EAAA,MAAAmF;EAAAnF,EAAA,MAAAoF;EAAApF,EAAA,MAAAR;EAAAQ,EAAA,MAAAN;EAAAM,EAAA,MAAAqF;CAAA,OAAAA,MAAArF,EAAA;CAAA,IAAAsF;CAAA,IAAAtF,EAAA,QAAAgB,MAAA;EAGasE,MAAAtE,KAAIoD,cAAehG,SAAQmH,QAAS;EAACvF,EAAA,MAAAgB;EAAAhB,EAAA,MAAAsF;CAAA,OAAAA,MAAAtF,EAAA;CAAA,IAAAwF;CAAA,IAAAxF,EAAA,QAAAgE,eAAA;EAElCwB,OAAAC,WAAUzB,cAAc,OAAOhB,MAAI;EAAChD,EAAA,MAAAgE;EAAAhE,EAAA,MAAAwF;CAAA,OAAAA,MAAAxF,EAAA;CAAA,IAAA0F;CAAA,IAAA1F,EAAA,QAAAG,QAAA;EACtCuF,YAAMvF,SAAS;EAACH,EAAA,MAAAG;EAAAH,EAAA,MAAA0F;CAAA,OAAAA,MAAA1F,EAAA;CAAA,IAAA2F;CAAA,IAAA3F,EAAA,QAAA8B,OAAAC,IAAA,2BAAA,GAAA;EAIT4D,MAAA,EAAAC,uBAAyB,EAAE;EAAC5F,EAAA,MAAA2F;CAAA,OAAAA,MAAA3F,EAAA;CAAA,IAAA6F;CAAA,IAAA7F,EAAA,QAAAW,YAAAX,EAAA,QAAA0C,MAAAtD,OAAAY,EAAA,QAAAY,YAAAZ,EAAA,QAAAsF,OAAAtF,EAAA,QAAAwF,OAAAxF,EAAA,QAAA0F,KAAA;EAR/CG,MAAA,oBAAC,aAAD;GACW,OAAAP;GACA,OAAA5C,MAAKtD;GACF,UAAAoG;GACF,QAAAE;GACE,UAAA;GACA,UAAA;GACJ,MAAA;GACS,eAAAC;GACHhF,YAAAA;GACAC,YAAAA;GACD,WAAArC,6BAAMuH;EAAW,CAAA;EAC9B9F,EAAA,MAAAW;EAAAX,EAAA,MAAA0C,MAAAtD;EAAAY,EAAA,MAAAY;EAAAZ,EAAA,MAAAsF;EAAAtF,EAAA,MAAAwF;EAAAxF,EAAA,MAAA0F;EAAA1F,EAAA,MAAA6F;CAAA,OAAAA,MAAA7F,EAAA;CAAA,IAAA+F;CAAA,IAAA/F,EAAA,QAAAgB,MAAA;EAES+E,MAAA/E,KAAIoD,cAAehG,SAAQ4H,SAAU;EAAChG,EAAA,MAAAgB;EAAAhB,EAAA,MAAA+F;CAAA,OAAAA,MAAA/F,EAAA;CAAA,IAAAiG;CAAA,IAAAjG,EAAA,QAAAgE,eAAA;EAEnCiC,OAAAC,WAAUlC,cAAc,OAAOhB,MAAI;EAAChD,EAAA,MAAAgE;EAAAhE,EAAA,MAAAiG;CAAA,OAAAA,MAAAjG,EAAA;CAAA,IAAAmG;CAAA,IAAAnG,EAAA,QAAAG,QAAA;EACtCgG,YAAMhG,SAAS;EAACH,EAAA,MAAAG;EAAAH,EAAA,MAAAmG;CAAA,OAAAA,MAAAnG,EAAA;CAAA,IAAAoG;CAAA,IAAApG,EAAA,QAAA8B,OAAAC,IAAA,2BAAA,GAAA;EAITqE,MAAA,EAAAR,uBAAyB,EAAE;EAAC5F,EAAA,MAAAoG;CAAA,OAAAA,MAAApG,EAAA;CAAA,IAAAqG;CAAA,IAAArG,EAAA,QAAAW,YAAAX,EAAA,QAAA0C,MAAArD,OAAAW,EAAA,QAAAY,YAAAZ,EAAA,QAAA+F,OAAA/F,EAAA,QAAAiG,OAAAjG,EAAA,QAAAmG,KAAA;EAR/CE,MAAA,oBAAC,aAAD;GACW,OAAAN;GACA,OAAArD,MAAKrD;GACF,UAAA4G;GACF,QAAAE;GACE,UAAA;GACA,UAAA;GACJ,MAAA;GACS,eAAAC;GACHzF,YAAAA;GACAC,YAAAA;GACD,WAAArC,6BAAMuH;EAAW,CAAA;EAC9B9F,EAAA,MAAAW;EAAAX,EAAA,MAAA0C,MAAArD;EAAAW,EAAA,MAAAY;EAAAZ,EAAA,MAAA+F;EAAA/F,EAAA,MAAAiG;EAAAjG,EAAA,MAAAmG;EAAAnG,EAAA,MAAAqG;CAAA,OAAAA,MAAArG,EAAA;CAAA,IAAAsG;CAAA,IAAAtG,EAAA,QAAAkB,YAAAlB,EAAA,QAAAgB,QAAAhB,EAAA,QAAAE,YAAAF,EAAA,QAAAkE,SAAA;EACDoC,MAAApF,YAAY4B,YAAU,OACnB,oBAAC,YAAD;GACUzF,MAAAA;GACC,OAAA2D,KAAIoD,cAAehG,SAAQmI,WAAY;GACnC,WAAAhI,6BAAMiI;GACR,eAAMtG,WAAW,IAAI;EAAC,CAAA,IALtC;EAOOF,EAAA,MAAAkB;EAAAlB,EAAA,MAAAgB;EAAAhB,EAAA,MAAAE;EAAAF,EAAA,MAAAkE;EAAAlE,EAAA,MAAAsG;CAAA,OAAAA,MAAAtG,EAAA;CAAA,IAAAyG;CAAA,IAAAzG,EAAA,QAAA6F,OAAA7F,EAAA,QAAAqG,OAAArG,EAAA,QAAAsG,KAAA;EAlCZG,MAAA,qBAAA,OAAA;GAAgB,WAAAlI,6BAAMmI;GAAtB,UAAA;IACIb;IAaAQ;IAaCC;GAQC;;EAAAtG,EAAA,MAAA6F;EAAA7F,EAAA,MAAAqG;EAAArG,EAAA,MAAAsG;EAAAtG,EAAA,MAAAyG;CAAA,OAAAA,MAAAzG,EAAA;CAAA,IAAA2G;CAAA,IAAA3G,EAAA,QAAAW,YAAAX,EAAA,QAAAgB,QAAAhB,EAAA,QAAAG,UAAAH,EAAA,QAAAE,YAAAF,EAAA,QAAAkE,WAAAlE,EAAA,QAAAY,YAAAZ,EAAA,QAAAJ,OAAAiD,SAAA;EACL8D,MAAA7D,YAAU,OACP,oBAAA,OAAA;GAAUlB,KAAAA;GACN,UAAA,oBAAC,WAAD;IACW,OAAAZ,KAAIoD,cAAehG,SAAQyE,OAAQ;IACnC,OAAAjD,OAAKiD,WAAL;IACG,WAAA+D,cACN1G,WAAW;KAAAd,KACF0D,QAAK1D;KAAIC,KACTyD,QAAKzD;KAAI,GACVwD,cAAY,KAAZ,EAAAA,SAAmBA,UAAa,IAAhC,CAAgC;IACxC,CAAC;IAEG,cAAM1C,SAAS;IACXQ,YAAAA;IACAC,YAAAA;GAAQ,CAAA;EAEtB,CAAA,IAhBT;EAiBOZ,EAAA,MAAAW;EAAAX,EAAA,MAAAgB;EAAAhB,EAAA,MAAAG;EAAAH,EAAA,MAAAE;EAAAF,EAAA,MAAAkE;EAAAlE,EAAA,MAAAY;EAAAZ,EAAA,MAAAJ,OAAAiD;EAAA7C,EAAA,MAAA2G;CAAA,OAAAA,MAAA3G,EAAA;CAAA,IAAA6G;CAAA,IAAA7G,EAAA,QAAAmE,OAAAnE,EAAA,QAAAqF,OAAArF,EAAA,QAAAyG,OAAAzG,EAAA,QAAA2G,KAAA;EA9FZE,MAAA,qBAAA,OAAA;GAAgB,WAAAtI,6BAAMuI;GAAtB,UAAA;IACK3C;IA6BDkB;IAWAoB;IAoCCE;GAkBC;;EAAA3G,EAAA,MAAAmE;EAAAnE,EAAA,MAAAqF;EAAArF,EAAA,MAAAyG;EAAAzG,EAAA,MAAA2G;EAAA3G,EAAA,MAAA6G;CAAA,OAAAA,MAAA7G,EAAA;CAAA,IAAA+G;CAAA,IAAA/G,EAAA,QAAAc,aAAAd,EAAA,QAAAS,eAAAT,EAAA,QAAAW,YAAAX,EAAA,QAAAU,UAAAV,EAAA,QAAAQ,SAAAR,EAAA,QAAAa,YAAAb,EAAA,QAAA6G,KAAA;EAvGVE,MAAA,oBAAC,UAAD;GACYvG,QAAAA;GACKC;GACLC;GACIG,YAAAA;GACAF,YAAAA;GACDG;GAEX+F,UAAAA;EARK,CAAA;EAwGE7G,EAAA,MAAAc;EAAAd,EAAA,MAAAS;EAAAT,EAAA,MAAAW;EAAAX,EAAA,MAAAU;EAAAV,EAAA,MAAAQ;EAAAR,EAAA,MAAAa;EAAAb,EAAA,MAAA6G;EAAA7G,EAAA,MAAA+G;CAAA,OAAAA,MAAA/G,EAAA;CAAA,OAxGX+G;AAwGW;AAvLZ,SAAAxC,OAAAS,QAAAgC,OAAA;CAAA,OA6FuD;EAAAlC,IAC9BmC,OAAOD,KAAK;EAACxG,OACVwE,OAAMxE;CACjB;AAAC;AAhGlB,SAAAkD,QAAA,CAAA;AA2LP,SAASwD,QAAQtH,OAAgC;CAC7C,OAAOD,WAAWC,KAAK;AAC3B;;;;;AAMA,SAAOuH,mBAAAC,OAAA;CAAA,MAAApH,IAAAC,EAAA,EAAA;CACH,MAAA,EAAAoH,UAAkBD;CAAM,IAAArH;CAAA,IAAAC,EAAA,OAAAqH,OAAA;EACXtH,KAAA9B,WAAWoJ,OAAO,QAAQnJ,QAAQ;EAAC8B,EAAA,KAAAqH;EAAArH,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CAAhD,MAAAN,OAAaK;CAAoC,IAAAO;CAAA,IAAAN,EAAA,OAAAqH,OAAA;EAClC/G,KAAArC,WAAWoJ,OAAO,UAAUH,OAAO;EAAClH,EAAA,KAAAqH;EAAArH,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAnD,MAAAP,SAAea;CAAqC,IAAAC;CAAA,IAAAP,EAAA,OAAAqH,OAAA;EACtC9G,KAAAtC,WACVoJ,OACA,SACAC,MAKJ;EAACtH,EAAA,KAAAqH;EAAArH,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CARD,MAAAR,QAAce;CAQZ,IAAAkB;CAAA,IAAAzB,EAAA,OAAAoH,OAAA;EACmD3F,KAAAzD,cAAcoJ,KAAK;EAACpH,EAAA,KAAAoH;EAAApH,EAAA,KAAAyB;CAAA,OAAAA,KAAAzB,EAAA;CAAA,IAAAuH;CAAA,IAAAvH,EAAA,OAAAyB,IAAA;EAAzE,MAAA,EAAA+F,aAAAC,cAAA,GAAA5F,OAAqDJ;EAArD8F,aAAA1F;EAA0E7B,EAAA,KAAAyB;EAAAzB,EAAA,KAAAuH;CAAA,OAAAA,aAAAvH,EAAA;CAI3D,MAAA6B,KAAAlC,WAAWyH,MAAKxH,KAA2B,IAAjBwH,MAAKxH,QAA/B;CAA4C,IAAA0C;CAAA,IAAAtC,EAAA,QAAAN,MAAA;EAE9C4C,KAAA5C,SAASqB,KAAAA,IAAT,EAAArB,KAAiC,IAAjC,CAAiC;EAACM,EAAA,MAAAN;EAAAM,EAAA,MAAAsC;CAAA,OAAAA,KAAAtC,EAAA;CAAA,IAAAuC;CAAA,IAAAvC,EAAA,QAAAP,QAAA;EAClC8C,KAAA9C,WAAWsB,KAAAA,IAAX,EAAAtB,OAAqC,IAArC,CAAqC;EAACO,EAAA,MAAAP;EAAAO,EAAA,MAAAuC;CAAA,OAAAA,KAAAvC,EAAA;CAAA,IAAAwC;CAAA,IAAAxC,EAAA,QAAAR,OAAA;EACtCgD,KAAAhD,UAAUuB,KAAAA,IAAV,EAAAvB,MAAmC,IAAnC,CAAmC;EAACQ,EAAA,MAAAR;EAAAQ,EAAA,MAAAwC;CAAA,OAAAA,KAAAxC,EAAA;CAAA,IAAA4C;CAAA,IAAA5C,EAAA,QAAAuH,cAAAvH,EAAA,QAAAoH,MAAAlH,YAAAF,EAAA,QAAA6B,MAAA7B,EAAA,QAAAsC,MAAAtC,EAAA,QAAAuC,MAAAvC,EAAA,QAAAwC,IAAA;EAN7CI,KAAA,oBAAC,eAAD;GAAc,GACN2E;GACG,OAAA1F;GACG,UAAAuF,MAAKlH;GAAS,GACnBoC;GAAkC,GAClCC;GAAsC,GACtCC;EAAoC,CAAA;EAC3CxC,EAAA,MAAAuH;EAAAvH,EAAA,MAAAoH,MAAAlH;EAAAF,EAAA,MAAA6B;EAAA7B,EAAA,MAAAsC;EAAAtC,EAAA,MAAAuC;EAAAvC,EAAA,MAAAwC;EAAAxC,EAAA,MAAA4C;CAAA,OAAAA,KAAA5C,EAAA;CAAA,OAPF4C;AAOE;AAtBH,SAAA0E,OAAA1H,OAAA;CAAA,OAQKA,UAAU,QACV,OAAOA,UAAU,YACjBzB,SAAUyB,MAAgCZ,GAAK,KAC/Cb,SAAUyB,MAAgCX,WAAa;AAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GeocodingSource } from './types.js';
|
|
1
|
+
import type { GeocodingResult, GeocodingSource } from './types.js';
|
|
2
2
|
export interface NominatimSourceOptions {
|
|
3
3
|
/** The Nominatim server. Defaults to OpenStreetMap's, whose policy allows one request a second. */
|
|
4
4
|
endpoint?: string;
|
|
@@ -10,7 +10,13 @@ export interface NominatimSourceOptions {
|
|
|
10
10
|
limit?: number;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* The parts of the address of a place, from Nominatim's `addressdetails`: the region as its code
|
|
14
|
+
* for the countries whose regions Panneau knows (`QC`, from `CA-QC`), the postal code normalized.
|
|
15
|
+
*/
|
|
16
|
+
export declare function toAddressParts(details: unknown): GeocodingResult['address'] | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* An address search on Nominatim, OpenStreetMap's geocoder, with the parts of the addresses it
|
|
19
|
+
* finds. Fine for an admin panel: its public
|
|
14
20
|
* server allows one request a second and no heavy use. For more, run a server or use a service.
|
|
15
21
|
*/
|
|
16
22
|
export declare function createNominatimSource({ endpoint, email, countryCodes, limit, }?: NominatimSourceOptions): GeocodingSource;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nominatim.d.ts","sourceRoot":"","sources":["../../src/location/nominatim.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nominatim.d.ts","sourceRoot":"","sources":["../../src/location/nominatim.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,WAAW,sBAAsB;IACnC,mGAAmG;IACnG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,SAAS,CAiCvF;AAYD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAClC,QAAgD,EAChD,KAAK,EACL,YAAY,EACZ,KAAS,GACZ,GAAE,sBAA2B,GAAG,eAAe,CAiD/C"}
|
|
@@ -1,16 +1,44 @@
|
|
|
1
|
+
import { REGION_COUNTRIES } from "../region/regions.js";
|
|
2
|
+
import { normalizePostalCode } from "@panneau/protocol/runtime";
|
|
1
3
|
//#region src/location/nominatim.ts
|
|
4
|
+
var text = (value) => typeof value === "string" && value.trim() !== "" ? value.trim() : void 0;
|
|
5
|
+
/**
|
|
6
|
+
* The parts of the address of a place, from Nominatim's `addressdetails`: the region as its code
|
|
7
|
+
* for the countries whose regions Panneau knows (`QC`, from `CA-QC`), the postal code normalized.
|
|
8
|
+
*/
|
|
9
|
+
function toAddressParts(details) {
|
|
10
|
+
if (details === null || typeof details !== "object") return;
|
|
11
|
+
const parts = details;
|
|
12
|
+
const country = text(parts.country_code)?.toUpperCase();
|
|
13
|
+
const street = [text(parts.house_number), text(parts.road) ?? text(parts.pedestrian)].filter((part) => part !== void 0).join(" ");
|
|
14
|
+
const city = text(parts.city) ?? text(parts.town) ?? text(parts.village) ?? text(parts.municipality) ?? text(parts.hamlet);
|
|
15
|
+
const iso = text(parts["ISO3166-2-lvl4"]);
|
|
16
|
+
const region = country !== void 0 && REGION_COUNTRIES.includes(country) && iso?.startsWith(`${country}-`) === true ? iso.slice(country.length + 1) : text(parts.state);
|
|
17
|
+
const postalCode = text(parts.postcode);
|
|
18
|
+
const address = {
|
|
19
|
+
...street !== "" ? { street } : {},
|
|
20
|
+
...city !== void 0 ? { city } : {},
|
|
21
|
+
...region !== void 0 ? { region } : {},
|
|
22
|
+
...postalCode !== void 0 ? { postalCode: normalizePostalCode(postalCode, country) } : {},
|
|
23
|
+
...country !== void 0 ? { country } : {}
|
|
24
|
+
};
|
|
25
|
+
return Object.keys(address).length > 0 ? address : void 0;
|
|
26
|
+
}
|
|
2
27
|
function toResult(place) {
|
|
3
28
|
const lat = Number(place.lat);
|
|
4
29
|
const lng = Number(place.lon);
|
|
5
30
|
if (typeof place.display_name !== "string" || Number.isNaN(lat) || Number.isNaN(lng)) return null;
|
|
31
|
+
const address = toAddressParts(place.address);
|
|
6
32
|
return {
|
|
7
33
|
label: place.display_name,
|
|
8
34
|
lat,
|
|
9
|
-
lng
|
|
35
|
+
lng,
|
|
36
|
+
...address !== void 0 ? { address } : {}
|
|
10
37
|
};
|
|
11
38
|
}
|
|
12
39
|
/**
|
|
13
|
-
* An address search on Nominatim, OpenStreetMap's geocoder
|
|
40
|
+
* An address search on Nominatim, OpenStreetMap's geocoder, with the parts of the addresses it
|
|
41
|
+
* finds. Fine for an admin panel: its public
|
|
14
42
|
* server allows one request a second and no heavy use. For more, run a server or use a service.
|
|
15
43
|
*/
|
|
16
44
|
function createNominatimSource({ endpoint = "https://nominatim.openstreetmap.org", email, countryCodes, limit = 5 } = {}) {
|
|
@@ -18,6 +46,7 @@ function createNominatimSource({ endpoint = "https://nominatim.openstreetmap.org
|
|
|
18
46
|
const request = async (path, params, { signal, locale }) => {
|
|
19
47
|
const query = new URLSearchParams({
|
|
20
48
|
format: "jsonv2",
|
|
49
|
+
addressdetails: "1",
|
|
21
50
|
...params
|
|
22
51
|
});
|
|
23
52
|
if (email !== void 0) query.set("email", email);
|
|
@@ -45,6 +74,6 @@ function createNominatimSource({ endpoint = "https://nominatim.openstreetmap.org
|
|
|
45
74
|
};
|
|
46
75
|
}
|
|
47
76
|
//#endregion
|
|
48
|
-
export { createNominatimSource };
|
|
77
|
+
export { createNominatimSource, toAddressParts };
|
|
49
78
|
|
|
50
79
|
//# sourceMappingURL=nominatim.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nominatim.js","names":["GeocodingResult","GeocodingSource","NominatimSourceOptions","endpoint","email","countryCodes","limit","NominatimPlace","display_name","lat","lon","toResult","place","Number","lng","isNaN","label","createNominatimSource","base","replace","request","path","params","
|
|
1
|
+
{"version":3,"file":"nominatim.js","names":["normalizePostalCode","REGION_COUNTRIES","GeocodingResult","GeocodingSource","NominatimSourceOptions","endpoint","email","countryCodes","limit","NominatimPlace","display_name","lat","lon","address","text","value","trim","undefined","toAddressParts","details","parts","Record","country","country_code","toUpperCase","street","house_number","road","pedestrian","filter","part","join","city","town","village","municipality","hamlet","iso","region","includes","startsWith","slice","length","state","postalCode","postcode","Object","keys","toResult","place","Number","lng","isNaN","label","createNominatimSource","base","replace","request","path","params","signal","locale","AbortSignal","Promise","query","URLSearchParams","format","addressdetails","set","response","fetch","ok","Error","status","json","search","options","places","q","String","countrycodes","Array","isArray","flatMap","reverse"],"sources":["../../src/location/nominatim.ts"],"sourcesContent":["import { normalizePostalCode } from '@panneau/protocol/runtime';\n\nimport { REGION_COUNTRIES } from '../region/regions';\nimport type { GeocodingResult, GeocodingSource } from './types';\n\nexport interface NominatimSourceOptions {\n /** The Nominatim server. Defaults to OpenStreetMap's, whose policy allows one request a second. */\n endpoint?: string;\n /** An email, which OpenStreetMap's server asks of apps that send many requests. */\n email?: string;\n /** Limits the search to these countries (`['ca']`). */\n countryCodes?: readonly string[];\n /** Most results of a search. Defaults to 5. */\n limit?: number;\n}\n\ninterface NominatimPlace {\n display_name?: unknown;\n lat?: unknown;\n lon?: unknown;\n address?: unknown;\n}\n\nconst text = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;\n\n/**\n * The parts of the address of a place, from Nominatim's `addressdetails`: the region as its code\n * for the countries whose regions Panneau knows (`QC`, from `CA-QC`), the postal code normalized.\n */\nexport function toAddressParts(details: unknown): GeocodingResult['address'] | undefined {\n if (details === null || typeof details !== 'object') {\n return undefined;\n }\n const parts = details as Record<string, unknown>;\n const country = text(parts.country_code)?.toUpperCase();\n const street = [text(parts.house_number), text(parts.road) ?? text(parts.pedestrian)]\n .filter((part) => part !== undefined)\n .join(' ');\n const city =\n text(parts.city) ??\n text(parts.town) ??\n text(parts.village) ??\n text(parts.municipality) ??\n text(parts.hamlet);\n const iso = text(parts['ISO3166-2-lvl4']);\n const region =\n country !== undefined &&\n REGION_COUNTRIES.includes(country) &&\n iso?.startsWith(`${country}-`) === true\n ? iso.slice(country.length + 1)\n : text(parts.state);\n const postalCode = text(parts.postcode);\n const address = {\n ...(street !== '' ? { street } : {}),\n ...(city !== undefined ? { city } : {}),\n ...(region !== undefined ? { region } : {}),\n ...(postalCode !== undefined\n ? { postalCode: normalizePostalCode(postalCode, country) }\n : {}),\n ...(country !== undefined ? { country } : {}),\n };\n return Object.keys(address).length > 0 ? address : undefined;\n}\n\nfunction toResult(place: NominatimPlace): GeocodingResult | null {\n const lat = Number(place.lat);\n const lng = Number(place.lon);\n if (typeof place.display_name !== 'string' || Number.isNaN(lat) || Number.isNaN(lng)) {\n return null;\n }\n const address = toAddressParts(place.address);\n return { label: place.display_name, lat, lng, ...(address !== undefined ? { address } : {}) };\n}\n\n/**\n * An address search on Nominatim, OpenStreetMap's geocoder, with the parts of the addresses it\n * finds. Fine for an admin panel: its public\n * server allows one request a second and no heavy use. For more, run a server or use a service.\n */\nexport function createNominatimSource({\n endpoint = 'https://nominatim.openstreetmap.org',\n email,\n countryCodes,\n limit = 5,\n}: NominatimSourceOptions = {}): GeocodingSource {\n const base = endpoint.replace(/\\/$/, '');\n const request = async (\n path: string,\n params: Record<string, string>,\n { signal, locale }: { signal: AbortSignal; locale?: string },\n ): Promise<unknown> => {\n // The parts of addresses, for `address` fields\n const query = new URLSearchParams({ format: 'jsonv2', addressdetails: '1', ...params });\n if (email !== undefined) {\n query.set('email', email);\n }\n if (locale !== undefined) {\n query.set('accept-language', locale);\n }\n const response = await fetch(`${base}${path}?${query}`, { signal });\n if (!response.ok) {\n throw new Error(`Nominatim answered ${response.status}.`);\n }\n return response.json();\n };\n return {\n async search(text, options) {\n const places = await request(\n '/search',\n {\n q: text,\n limit: String(limit),\n ...(countryCodes !== undefined && countryCodes.length > 0\n ? { countrycodes: countryCodes.join(',') }\n : {}),\n },\n options,\n );\n return Array.isArray(places)\n ? places.flatMap((place: NominatimPlace) => toResult(place) ?? [])\n : [];\n },\n async reverse({ lat, lng }, options) {\n const place = await request(\n '/reverse',\n { lat: String(lat), lon: String(lng) },\n options,\n );\n return place !== null && typeof place === 'object'\n ? toResult(place as NominatimPlace)\n : null;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { GeocodingResult, GeocodingSource } from './types.js';
|
|
2
|
+
/** The shortest text that the address search looks for. */
|
|
3
|
+
export declare const SEARCH_MIN_LENGTH = 3;
|
|
4
|
+
/** The search of addresses: results of the text typed, after a pause. */
|
|
5
|
+
export declare function useAddressSearch(geocoding: GeocodingSource | null, query: string, locale: string): {
|
|
6
|
+
query: string;
|
|
7
|
+
results: GeocodingResult[];
|
|
8
|
+
loading: boolean;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/location/search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGhE,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,yEAAyE;AACzE,wBAAgB,gBAAgB,CAC5B,SAAS,EAAE,eAAe,GAAG,IAAI,EACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA6BjE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { c } from "react/compiler-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
//#region src/location/search.ts
|
|
4
|
+
var SEARCH_DELAY = 400;
|
|
5
|
+
/** The search of addresses: results of the text typed, after a pause. */
|
|
6
|
+
function useAddressSearch(geocoding, query, locale) {
|
|
7
|
+
const $ = c(9);
|
|
8
|
+
let t0;
|
|
9
|
+
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
10
|
+
t0 = {
|
|
11
|
+
query: "",
|
|
12
|
+
results: [],
|
|
13
|
+
loading: false
|
|
14
|
+
};
|
|
15
|
+
$[0] = t0;
|
|
16
|
+
} else t0 = $[0];
|
|
17
|
+
const [state, setState] = useState(t0);
|
|
18
|
+
let t1;
|
|
19
|
+
let t2;
|
|
20
|
+
if ($[1] !== geocoding || $[2] !== locale || $[3] !== query) {
|
|
21
|
+
t1 = () => {
|
|
22
|
+
const text = query.trim();
|
|
23
|
+
if (geocoding === null || text.length < 3) return;
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
const timeout = window.setTimeout(() => {
|
|
26
|
+
setState(_temp);
|
|
27
|
+
geocoding.search(text, {
|
|
28
|
+
signal: controller.signal,
|
|
29
|
+
locale
|
|
30
|
+
}).then((results) => setState({
|
|
31
|
+
query: text,
|
|
32
|
+
results,
|
|
33
|
+
loading: false
|
|
34
|
+
})).catch(() => {
|
|
35
|
+
if (!controller.signal.aborted) setState({
|
|
36
|
+
query: text,
|
|
37
|
+
results: [],
|
|
38
|
+
loading: false
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}, SEARCH_DELAY);
|
|
42
|
+
return () => {
|
|
43
|
+
window.clearTimeout(timeout);
|
|
44
|
+
controller.abort();
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
t2 = [
|
|
48
|
+
geocoding,
|
|
49
|
+
query,
|
|
50
|
+
locale
|
|
51
|
+
];
|
|
52
|
+
$[1] = geocoding;
|
|
53
|
+
$[2] = locale;
|
|
54
|
+
$[3] = query;
|
|
55
|
+
$[4] = t1;
|
|
56
|
+
$[5] = t2;
|
|
57
|
+
} else {
|
|
58
|
+
t1 = $[4];
|
|
59
|
+
t2 = $[5];
|
|
60
|
+
}
|
|
61
|
+
useEffect(t1, t2);
|
|
62
|
+
let t3;
|
|
63
|
+
if ($[6] !== query || $[7] !== state) {
|
|
64
|
+
t3 = query.trim().length >= 3 ? state : {
|
|
65
|
+
...state,
|
|
66
|
+
results: []
|
|
67
|
+
};
|
|
68
|
+
$[6] = query;
|
|
69
|
+
$[7] = state;
|
|
70
|
+
$[8] = t3;
|
|
71
|
+
} else t3 = $[8];
|
|
72
|
+
return t3;
|
|
73
|
+
}
|
|
74
|
+
function _temp(current) {
|
|
75
|
+
return {
|
|
76
|
+
...current,
|
|
77
|
+
loading: true
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { useAddressSearch };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","names":["useEffect","useState","GeocodingResult","GeocodingSource","SEARCH_DELAY","SEARCH_MIN_LENGTH","useAddressSearch","geocoding","query","locale","$","_c","t0","Symbol","for","results","loading","state","setState","t1","t2","text","trim","length","controller","AbortController","timeout","window","setTimeout","_temp","search","signal","then","catch","aborted","clearTimeout","abort","t3","current","_c"],"sources":["../../src/location/search.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport type { GeocodingResult, GeocodingSource } from './types';\n\nconst SEARCH_DELAY = 400;\n/** The shortest text that the address search looks for. */\nexport const SEARCH_MIN_LENGTH = 3;\n\n/** The search of addresses: results of the text typed, after a pause. */\nexport function useAddressSearch(\n geocoding: GeocodingSource | null,\n query: string,\n locale: string,\n): { query: string; results: GeocodingResult[]; loading: boolean } {\n const [state, setState] = useState<{\n query: string;\n results: GeocodingResult[];\n loading: boolean;\n }>({ query: '', results: [], loading: false });\n useEffect(() => {\n const text = query.trim();\n if (geocoding === null || text.length < SEARCH_MIN_LENGTH) {\n return undefined;\n }\n const controller = new AbortController();\n const timeout = window.setTimeout(() => {\n setState((current) => ({ ...current, loading: true }));\n geocoding\n .search(text, { signal: controller.signal, locale })\n .then((results) => setState({ query: text, results, loading: false }))\n .catch(() => {\n if (!controller.signal.aborted) {\n setState({ query: text, results: [], loading: false });\n }\n });\n }, SEARCH_DELAY);\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [geocoding, query, locale]);\n return query.trim().length >= SEARCH_MIN_LENGTH ? state : { ...state, results: [] };\n}\n"],"mappings":";;;AAIA,IAAMI,eAAe;;AAKrB,SAAOE,iBAAAC,WAAAC,OAAAC,QAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAG,OAAAC,IAAA,2BAAA,GAAA;EASAF,KAAA;GAAAJ,OAAS;GAAEO,SAAW,CAAA;GAAEC,SAAW;EAAM;EAACN,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAJ7C,MAAA,CAAAO,OAAAC,YAA0BjB,SAIvBW,EAA0C;CAAE,IAAAO;CAAA,IAAAC;CAAA,IAAAV,EAAA,OAAAH,aAAAG,EAAA,OAAAD,UAAAC,EAAA,OAAAF,OAAA;EACrCW,WAAA;GACN,MAAAE,OAAab,MAAKc,KAAM;GACxB,IAAIf,cAAc,QAAQc,KAAIE,SAAAA,GAA2B;GAGzD,MAAAC,aAAmB,IAAIC,gBAAgB;GACvC,MAAAC,UAAgBC,OAAMC,iBAAY;IAC9BV,SAASW,KAA4C;IACrDtB,UAASuB,OACGT,MAAM;KAAAU,QAAUP,WAAUO;KAAOtB;IAAS,CAAC,CAAC,CAAAuB,MAC9CjB,YAAaG,SAAS;KAAAV,OAASa;KAAIN;KAAAC,SAAoB;IAAM,CAAC,CAAC,CAAC,CAAAiB,YAC/D;KACH,IAAI,CAACT,WAAUO,OAAOG,SAClBhB,SAAS;MAAAV,OAASa;MAAIN,SAAW,CAAA;MAAEC,SAAW;KAAM,CAAC;IACxD,CACJ;GAAC,GACPZ,YAAY;GAAE,aACV;IACHuB,OAAMQ,aAAcT,OAAO;IAC3BF,WAAUY,MAAO;GAAC;EACrB;EACFhB,KAAA;GAACb;GAAWC;GAAOC;EAAM;EAACC,EAAA,KAAAH;EAAAG,EAAA,KAAAD;EAAAC,EAAA,KAAAF;EAAAE,EAAA,KAAAS;EAAAT,EAAA,KAAAU;CAAA,OAAA;EAAAD,KAAAT,EAAA;EAAAU,KAAAV,EAAA;CAAA;CArB7BV,UAAUmB,IAqBPC,EAA0B;CAAC,IAAAiB;CAAA,IAAA3B,EAAA,OAAAF,SAAAE,EAAA,OAAAO,OAAA;EACvBoB,KAAA7B,MAAKc,KAAM,CAAC,CAAAC,UAAAA,IAAZN,QAAA;GAAA,GAAwDA;GAAKF,SAAW,CAAA;EAAG;EAACL,EAAA,KAAAF;EAAAE,EAAA,KAAAO;EAAAP,EAAA,KAAA2B;CAAA,OAAAA,KAAA3B,EAAA;CAAA,OAA5E2B;AAA4E;AAhChF,SAAAR,MAAAS,SAAA;CAAA,OAiB4B;EAAA,GAAKA;EAAOtB,SAAW;CAAK;AAAC"}
|
package/dist/location/types.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
import type { AddressValue } from '@panneau/protocol';
|
|
2
|
+
/** A place an address search found: what it shows, its point, and the parts of its address. */
|
|
2
3
|
export interface GeocodingResult {
|
|
3
4
|
label: string;
|
|
4
5
|
lat: number;
|
|
5
6
|
lng: number;
|
|
7
|
+
/**
|
|
8
|
+
* The parts of its address, when the source knows them: `address` fields fill theirs with them
|
|
9
|
+
* (decision 0054), and leave out the results without them.
|
|
10
|
+
*/
|
|
11
|
+
address?: Omit<AddressValue, 'point'>;
|
|
6
12
|
}
|
|
7
13
|
/**
|
|
8
|
-
* Where `location` fields search addresses (
|
|
14
|
+
* Where `location` and `address` fields search addresses (decisions 0033 and 0054). Projects bring their own: a service
|
|
9
15
|
* with a key, their backend, or `createNominatimSource()` for small volumes.
|
|
10
16
|
*/
|
|
11
17
|
export interface GeocodingSource {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/location/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/location/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,+FAA+F;AAC/F,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;CACzC;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B,8DAA8D;IAC9D,MAAM,CACF,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAClD,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC9B,2FAA2F;IAC3F,OAAO,CAAC,CACJ,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EACnC,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAClD,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CACtC;AAED,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACrB,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IACvB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { FieldEntryProps, FieldProps } from '../shared/types.js';
|
|
2
|
+
import { type MoneyFieldValue } from './money.js';
|
|
3
|
+
export interface MoneyFieldProps extends FieldProps<MoneyFieldValue> {
|
|
4
|
+
/** The currency of every amount (`CAD`): the field shows it, and can't change it. */
|
|
5
|
+
currency?: string | null;
|
|
6
|
+
/**
|
|
7
|
+
* The currencies the user picks from, the first one for a new amount. Without `currency` or
|
|
8
|
+
* `currencies`, every currency.
|
|
9
|
+
*/
|
|
10
|
+
currencies?: readonly string[] | null;
|
|
11
|
+
/** The smallest amount, in minor units. */
|
|
12
|
+
min?: number;
|
|
13
|
+
/** The largest amount, in minor units. */
|
|
14
|
+
max?: number;
|
|
15
|
+
placeholder?: string;
|
|
16
|
+
controlClassName?: string;
|
|
17
|
+
inputClassName?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* An amount and its currency, `{ amount, currency }`, with the amount in minor units (decision
|
|
21
|
+
* 0053): typed in the currency format of the locale, with the digits of the currency, and turned
|
|
22
|
+
* into minor units without floating point errors. A fixed `currency` shows in the amount; otherwise
|
|
23
|
+
* a menu after the amount picks it. Clearing the amount gives `null`.
|
|
24
|
+
*/
|
|
25
|
+
export declare function MoneyField({ value, onChange, currency: fixed, currencies, min, max, disabled, readOnly, required, ...props }: MoneyFieldProps): import("react").JSX.Element;
|
|
26
|
+
/** The `money` type: settings `currency` and `currencies`, `min` and `max` from its rules. */
|
|
27
|
+
export declare function MoneyFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=MoneyField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoneyField.d.ts","sourceRoot":"","sources":["../../src/money/MoneyField.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAEH,KAAK,eAAe,EAKvB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,eAAgB,SAAQ,UAAU,CAAC,eAAe,CAAC;IAChE,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,QAAQ,EAAE,KAAK,EACf,UAAU,EACV,GAAG,EACH,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,eAAe,+BAsDjB;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,+BAmBrD"}
|