{"version":3,"file":"js/24-f109eff85cc7f529fac7.js","mappings":"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","sources":["webpack://solvi-web/./app/packs/src/components/create-project/gcp/csv-importer.tsx","webpack://solvi-web/./app/packs/src/components/create-project/gcp/import-points.tsx","webpack://solvi-web/./app/packs/src/components/transition.js","webpack://solvi-web/./app/packs/src/components/ui/elements/button.js","webpack://solvi-web/./app/packs/src/components/ui/elements/checkbox.js","webpack://solvi-web/./app/packs/src/components/ui/elements/close-button.js","webpack://solvi-web/./app/packs/src/components/ui/elements/icon-button.js","webpack://solvi-web/./app/packs/src/components/ui/elements/input.tsx","webpack://solvi-web/./app/packs/src/components/ui/elements/label.js","webpack://solvi-web/./app/packs/src/components/ui/elements/select.tsx","webpack://solvi-web/./app/packs/src/hooks/use-scroll-block.js","webpack://solvi-web/./app/packs/src/components/ui/shared/overlays/base-overlay.js","webpack://solvi-web/./app/packs/src/components/ui/shared/overlays/modal-overlay.tsx","webpack://solvi-web/./app/packs/src/components/ui/shared/overlays/transitions.js","webpack://solvi-web/./app/packs/src/components/ui/shared/validation-message.js","webpack://solvi-web/./app/packs/src/components/window-listener.js","webpack://solvi-web/./app/packs/src/hooks/use-debounce.ts","webpack://solvi-web/./app/packs/src/units.js","webpack://solvi-web/./app/packs/src/utils/geo-utils.js"],"sourcesContent":["import { string } from 'prop-types'\nimport { useEffect, useState } from 'react'\nimport Checkbox from '../../ui/elements/checkbox'\nimport Select from '../../ui/elements/select'\n\ntype ColumnMapping = {\n displayName: string\n columnNames: string[]\n}\n\ntype ColumnMappings = Record\n\nexport type FileMapping = {\n mappedColumns: (string | undefined)[]\n mappedCsv: Record[]\n}\n\ntype CsvImporterProps = {\n columnMappings: ColumnMappings\n file: File\n onChange?: (mapping: FileMapping) => void\n}\n\nexport default function CsvImporter({\n columnMappings,\n file,\n onChange,\n}: CsvImporterProps) {\n const [mapping, setMapping] = useState<(string | undefined)[]>([])\n const [data, setData] = useState([])\n const [hasHeaders, setHasHeaders] = useState(true)\n\n useEffect(() => {\n readData()\n\n async function readData() {\n const data = await parseCsv(file)\n setData(data)\n setHasHeaders(data[0].every(column => isNaN(column as any)))\n setMapping(guessMappings(columnMappings, data))\n }\n }, [file, columnMappings])\n useEffect(() => {\n if (mapping.length && onChange)\n onChange({\n mappedColumns: mapping,\n mappedCsv: data.slice(hasHeaders ? 1 : 0).map(row =>\n mapping.reduce((mappedRow, columnMapping, i) => {\n if (columnMapping) {\n mappedRow[columnMapping] = row[i]\n }\n return mappedRow\n }, {} as Record)\n ),\n })\n }, [onChange, mapping, data])\n\n const headers = data[0]\n\n return data && data.length > 0 ? (\n <>\n
\n \n \n \n {headers.map((header, i) => {\n const colMapping = mapping[i]\n\n return (\n \n )\n })}\n \n \n \n {data.slice(hasHeaders ? 1 : 0, 5).map((row, i) => (\n \n {row.map((col, i) => (\n \n ))}\n \n ))}\n \n
\n {hasHeaders &&
{header}
}\n
\n updateMapping(i, e.target.value)}>\n \n {Object.keys(columnMappings).map(attribute => (\n \n ))}\n \n
\n
\n {col}\n
\n
\n
\n setHasHeaders(e.target.checked)}>\n Treat first line as headers\n \n
\n \n ) : null\n\n function updateMapping(index: number, attribute: string) {\n const nextMapping = mapping.map(x => (x !== attribute ? x : undefined))\n nextMapping[index] = attribute || undefined\n setMapping(nextMapping)\n }\n}\n\nexport async function parseCsv(file: File) {\n const contents = new TextDecoder().decode(await file.arrayBuffer())\n const lines = contents\n .split('\\n')\n .map(line => line.trim())\n .filter((line, i) => i === 0 || !line.startsWith('#'))\n\n const separator =\n lines[0] && lines[0].indexOf('\\t') >= 0\n ? '\\t'\n : lines[0].indexOf(',') >= 0\n ? ','\n : ';'\n\n return lines.map(line =>\n line\n .split(separator)\n // This is a very naïve handling of quotes and apostrophes, a lot of\n // CSVs will not be correctly handled.\n .map(col => col.trim().replace(/\"/g, '').replace(/'/g, ''))\n )\n}\n\nexport function guessMappings(\n columnMappings: ColumnMappings,\n csv: string[][]\n): (string | undefined)[] {\n const headings = csv[0]\n if (headings[0].startsWith('#')) {\n headings[0] = headings[0].substring(1).trim()\n }\n\n const columnNames = Object.keys(columnMappings)\n const guessedMappings = []\n\n for (const heading of headings) {\n const normalizedHeading = heading.trim().toLowerCase()\n\n const matchIndex = columnNames.findIndex(c =>\n columnMappings[c].columnNames.includes(normalizedHeading)\n )\n\n if (matchIndex >= 0) {\n guessedMappings.push(columnNames[matchIndex])\n columnNames.splice(matchIndex, 1)\n } else {\n guessedMappings.push(undefined)\n }\n }\n return guessedMappings\n}\n","import { useCallback, useEffect, useMemo, useReducer, useState } from 'react'\nimport Input from '../../ui/elements/input'\nimport Label from '../../ui/elements/label'\nimport CsvImporter, { FileMapping } from './csv-importer'\nimport proj from 'proj4'\nimport useDebounce from '../../../hooks/use-debounce'\nimport { featureCollection, point } from '@turf/helpers'\nimport ValidationMessage from '../../ui/shared/validation-message'\nimport { Extent, getCenter } from 'ol/extent'\nimport ModalOverlay, {\n ModalOverlayContent,\n ModalOverlayFooter,\n} from '../../ui/shared/overlays/modal-overlay'\nimport Button from '../../ui/elements/button'\nimport { getDistance } from 'ol/sphere'\nimport { distanceToString } from '../../../units'\nimport { Gcps } from './types'\nimport { fetchEpsg, wktToProj } from '../../../utils/geo-utils'\n\ninterface ProjectionWithMetadata extends proj.InterfaceProjection {\n GEOGCS?: { name?: string }\n srsCode?: string\n}\n\ntype ProjectionState =\n | 'loading'\n | 'unknown'\n | {\n projection: ProjectionWithMetadata\n name: string\n }\n\ninterface ImportPointsProps {\n bounds: Extent\n onImport: (sourceCrs: string, points: Gcps) => void\n onCancel: () => void\n}\n\ninterface MapPointsProps extends ImportPointsProps {\n file: File\n fetchEpsg: (epsg: number) => Promise\n}\n\ntype ProjectionAlias = { epsg: number; name: string }\n\nconst epsgAliases: Record = {\n 5845: { epsg: 3006, name: 'SWEREF99 TM + RH2000' },\n}\n\nexport default function ImportPoints(props: ImportPointsProps) {\n const [file, setFile] = useState()\n\n return !file ? (\n \n ) : (\n \n )\n}\n\nexport function MapPoints({\n bounds,\n onImport,\n onCancel,\n file,\n fetchEpsg,\n}: MapPointsProps) {\n const [selectedMapping, setSelectedMapping] = useState<\n FileMapping | undefined\n >(undefined)\n const [epsg, setEpsg] = useState(4326)\n const [knownEpsg, setKnownEpsg] = useReducer(\n (\n state: Record,\n { epsg, crs }: { epsg: number; crs: ProjectionState }\n ) => ({ ...state, [epsg]: crs }),\n {}\n )\n\n const debouncedEpsg = useDebounce(epsg, 500)\n useEffect(() => {\n if (!knownEpsg[debouncedEpsg]) {\n setKnownEpsg({ epsg: debouncedEpsg, crs: 'loading' })\n\n const alias = epsgAliases[debouncedEpsg]\n\n fetchEpsg(alias ? alias.epsg : debouncedEpsg)\n .then(wkt => {\n const projection = wktToProj(wkt)\n if (projection) {\n setKnownEpsg({\n epsg: debouncedEpsg,\n crs: {\n projection,\n name:\n alias?.name ||\n projection.GEOGCS?.name ||\n projection.srsCode ||\n debouncedEpsg.toString(),\n },\n })\n } else {\n setKnownEpsg({ epsg: debouncedEpsg, crs: 'unknown' })\n }\n })\n .catch(err => {\n console.warn(`Failed to get EPSG:${debouncedEpsg}`, err)\n setKnownEpsg({ epsg: debouncedEpsg, crs: 'unknown' })\n })\n }\n }, [debouncedEpsg, knownEpsg, fetchEpsg])\n\n const currentEpsg = knownEpsg[debouncedEpsg]\n\n const result = useMemo(() => {\n if (\n selectedMapping?.mappedCsv &&\n currentEpsg &&\n currentEpsg !== 'loading' &&\n currentEpsg !== 'unknown'\n ) {\n try {\n return featureCollection(\n selectedMapping.mappedCsv\n .filter(({ lat, lng, z }) =>\n [lat, lng, z].every(x => x != null && !isNaN(x as any))\n )\n .map((row, i) => {\n const sourceCoordinates = [row.lng, row.lat, row.z].map(Number)\n const { x, y, z } = proj.transform(\n currentEpsg.projection,\n proj.WGS84,\n sourceCoordinates.map(Number)\n )\n return point([x, y, z], {\n ...row,\n id: row.name,\n name: row.name || `GCP #${i + 1}`,\n numberMarkers: 0,\n sourceCoordinates,\n })\n })\n )\n } catch (e) {\n console.warn(e)\n return undefined\n }\n }\n }, [currentEpsg, selectedMapping])\n\n const hasValidMapping = ['lat', 'lng', 'z', 'name'].every(\n attribute =>\n selectedMapping && selectedMapping.mappedColumns.indexOf(attribute) >= 0\n )\n const hasValidNames = useMemo(() => {\n const names = result?.features.map(f => f.properties.name)\n return new Set(names).size === result?.features.length\n }, [result])\n const { hasValidCoords, maxDistance } = useMemo(() => {\n const center = getCenter(bounds)\n\n if (result && result.features.length > 0) {\n const hasValidCoords = result.features.every(\n ({ geometry: { coordinates } }) =>\n coordinates[0] >= bounds[0] &&\n coordinates[0] <= bounds[2] &&\n coordinates[1] >= bounds[1] &&\n coordinates[1] <= bounds[3]\n )\n\n return {\n hasValidCoords,\n maxDistance: result.features.reduce(\n (maxDist, feature) =>\n Math.max(\n maxDist,\n getDistance(center, feature.geometry.coordinates)\n ),\n 0\n ),\n }\n }\n\n return { hasValidCoords: false, maxDistance: 0 }\n }, [result, bounds])\n\n return (\n \n \n
\n
\n
\n \n {result ? (\n !hasValidMapping ? (\n \n Please map the columns from the imported file to Name,\n Latitude/Northing, Longitude/Easting and Altitude.\n \n ) : !hasValidNames ? (\n Please ensure each row has a unique name.\n ) : !hasValidCoords ? (\n \n The GCP coordinates are not valid or too far from the\n images\n {maxDistance\n ? ` (approximately ${distanceToString(maxDistance)})`\n : ''}\n , check the selected Coordinate Reference System\n \n ) : null\n ) : null}\n \n
\n
\n \n
\n
\n
\n \n
\n
\n setEpsg(Number(value))}\n />\n
\n
\n {currentEpsg === 'loading' ? (\n \n ) : currentEpsg === 'unknown' ? (\n Unknown EPSG\n ) : (\n currentEpsg?.name\n )}\n
\n
\n
\n
\n
\n \n
\n \n result && onImport(`EPSG:${debouncedEpsg}`, result)}>\n Import\n \n
\n
\n \n )\n}\n\nconst pointsMappings = {\n lat: {\n columnNames: ['latitude', 'lat', 'y', 'northing', 'north'],\n displayName: 'Latitude/Northing',\n },\n lng: {\n columnNames: ['longitude', 'lng', 'lon', 'long', 'x', 'easting', 'east'],\n displayName: 'Longitude/Easting',\n },\n z: {\n columnNames: ['elevation', 'altitude', 'alt', 'z', 'height'],\n displayName: 'Altitude',\n },\n name: {\n columnNames: ['name', 'type'],\n displayName: 'Name',\n },\n}\n\nfunction FilePicker({\n onFileSelected,\n}: {\n onFileSelected: (file: File) => void\n}) {\n const fileInputRef = useCallback(node => {\n if (node) {\n node.click()\n }\n }, [])\n\n return (\n {\n const file = e.target.files?.[0]\n if (file) {\n onFileSelected(file)\n }\n }}\n data-testid=\"gcp-file-picker\"\n />\n )\n}\n","/**\n * https://gist.github.com/adamwathan/3b9f3ad1a285a2d1b482769aeb862467\n */\n\nimport { CSSTransition as ReactCSSTransition } from 'react-transition-group'\nimport { createContext, useRef, useEffect, useContext } from 'react'\nimport PropTypes from 'prop-types'\n\nconst TransitionContext = createContext({\n parent: {},\n})\n\nfunction useIsInitialRender() {\n const isInitialRender = useRef(true)\n useEffect(() => {\n isInitialRender.current = false\n }, [])\n return isInitialRender.current\n}\n\nfunction CSSTransition({\n show,\n enter = '',\n enterFrom = '',\n enterTo = '',\n leave = '',\n leaveFrom = '',\n leaveTo = '',\n appear,\n children,\n}) {\n const enterClasses = enter.split(' ').filter(s => s.length)\n const enterFromClasses = enterFrom.split(' ').filter(s => s.length)\n const enterToClasses = enterTo.split(' ').filter(s => s.length)\n const leaveClasses = leave.split(' ').filter(s => s.length)\n const leaveFromClasses = leaveFrom.split(' ').filter(s => s.length)\n const leaveToClasses = leaveTo.split(' ').filter(s => s.length)\n\n function addClasses(node, classes) {\n classes.length && node.classList.add(...classes)\n }\n\n function removeClasses(node, classes) {\n classes.length && node.classList.remove(...classes)\n }\n\n return (\n {\n node.addEventListener('transitionend', done, false)\n }}\n onEnter={node => {\n addClasses(node, [...enterClasses, ...enterFromClasses])\n }}\n onEntering={node => {\n removeClasses(node, enterFromClasses)\n addClasses(node, enterToClasses)\n }}\n onEntered={node => {\n removeClasses(node, [...enterToClasses, ...enterClasses])\n }}\n onExit={node => {\n addClasses(node, [...leaveClasses, ...leaveFromClasses])\n }}\n onExiting={node => {\n removeClasses(node, leaveFromClasses)\n addClasses(node, leaveToClasses)\n }}\n onExited={node => {\n removeClasses(node, [...leaveToClasses, ...leaveClasses])\n }}>\n {children}\n \n )\n}\n\nexport default function Transition({ show, appear, ...rest }) {\n const { parent } = useContext(TransitionContext)\n const isInitialRender = useIsInitialRender()\n const isChild = show === undefined\n\n if (isChild) {\n return (\n \n )\n }\n\n return (\n \n \n \n )\n}\n\nCSSTransition.propTypes = {\n show: PropTypes.bool,\n enter: PropTypes.string,\n enterFrom: PropTypes.string,\n enterTo: PropTypes.string,\n leave: PropTypes.string,\n leaveFrom: PropTypes.string,\n leaveTo: PropTypes.string,\n appear: PropTypes.any,\n children: PropTypes.node,\n}\n\nTransition.propTypes = {\n show: PropTypes.bool,\n appear: PropTypes.any,\n}\n","import { Children, cloneElement } from 'react'\nimport PropTypes from 'prop-types'\n\n/**\n * @typedef {ButtonHTMLAttributes} ButtonProps\n * @property {string=} action\n * @property {string=} icon\n * @property {string=} size\n * @property {string} className\n * @property {boolean=} trailing\n */\n\n/**\n *\n * @param {ButtonProps} props\n * @returns\n */\nexport default function Button({\n children,\n action,\n icon,\n size,\n className,\n trailing,\n ...props\n}) {\n const leadingIcon = icon && !trailing\n const trailingIcon = icon && trailing\n return (\n \n {leadingIcon && }\n {children && (\n \n {children}\n \n )}\n {trailingIcon && }\n \n )\n}\n\nButton.defaultProps = {\n action: 'default',\n size: 'normal',\n type: 'button',\n}\n\nButton.propTypes = {\n onClick: PropTypes.any,\n children: PropTypes.node,\n action: PropTypes.oneOf([\n 'default',\n 'primary',\n 'primary-light',\n 'success',\n 'danger',\n ]),\n size: PropTypes.oneOf(['normal', 'medium', 'large']),\n disabled: PropTypes.bool,\n icon: PropTypes.string,\n className: PropTypes.any,\n trailing: PropTypes.bool,\n title: PropTypes.string,\n type: PropTypes.string,\n}\n\nexport function DropDownButton({ children, disabled, title }) {\n return (\n \n {children && {children}}\n \n )\n}\n\nDropDownButton.propTypes = {\n children: PropTypes.node,\n disabled: PropTypes.bool,\n title: PropTypes.string,\n}\n\nexport function IconButton({ onClick, icon }) {\n return (\n \n \n \n )\n}\n\nIconButton.propTypes = {\n onClick: PropTypes.func,\n icon: PropTypes.string,\n}\n\nexport function ButtonGroup({ children, className = '' }) {\n return (\n
\n {Children.map(children, child =>\n child ? cloneElement(child, { className: ['tw-mb-4'] }) : null\n )}\n
\n )\n}\n\nButtonGroup.propTypes = {\n className: PropTypes.string,\n children: PropTypes.node,\n}\n","import PropTypes from 'prop-types'\n\nexport default function Checkbox({\n id,\n type,\n children,\n onChange,\n active,\n disabled,\n helpText,\n hidden,\n inputProps,\n}) {\n const CheckboxComponent =\n !type || type === 'default' ? CustomCheckbox : Toggle\n\n return (\n \n \n \n \n )\n}\n\nCheckbox.propTypes = {\n id: PropTypes.string,\n onChange: PropTypes.func,\n active: PropTypes.bool,\n children: PropTypes.node,\n disabled: PropTypes.bool,\n type: PropTypes.oneOf(['default', 'toggle', 'green']),\n helpText: PropTypes.string,\n hidden: PropTypes.bool,\n inputProps: PropTypes.object,\n}\n\nexport function CustomCheckbox({ active, disabled, hidden, children }) {\n return (\n <>\n \n {active && (\n \n \n \n )}\n \n {children && (\n \n {children}\n \n )}\n \n )\n}\n\nCustomCheckbox.propTypes = {\n active: PropTypes.bool,\n children: PropTypes.node,\n disabled: PropTypes.bool,\n hidden: PropTypes.bool,\n}\n\nexport function Toggle({ active, disabled, children }) {\n return (\n <>\n
\n
\n \n \n {children && (\n \n {children}\n \n )}\n \n )\n}\n\nToggle.propTypes = {\n active: PropTypes.bool,\n children: PropTypes.node,\n disabled: PropTypes.bool,\n}\n","import PropTypes from 'prop-types'\nimport IconButton from './icon-button'\n\nexport default function CloseButton({ onClick, ...props }) {\n return (\n \n )\n}\n\nCloseButton.propTypes = {\n onClick: PropTypes.func,\n}\n","import PropTypes from 'prop-types'\n\nexport default function IconButton({\n onClick,\n icon,\n disabled,\n className,\n ...props\n}) {\n return (\n \n \n \n )\n}\n\nIconButton.propTypes = {\n icon: PropTypes.string.isRequired,\n onClick: PropTypes.func,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n iconClassName: PropTypes.string,\n}\n","import { ForwardedRef, forwardRef, InputHTMLAttributes } from 'react'\n\ninterface InputProps extends InputHTMLAttributes {\n hasValidation?: boolean\n isInvalid?: boolean\n large?: boolean\n uiSize?: 'small' | 'default' | 'large'\n}\n\nconst Input = forwardRef(function (\n {\n disabled,\n large,\n uiSize = 'default',\n hasValidation,\n className,\n isInvalid,\n ...props\n },\n ref: ForwardedRef\n) {\n large = large || uiSize === 'large'\n const small = !large && uiSize === 'small'\n\n return (\n \n )\n})\n\nexport default Input\n","import PropTypes from 'prop-types'\n\n/**\n *\n * @param {import('react').LabelHTMLAttributes} props\n * @param {string=} props.className\n * @returns\n */\nexport default function Label({ className, size = 'default', ...props }) {\n return (\n \n {props.children}\n \n )\n}\n\nLabel.propTypes = {\n className: PropTypes.string,\n size: PropTypes.oneOf(['default', 'small']),\n children: PropTypes.node,\n}\n","import PropTypes from 'prop-types'\nimport { SelectHTMLAttributes } from 'react'\n\ninterface SelectProps extends SelectHTMLAttributes {\n id?: string\n label?: string\n}\n\nexport default function Select({\n id,\n onChange,\n children,\n value,\n label,\n disabled,\n ...props\n}: SelectProps) {\n return (\n <>\n {label && (\n \n {label}\n \n )}\n
\n \n {children}\n \n
\n \n
\n
\n \n )\n}\n\nSelect.propTypes = {\n id: PropTypes.string,\n onChange: PropTypes.func,\n children: PropTypes.node,\n label: PropTypes.string,\n disabled: PropTypes.bool,\n value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n}\n","// From https://gist.github.com/reecelucas/2f510e6b8504008deaaa52732202d2da\n\nimport { useRef } from 'react'\n\nconst safeDocument = typeof document !== 'undefined' ? document : {}\n\n/**\n * Usage:\n * const [blockScroll, allowScroll] = useScrollBlock();\n */\nexport default function useScrollBlock() {\n const scrollBlocked = useRef()\n const html = safeDocument.documentElement\n const { body } = safeDocument\n\n const blockScroll = () => {\n if (!body || !body.style || scrollBlocked.current) return\n\n const scrollBarWidth = window.innerWidth - html.clientWidth\n const bodyPaddingRight =\n parseInt(\n window.getComputedStyle(body).getPropertyValue('padding-right')\n ) || 0\n\n /**\n * 1. Fixes a bug in iOS and desktop Safari whereby setting\n * `overflow: hidden` on the html/body does not prevent scrolling.\n * 2. Fixes a bug in desktop Safari where `overflowY` does not prevent\n * scroll if an `overflow-x` style is also applied to the body.\n */\n // html.style.position = 'relative' /* [1] */\n html.style.overflow = 'hidden' /* [2] */\n // body.style.position = 'relative' /* [1] */\n body.style.overflow = 'hidden' /* [2] */\n body.style.paddingRight = `${bodyPaddingRight + scrollBarWidth}px`\n\n scrollBlocked.current = true\n }\n\n const allowScroll = () => {\n if (!body || !body.style || !scrollBlocked.current) return\n\n html.style.position = ''\n html.style.overflow = ''\n body.style.position = ''\n body.style.overflow = ''\n body.style.paddingRight = ''\n\n scrollBlocked.current = false\n }\n\n return [blockScroll, allowScroll]\n}\n","import { useEffect, useState, useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport { createPortal } from 'react-dom'\nimport Transition from '../../../transition'\nimport { fadeIn } from './transitions'\nimport WindowListener from '../../../window-listener'\nimport useScrollBlock from '../../../../hooks/use-scroll-block'\n\nexport default function BaseOverlay({\n children,\n className,\n onDismiss,\n show,\n transitions,\n backdrop = true,\n dismissOnEscape = false,\n dismissOnOutsideClick = true,\n}) {\n const [modalElement] = useState(document.createElement('div'))\n const contentTransitions = transitions || fadeIn\n const [blockScroll, allowScroll] = useScrollBlock()\n\n const handleEscapeEvent = useCallback(\n event => event.keyCode === 27 && onDismiss(),\n [onDismiss]\n )\n\n useEffect(() => {\n document.body.appendChild(modalElement)\n return () => {\n document.body.removeChild(modalElement)\n }\n }, [modalElement])\n\n useEffect(() => {\n show ? blockScroll() : allowScroll()\n return () => {\n allowScroll()\n }\n }, [allowScroll, blockScroll, show])\n\n return (\n modalElement &&\n createPortal(\n \n show && dismissOnEscape && handleEscapeEvent(event)\n }>\n \n
\n {backdrop && (\n \n \n \n )}\n \n
\n {show && children}\n
\n \n
\n
\n ,\n modalElement\n )\n )\n}\n\nBaseOverlay.propTypes = {\n children: PropTypes.node,\n className: PropTypes.string,\n onDismiss: PropTypes.func.isRequired,\n show: PropTypes.bool,\n transitions: PropTypes.shape({\n enter: PropTypes.string,\n enterFrom: PropTypes.string,\n enterTo: PropTypes.string,\n leave: PropTypes.string,\n leaveFrom: PropTypes.string,\n leaveTo: PropTypes.string,\n }),\n dismissOnEscape: PropTypes.bool,\n}\n","import { ReactNode } from 'react'\nimport CloseButton from '../../elements/close-button'\nimport BaseOverlay from './base-overlay'\nimport { ReactChildren } from '../../../../types/common'\n\nexport type ModalOverlaySize = 'adaptive' | 'small' | 'large' | 'xl'\n\nexport interface ModalOverlayProps extends ReactChildren {\n title?: ReactNode\n onDismiss: () => void\n show: boolean\n size?: ModalOverlaySize\n dismissOnEscape?: boolean\n dismissOnOutsideClick?: boolean\n noHeader?: boolean\n}\n\nexport default function ModalOverlay({\n children,\n title,\n onDismiss,\n show,\n size = 'small',\n dismissOnEscape = true,\n dismissOnOutsideClick = true,\n noHeader,\n}: ModalOverlayProps): JSX.Element {\n const modalWidth =\n size === 'small'\n ? 'md:tw-w-modal-overlay-small'\n : size === 'large'\n ? 'md:tw-w-modal-overlay-large'\n : size === 'xl'\n ? 'md:tw-w-modal-overlay-xl'\n : size === 'adaptive'\n ? ''\n : 'md:tw-w-modal-overlay-small'\n\n return (\n \n \n
\n {!noHeader && (\n
\n \n {title && (\n

{title}

\n )}\n
\n )}\n {children}\n
\n \n \n )\n}\n\ninterface ModalOverlayContentProps extends ReactChildren {\n className?: string\n}\nexport function ModalOverlayContent({\n children,\n className,\n}: ModalOverlayContentProps): JSX.Element {\n return (\n \n {children}\n \n )\n}\n\nexport function ModalOverlayFooter({ children }: ReactChildren): JSX.Element {\n return (\n
\n {children}\n
\n )\n}\n","export const fadeIn = {\n enter: 'tw-transition tw-ease-in-out tw-duration-300',\n enterFrom: 'tw-opacity-0',\n enterTo: 'tw-opacity-100',\n leave: 'tw-transition tw-ease-in-out tw-duration-300',\n leaveFrom: 'tw-opacity-100',\n leaveTo: 'tw-opacity-0',\n}\n\nexport const slideInFromTop = {\n enter: 'tw-transition tw-ease-in-out tw-duration-500',\n enterFrom: 'tw-custom-translate-y-full',\n enterTo: 'tw-custom-translate-y-0',\n leave: 'tw-transition tw-ease-in-out tw-duration-500',\n leaveFrom: 'tw-custom-translate-y-0',\n leaveTo: 'tw-custom-translate-y-full',\n}\n","import PropTypes from 'prop-types'\n\nexport default function ValidationMessage({ children, type }) {\n return (\n
\n {\n <>\n \n {children || <> }\n \n \n }\n
\n )\n}\n\nValidationMessage.defaultProps = {\n type: 'default',\n}\n\nValidationMessage.propTypes = {\n children: PropTypes.node,\n type: PropTypes.oneOf(['danger', 'default', 'success']),\n}\n","import { Component } from 'react'\nimport PropTypes from 'prop-types'\n\nexport default class WindowListener extends Component {\n constructor(props) {\n super(props)\n\n this.listeners = Object.keys(props)\n .filter(p => p.startsWith('on'))\n .map(p => [p.charAt(2).toLocaleLowerCase() + p.substring(3), p])\n }\n\n componentDidMount() {\n this.listeners.forEach(([event, handlerProp]) =>\n window.addEventListener(event, this.props[handlerProp])\n )\n }\n\n componentWillUnmount() {\n this.listeners.forEach(([event, handlerProp]) =>\n window.removeEventListener(event, this.props[handlerProp])\n )\n }\n\n componentDidUpdate(oldProps) {\n this.listeners.forEach(([event, handlerProp]) => {\n if (this.props[handlerProp] !== oldProps[handlerProp]) {\n window.removeEventListener(event, oldProps[handlerProp])\n window.addEventListener(event, this.props[handlerProp])\n }\n })\n }\n\n render() {\n return <>{this.props.children}\n }\n}\n\nWindowListener.propTypes = {\n children: PropTypes.node,\n}\n","import { useEffect, useState } from 'react'\n\n// Copied from https://usehooks.com/useDebounce/\nexport default function useDebounce(value: T, delay: number): T {\n // State and setters for debounced value\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(\n () => {\n // Update debounced value after delay\n const handler = setTimeout(() => {\n setDebouncedValue(value)\n }, delay)\n\n // Cancel the timeout if value changes (also on delay change or unmount)\n // This is how we prevent debounced value from updating if value is changed ...\n // .. within the delay period. Timeout gets cleared and restarted.\n return () => {\n clearTimeout(handler)\n }\n },\n [value, delay] // Only re-call effect if value or delay changes\n )\n\n return debouncedValue\n}\n","import * as sphere from 'ol/sphere'\n\nexport function areaToString(area, units, labels, options) {\n labels = labels || {}\n if (area === undefined || area === null) return '-'\n\n options = options || {}\n const showUnit = options.onlyValue === undefined || !options.onlyValue\n\n if (units !== 'imperial') {\n if (options.alwaysFieldUnits || area >= 1000) {\n return (\n (area / 10000).toFixed(2) + (showUnit ? ' ' + (labels.ha || 'ha') : '')\n )\n } else if (area < 0.1) {\n return (\n (area * 10000).toFixed(0) +\n (showUnit ? ' ' + (labels.cm2 || 'cm²') : '')\n )\n } else {\n return (\n area.toFixed(area < 10 ? 2 : area < 100 ? 1 : 0) +\n (showUnit ? ' ' + (labels.m2 || 'm²') : '')\n )\n }\n } else {\n if (options.alwaysFieldUnits || area >= 404.6856) {\n // 0.1 acres\n return (area * 0.000247105).toFixed(2) + (showUnit ? ' ac' : '')\n } else if (area < 1.93548) {\n return (area * 1550.0031).toFixed(0) + (showUnit ? ' in²' : '')\n } else {\n return (area * 10.7639).toFixed(0) + (showUnit ? ' ft²' : '')\n }\n }\n}\n\nexport function distanceToString(length, units, labels, options) {\n if (length === undefined || length === null) return '-'\n options = options || {}\n const decimals =\n options.decimals == null || typeof options.decimals !== 'number'\n ? 2\n : options.decimals\n const absLength = Math.abs(length)\n\n if (units !== 'imperial') {\n if (absLength > 1000) {\n return (\n (length / 1000).toFixed(decimals) +\n (options.onlyValue ? '' : ' ' + ((labels && labels.km) || 'km'))\n )\n } else if (absLength < 1) {\n return (\n (length * 100).toFixed(Math.max(0, decimals - 2)) +\n (options.onlyValue ? '' : ' cm')\n )\n } else {\n return (\n length.toFixed(decimals) +\n (options.onlyValue ? '' : ' ' + ((labels && labels.m) || 'm'))\n )\n }\n } else {\n if (absLength > 1609) {\n return (\n (length / 1609.34).toFixed(decimals) + (options.onlyValue ? '' : ' mi')\n )\n } else {\n return (\n (length / 0.3048).toFixed(decimals) + (options.onlyValue ? '' : ' ft')\n )\n }\n }\n}\n\nexport function resolutionToString(r, units) {\n if (r === undefined || r === null) return '-'\n\n const resolutionInUnits = units !== 'imperial' ? r : r * 0.393701\n return `${resolutionInUnits.toFixed(getNumberDecimals(resolutionInUnits))} ${\n units !== 'imperial' ? 'cm' : 'in'\n }/px`\n}\n\nexport function massToString(m, units, labels, options) {\n if (m === undefined || m === null) return '-'\n\n options = options || {}\n const showUnit = options.onlyValue === undefined || !options.onlyValue\n return units !== 'imperial'\n ? m.toFixed(1) + (showUnit ? ' ' + 'kg' : '')\n : (m * 2.20462).toFixed(1) + (showUnit ? ' lb' : '')\n}\n\nexport function prescriptionToString(p, units, labels, options) {\n if (p === undefined || p === null) return '-'\n\n options = options || {}\n const showUnit = options.onlyValue === undefined || !options.onlyValue\n return units !== 'imperial'\n ? p.toFixed(1) + (showUnit ? ' kg/ha' : '')\n : (p * 0.892179).toFixed(1) + (showUnit ? ' lb/ac' : '')\n}\n\nexport function density(x, area, units) {\n return units !== 'imperial'\n ? x / (area / 10000) // units / ha\n : x / (area * 0.000247105) // units / ac\n}\n\nexport function densityToString(x, area, units, name) {\n var d = density(x, area, units)\n return (\n d.toFixed(0) + ' ' + name + '/' + (units !== 'imperial' ? 'ha' : 'acre')\n )\n}\n\nexport function areaInMeters(geom) {\n return Math.abs(sphere.getArea(geom, { projection: 'EPSG:4326' }))\n}\n\nexport function geometryAreaToString(geom, units, labels) {\n return areaToString(areaInMeters(geom), units, labels)\n}\n\nexport function bytesSizeToString(bytes) {\n if (isNaN(bytes)) return 'Unknown'\n\n var sizes = [\n [1024 * 1024 * 1024, 'GB', 1],\n [1024 * 1024, 'MB', 1],\n [1024, 'KB', 1],\n [1, 'bytes', 0],\n ]\n\n bytes = Number(bytes)\n\n var i\n for (i = 0; i < sizes.length - 1 && bytes < sizes[i][0]; i++);\n return `${(bytes / sizes[i][0]).toFixed(sizes[i][2])} ${sizes[i][1]}`\n}\n\nexport function toHumanSize(bytes) {\n if (isNaN(bytes)) return 'Unknown'\n\n const sizes = [\n [1024 * 1024 * 1024, 'GB', 1],\n [1024 * 1024, 'MB', 1],\n [1024, 'KB', 1],\n [1, 'bytes', 0],\n ]\n\n bytes = Number(bytes)\n\n let i\n for (i = 0; i < sizes.length - 1 && bytes < sizes[i][0]; i++);\n return `${(bytes / sizes[i][0]).toFixed(sizes[i][2])} ${sizes[i][1]}`\n}\n\nexport function gramsToTon(grams) {\n if (grams === undefined || grams === null) return '-'\n return `${(grams / (1000 * 1000)).toFixed(1)} tons`\n}\n\nconst numberFormat = new Intl.NumberFormat()\n\nexport function formatNumber(n) {\n return numberFormat.format(n)\n}\n\n/**\n * Given a delta x where x is the length of a range (min,max), returns a number of decimals that is\n * suitable for display of values within this range. For small ranges, a larger number of decimals is\n * chosen, for large ranges fewer decimals are used.\n *\n * @param {number} x the length of the range\n * @param {number} fudge a fudge factor where a higher value will skew the return value towards more decimals (default is 1.2)\n */\nexport function getNumberDecimals(x, fudge = 1.2) {\n return Math.ceil(Math.max(0, -Math.log10(Math.abs(x)) + fudge))\n}\n","import * as olCoordinate from 'ol/coordinate'\nimport * as olProj from 'ol/proj'\nimport * as utmZone from 'utm-zone'\nimport proj4 from 'proj4'\nimport bbox from '@turf/bbox'\nimport { featureCollection, polygon } from '@turf/helpers'\nimport { coordEach } from '@turf/meta'\nimport uuidv4 from 'uuid/v4'\nimport { getCenter, getHeight, getWidth } from 'ol/extent'\nimport GeoJSONReader from 'jsts/org/locationtech/jts/io/GeoJSONReader.js'\nimport Valid from 'jsts/org/locationtech/jts/operation/valid/IsValidOp.js'\nimport booleanValid from '@turf/boolean-valid'\n\nexport const layerNames = {\n ortho: 'results/ortho.tiff',\n dem: 'results/dem.tif',\n dem_color: 'results/dem_color.tif',\n}\n\nexport const getLngLat = sphericalMercatorCoordinate => {\n if (sphericalMercatorCoordinate.some(coordinate => isNaN(coordinate))) {\n return null\n }\n return olProj.transform(sphericalMercatorCoordinate, 'EPSG:3857', 'EPSG:4326')\n}\nexport const getSphericalMercator = lngLat => {\n if (lngLat.some(coordinate => isNaN(coordinate))) {\n return null\n }\n return olProj.transform(lngLat, 'EPSG:4326', 'EPSG:3857')\n}\n\nexport const getUtmProjFromLngLat = coordinates => {\n if (!coordinates || coordinates.some(coordinate => isNaN(coordinate))) {\n return [null, null]\n }\n\n const projDef = utmZone.proj({ coordinates: coordinates })\n const proj = proj4(projDef)\n\n return [proj, projDef]\n}\n\nexport const getMapRotationUtm = (map, projDef) => {\n if (!map || !projDef) {\n return null\n }\n const [mapMinX, mapMinY, , mapMaxY] = map\n .getView()\n .calculateExtent(map.getSize())\n\n if ([mapMinX, mapMinY, mapMaxY].some(coordinate => isNaN(coordinate))) {\n return 0\n }\n\n const projToSpherical = proj4(projDef, 'EPSG:3857')\n const [utmMinX, utmMinY] = projToSpherical.inverse([mapMinX, mapMinY])\n const [utmMaxX, utmMaxY] = projToSpherical.inverse([mapMinX, mapMaxY])\n\n return (Math.atan2(utmMaxY - utmMinY, utmMaxX - utmMinX) / Math.PI) * 180 - 90\n}\n\nexport const getSquareFromCenterCoordinate = (\n coordinateLngLat,\n bufferInMeters,\n rotation,\n proj,\n projDef,\n outputProjection = 'EPSG:3857'\n) => {\n return getRectangleFromCenterCoordinate(\n coordinateLngLat,\n [bufferInMeters, bufferInMeters],\n rotation,\n proj,\n projDef,\n outputProjection\n )\n}\n\nexport const getRectangleFromCenterCoordinate = (\n coordinateLngLat,\n sides,\n rotation,\n proj,\n projDef,\n outputProjection = 'EPSG:3857'\n) => {\n const [bufferXInMeters, bufferYInMeters] = sides\n const centerUtmCoord = proj?.forward(coordinateLngLat)\n const cornerCoord = olCoordinate.add(centerUtmCoord?.slice(), [\n -bufferXInMeters / 2,\n -bufferYInMeters / 2,\n ])\n\n const axisVectors = [\n [1, 0],\n [0, 1],\n ].map(vector => olCoordinate.rotate(vector, (rotation / 180) * Math.PI))\n\n const projToOutProj = proj4(projDef, outputProjection)\n\n const sideVectors = axisVectors.map((v, i) => v.map(c => c * sides[i]))\n const rectangle = [\n cornerCoord.slice(),\n olCoordinate.add(cornerCoord.slice(), sideVectors[1]),\n olCoordinate.add(\n olCoordinate.add(cornerCoord.slice(), sideVectors[1]),\n sideVectors[0]\n ),\n olCoordinate.add(cornerCoord.slice(), sideVectors[0]),\n cornerCoord.slice(),\n ].map(projToOutProj.forward)\n\n return rectangle\n}\n\nexport const getExtentFromGeoJson = geojson => {\n const extent = bbox(geojson)\n return olProj.transformExtent(extent, 'EPSG:4326', 'EPSG:3857')\n}\n\nexport const geometryToFeatureCollection = geometry => {\n const geometryCoordinates = geometry.getCoordinates()\n const featureCoordinates = transformCoords(\n geometry.getType() === 'MultiPolygon'\n ? geometryCoordinates[0]\n : geometryCoordinates,\n 'EPSG:3857',\n 'EPSG:4326'\n )\n\n const resultFeatureCollection = featureCollection([\n polygon(featureCoordinates, { gid: uuidv4() }),\n ])\n\n return resultFeatureCollection\n}\n\nexport const transformCoords = (coordinates, source, destination) => {\n return isNaN(coordinates[0])\n ? coordinates.map(c => transformCoords(c, source, destination))\n : olProj.transform(coordinates, source, destination)\n}\n\n/**\n * Rounds coordinates in a GeoJSON object to limit the number of decimals.\n * Although the GeoJSON spec recommends 6 decimals, we default to 8 decimals\n * since our data needs sub centimeter precision.\n * 8 decimals should give about 0.1 cm precision.\n *\n * This function will alter the GeoJSON object in place to\n * round the coordinates.\n */\nexport function stripGeoJSONDecimals(geojson, decimals = 8) {\n coordEach(geojson, c => {\n c[0] = Number(c[0].toFixed(decimals))\n c[1] = Number(c[1].toFixed(decimals))\n })\n\n return geojson\n}\n\n/**\n * Given an extent, create the smallest extent that contains the input extent\n * and has the aspect ratio (width/height) requested.\n * @param {import('ol/extent').Extent} extent\n * @param {number} aspectRatio width / height ratio\n * @returns an extent that contains the input extent but has the requested aspect ratio\n */\nexport function getSmallestContainingExtent(extent, aspectRatio) {\n const width = getWidth(extent)\n const height = getHeight(extent)\n const center = getCenter(extent)\n\n let newWidth\n let newHeight\n if (width / height < aspectRatio) {\n newWidth = height * aspectRatio\n newHeight = height\n } else {\n newWidth = width\n newHeight = width / aspectRatio\n }\n\n return [\n center[0] - newWidth / 2,\n center[1] - newHeight / 2,\n center[0] + newWidth / 2,\n center[1] + newHeight / 2,\n ]\n}\n\n/**\n * Given an extent, create the largest extent that is contained by the input extent\n * and has the aspect ratio (width/height) requested.\n * @param {import('ol/extent').Extent} extent\n * @param {number} aspectRatio width / height ratio\n * @returns an extent that is contained by the input extent and has the requested aspect ratio\n */\nexport function getLargestContainedExtent(extent, aspectRatio) {\n const width = getWidth(extent)\n const height = getHeight(extent)\n const center = getCenter(extent)\n\n let newWidth\n let newHeight\n if (width / height < aspectRatio) {\n newWidth = width\n newHeight = width / aspectRatio\n } else {\n newWidth = height * aspectRatio\n newHeight = height\n }\n\n return [\n center[0] - newWidth / 2,\n center[1] - newHeight / 2,\n center[0] + newWidth / 2,\n center[1] + newHeight / 2,\n ]\n}\n\nexport function isValidGeometry(geojsonGeometry) {\n if (geojsonGeometry == null) {\n return false\n }\n\n if (geojsonGeometry.geometry) {\n geojsonGeometry = geojsonGeometry.geometry\n }\n\n if (!geojsonGeometry.coordinates) {\n throw new Error(\n 'This is not a GeoJSON geometry, or is a MultiGeometry (coordinates are missing).'\n )\n }\n\n // Run \"cheap\" valid check in turf\n if (!booleanValid(geojsonGeometry)) {\n return false\n }\n\n // Run more robust valid check in JSTS\n const reader = new GeoJSONReader()\n const geom = reader.read(geojsonGeometry)\n return new Valid(geom).isValid()\n}\n\nexport function coordEquals(c1, c2) {\n if (!c1 || !c2 || c1.length !== c2) {\n return false\n }\n\n return c1[0] === c2[0] && c1[1] === c2[1]\n}\n\n/**\n * Tells if an ring is in clockwise direction. Note that the\n * ring must be in GeoJSON format, i.e. last coordinate must\n * be a copy of first coordinate to close the ring.\n *\n * @param {import('ol/coordinate').Coordinate[]} coordinates\n * @returns `true` if coordinates are clockwise\n */\nexport function clockwise(coordinates) {\n let sum = 0\n for (let i = 0; i < coordinates.length - 1; i++) {\n const c1 = coordinates[i]\n const c2 = coordinates[i + 1]\n sum += (c2[0] - c1[0]) * (c2[1] + c1[1])\n }\n\n return sum >= 0\n}\n\n/**\n * Fetches WKT definition for the specified EPSG code\n * @param {number} epsg the code to fetch\n * @returns {Promise} a promise resolving to the specified projection definition _or an empty string_ if there is an error\n */\nexport function fetchEpsg(epsg) {\n return fetch(`https://epsg.io/${epsg}.wkt`).then(res =>\n res.ok ? res.text() : ''\n )\n}\n\n/**\n * @interface ProjectionWithMetadata\n * @extends import('proj4').InterfaceProjection\n * @property {{ name?: string }=} GEOGCS\n * @property {string=} srsCode\n */\n\n/**\n *\n * @param {string|undefined} wkt\n * @returns {ProjectionWithMetadata}\n */\nexport function wktToProj(wkt) {\n if (wkt) {\n try {\n return proj4.Proj(wkt)\n } catch (e) {\n // EPSG.io seems less than reliable to set a proper HTTP status\n // when the CRS is unknown/weird, so this is how we handle it for now...\n }\n }\n\n return undefined\n}\n"],"names":["CsvImporter","columnMappings","file","onChange","mapping","setMapping","useState","data","setData","hasHeaders","setHasHeaders","useEffect","async","contents","TextDecoder","decode","arrayBuffer","lines","split","map","line","trim","filter","i","startsWith","separator","indexOf","col","replace","parseCsv","every","column","isNaN","csv","headings","substring","columnNames","Object","keys","guessedMappings","heading","normalizedHeading","toLowerCase","matchIndex","findIndex","c","includes","push","splice","undefined","guessMappings","readData","length","mappedColumns","mappedCsv","slice","row","reduce","mappedRow","columnMapping","headers","_jsxs","_Fragment","children","_jsx","className","header","colMapping","Select","value","e","index","attribute","nextMapping","x","updateMapping","target","displayName","Checkbox","active","checked","epsgAliases","epsg","name","ImportPoints","props","setFile","MapPoints","fetchEpsg","FilePicker","onFileSelected","bounds","onImport","onCancel","selectedMapping","setSelectedMapping","setEpsg","knownEpsg","setKnownEpsg","useReducer","state","crs","debouncedEpsg","useDebounce","alias","then","wkt","projection","wktToProj","GEOGCS","srsCode","toString","catch","err","console","warn","currentEpsg","result","useMemo","featureCollection","lat","lng","z","sourceCoordinates","Number","y","proj","transform","WGS84","point","id","numberMarkers","hasValidMapping","hasValidNames","names","features","f","properties","Set","size","hasValidCoords","maxDistance","center","getCenter","geometry","coordinates","maxDist","feature","Math","max","getDistance","ModalOverlay","title","show","onDismiss","ModalOverlayContent","ValidationMessage","distanceToString","pointsMappings","Label","htmlFor","Input","type","hasValidation","ModalOverlayFooter","Button","onClick","action","disabled","fileInputRef","useCallback","node","click","style","display","ref","files","TransitionContext","createContext","parent","CSSTransition","enter","enterFrom","enterTo","leave","leaveFrom","leaveTo","appear","enterClasses","s","enterFromClasses","enterToClasses","leaveClasses","leaveFromClasses","leaveToClasses","addClasses","classes","classList","add","removeClasses","remove","ReactCSSTransition","unmountOnExit","in","addEndListener","done","addEventListener","onEnter","onEntering","onEntered","onExit","onExiting","onExited","Transition","rest","useContext","isInitialRender","useRef","current","useIsInitialRender","Provider","propTypes","PropTypes","icon","trailing","leadingIcon","trailingIcon","DropDownButton","ButtonGroup","Children","child","cloneElement","defaultProps","helpText","hidden","inputProps","CheckboxComponent","Toggle","CustomCheckbox","viewBox","d","CloseButton","IconButton","isRequired","iconClassName","forwardRef","large","uiSize","isInvalid","small","label","safeDocument","document","BaseOverlay","transitions","backdrop","dismissOnEscape","dismissOnOutsideClick","modalElement","createElement","contentTransitions","fadeIn","blockScroll","allowScroll","scrollBlocked","html","documentElement","body","scrollBarWidth","window","innerWidth","clientWidth","bodyPaddingRight","parseInt","getComputedStyle","getPropertyValue","overflow","paddingRight","position","useScrollBlock","handleEscapeEvent","event","keyCode","appendChild","removeChild","createPortal","WindowListener","onKeydown","tabIndex","noHeader","modalWidth","slideInFromTop","Component","constructor","super","this","listeners","p","charAt","toLocaleLowerCase","componentDidMount","forEach","handlerProp","componentWillUnmount","removeEventListener","componentDidUpdate","oldProps","render","delay","debouncedValue","setDebouncedValue","handler","setTimeout","clearTimeout","areaToString","area","units","labels","options","showUnit","onlyValue","alwaysFieldUnits","toFixed","ha","cm2","m2","decimals","absLength","abs","km","m","resolutionToString","r","resolutionInUnits","getNumberDecimals","massToString","prescriptionToString","areaInMeters","geom","sphere","toHumanSize","bytes","sizes","gramsToTon","grams","numberFormat","Intl","NumberFormat","formatNumber","n","format","fudge","ceil","log10","layerNames","ortho","dem","dem_color","getLngLat","sphericalMercatorCoordinate","some","coordinate","olProj","getUtmProjFromLngLat","projDef","utmZone","proj4","getSquareFromCenterCoordinate","coordinateLngLat","bufferInMeters","rotation","outputProjection","getRectangleFromCenterCoordinate","sides","bufferXInMeters","bufferYInMeters","centerUtmCoord","forward","cornerCoord","olCoordinate","axisVectors","vector","PI","projToOutProj","sideVectors","v","getExtentFromGeoJson","geojson","extent","bbox","geometryToFeatureCollection","geometryCoordinates","getCoordinates","featureCoordinates","transformCoords","getType","polygon","gid","uuidv4","source","destination","getSmallestContainingExtent","aspectRatio","width","getWidth","height","getHeight","newWidth","newHeight","getLargestContainedExtent","isValidGeometry","geojsonGeometry","Error","booleanValid","GeoJSONReader","read","Valid","isValid","coordEquals","c1","c2","clockwise","sum","fetch","res","ok","text","Proj"],"sourceRoot":""}