{"version":3,"sources":["components/plants/searchResults/LocationSearchResults/LocationResult.tsx","components/plants/searchResults/LocationSearchResults/LocationSearchResults.tsx","components/filter/FilterPlantsByCharacteristicsButton.tsx","components/plants/PhenologySearch/PhenologySearchResults/PhenologySearchResults.tsx","components/plants/PhenologySearch/PhenologyDatePicker/PhenologyDatePicker.tsx","components/plants/PhenologySearch/PhenologySearchDateRangeSelection/PhenologySearchDateRangeSelection.tsx","components/plants/PhenologySearch/PhenologyInfoButtonModal/PhenologyInfoButtonModal.tsx","components/plants/PhenologySearch/PhenologySearch.tsx","services/getPlantsPhenologyData.ts","components/plants/SearchPlants.tsx","images/bloom-icon.png","components/common/ExternalLink/ExternalLink.tsx","components/plants/previews/SearchPlantsCardHeader.tsx","components/plants/previews/SearchPlantsPreviewResults.tsx","components/plants/previews/FamilyPreview.tsx","components/plants/previews/PlantPreviewDetailsHeader/PlantPreviewDetailsHeader.tsx","components/plants/previews/PlantPreview.tsx","components/plants/previews/GenusPreview.tsx","components/plants/previews/LocationPreview.tsx","components/plants/previews/CommonNamePreferredResults/CommonNamePreferredResults.tsx","components/plants/Card.tsx","components/map/Map.tsx","utils/garden.util.ts","utils/map/images.util.ts"],"names":["LocationResult","props","index","location","width","garden","GardenLocation","GardenCode","_jsxs","className","style","concat","children","_jsx","minWidth","height","marginRight","backgroundColor","WidgetImage","alt","gallery","Link","to","pathname","getPath","onClick","mapController","updateMapSelectedGardenLocations","LocationSearchResults","dispatch","useDispatch","gardenLocations","useSelector","$gardenLocations","numberOfColumns","setNumberOfColumns","useState","rows","setRows","useEffect","setMinimized","_chunk","rowRenderer","_ref","isScrolling","key","parseInt","display","map","LOCATIONS_ESRI_FIELD","LOCATIONS_GROUP_FIELD","id","AutoSizer","_ref2","columns","getNumberOfResultColumns","updateColumns","List","ref","overscanRowCount","noRowsRenderer","PlantSearchFindPlantInGarden","rowCount","length","rowHeight","AUTOSIZER_GARDEN_LOCATION__ROW_HEIGHT","FilterPlantsByCharacteristicsButton","filterDefinitionExpression","state","filterReducer","_Fragment","setModalContent","PhenologySearchResults","phenologyFloweringResults","$phenologyFloweringResults","phenologyFloweringDayStart","$phenologyFloweringDayStart","phenologyFloweringDayEnd","$phenologyFloweringDayEnd","phenologyFlowering","$phenologyFlowering","dayOfYear","dayOfYearStart","dayOfYearEnd","phenologyDataFloweringFiltered","filter","item","phenologyDataFilteredNames","_uniqBy","phenologyResult","name","sortedPhenologyResults","_sortBy","setPhenologyFloweringResults","formatDayOfTheYear","dayOfTheYear","Date","toLocaleDateString","month","day","handleFilterButtonClick","setPhenologyDisplayFloweringResults","IconFilter","fillColor","PlantSearchResults","results","searchField","isAdvancedSearchField","searchFieldAdvanced","isBloomResults","Loader","PhenologyDatePicker","date","onChange","minDate","maxDate","label","type","buttonRef","open","setOpen","handleOpen","currentHoverDate","setCurrentHoverDate","LocalizationProvider","dateAdapter","AdapterDayjs","dateFormats","monthAndYear","MobileDatePicker","onClose","handleClose","onOpen","views","toolbarFormat","value","closeOnSelect","DialogProps","renderInput","inputRef","inputProps","InputProps","Button","endIcon","EventIcon","readOnly","renderDay","_value","DayComponentProps","isSelected","dayjs","isSame","highlight","PickersDay","selected","onMouseEnter","onMouseLeave","undefined","PhenologySearchDateRangeSelection","phenologySliderStartingDate","$phenologySliderStartingDate","phenologySliderValues","$phenologySliderValues","sliderNumberOfDays","add","diff","sliderMarks","setSliderMarks","getUpdatedSliderMarks","values","setValues","start","end","setInitialDateRange","toDate","targetYear","selectedDate","endDate","getMonth","getFullYear","getDate","newPhenologySliderStartingDate","setPhenologySliderStartingDate","toString","updatedValues","getSliderValueFromDate","setPhenologyFloweringDateStart","getDayOfYear","startingDate","updatedPhenologyStartingDate","setPhenologyFloweringDateEnd","subtract","IconButton","size","handleMonthBack","currentStartingMonth","newSliderStartingMonth","newSliderStartingDate","PHENOLOGY_SEARCH_YEAR","startDate","ArrowBackIcon","Slider","max","min","step","handleSlideChange","event","newValue","newValues","onChangeCommitted","handleUpdateDates","sliderStartingMonth","Array","isArray","setPhenologySliderValues","marks","handleMonthForward","ArrowForwardIcon","ModalContent","PhenologyInfoButtonModal","openModal","InfoOutlinedIcon","Modal","showModal","closeModal","title","mainModalPaddingHide","content","PhenologySearch","phenologyDisplayFloweringResults","$phenologyDisplayFloweringResults","async","QueryTask","Query","SpatialReference","loadModules","queryTask","url","PLANT_DATA_LAYER_URL","query","returnGeometry","outSpatialReference","WebMercator","outFields","where","queryResult","execute","getPhenologyFloweringData","features","err","console","log","getPlantsPhenologyData","then","response","setPhenologyFlowering","handleSearchPlants","initialDateRange","getInitialDateRange","disabled","disableSearchButton","isSameStartDay","Boolean","isSameEndDay","handleTodaySearch","SearchPlants","_allResults$resultKey","_allResults$resultKey2","search","useLocation","history","useHistory","URLSearchParams","paramSearchField","get","URL__SEARCH_TYPE","paramSearchValue","URL__SEARCH_VALUE","paramSearchFieldAdvanced","URL__SEARCH_TYPE_ADVANCED","cardMinimized","appReducer","mapLoaded","selectedAccession","$selectedAccession","searchTerms","$searchTerms","searchType","$searchType","searchTypeAdvanced","$searchTypeAdvanced","allResults","setAllResults","searchValue","setSearchValue","setSearchField","setSearchFieldAdvanced","SEARCH_OPTIONS_ADVANCED","esriField","selectedLetter","setSelectedLetter","SEARCH_PLANT_ALPHABET_SECTIONS","includes","isLoading","setIsLoading","searchTermsKey","getResultKey","searchTerm","searchTypeOptionTerm","handleSearch","setSearchTerms","letter","resultKey","queryScientificCommonByLetter","result","handleSearchResults","setURLPath","handleSelectedLetter","arguments","advSearchField","LOCATIONS_SEARCH_LABEL","setDefinitionExpression","generatePlantQueryWhereClause","setSearchDefinitionExpression","replace","queryResults","queryLocations","queryPlants","searchResults","resetTourWidget","setTourStep","setTourStopIndex","setStopsByAccession","setTourStops","setTourDefinitionExpressionByAccession","resetTourStopsGraphicsLayer","clearResults","resetMapGraphics","push","resetSelectedSearchOption","attributes","ACC_NUM_AND_QUAL","setSelectedAccession","selectedAccessionDefault","isMobileAndAdvanced","isMobileDevice","IconChevronUp","rotate","SearchPlantsAdvancedFilters","SEARCH_PLANT_DISABLE_LOCATION_PLACEHOLDER","SEARCH_PLANT_ALPHABET_SECTIONS_DISABLE_SEARCH_PLACEHOLDER","evt","target","onKeyUp","_handleSearchPlantInputKeyDown","placeholder","IconSearch","SearchPlantRecordsFilter","SEARCH_OPTIONS","setSearchType","setGardenCodeSelected","handleSearchType","SEARCH_OPTIONS_FIELD_PHENOLOGY","src","handleAdvancedSearchField","setSearchTypeAdvanced","SearchPlantsAlphabet","SearchPlantsAdvancedResults","ExternalLink","href","fontSize","color","rel","SearchPlantsCardHeader","section","link","backToSearch","scientificName","goBack","$cardMinimized","gardenCodeSelected","$gardenCodeSelected","searchWidgetLocation","_isEmpty","fill","ScientificNameFormatted","plantName","textDecoration","BASE_URL","DEFAULT_SEARCH_TYPE","IconReset","decodePathValue","SearchPlantsPreviewResults","list","taxonomy","bins","forEach","firstLetter","charAt","toUpperCase","hasOwnProperty","alphabet","resultsByLetter","i","Math","ceil","slice","currentLetter","previousLetter","padding","_ref3","AUTOSIZER__ROW_HEIGHT","FamilyPreview","family","useParams","error","setError","genera","setGenera","loading","setLoading","fetchAndSetData","queryGeneraByFamily","generateDefinitionExpression","expression","familyName","splitByCharacter","ResultsError","flexDirection","PlantPreviewDetailsHeader","livingPlant","plant","FAMILY","HABIT_FULL","NAME","RANGE","NAME_NUM","PlantPreview","locationState","fieldType","plantValue","setPlant","selectedPlanInitialState","setLivingPlant","formattedValue","splitByComma","queryPlantByCommonName","queryPlantBySpeciesName","plantData","COMMON_NAME_PRIMARY","CATALOG_DESC","setSelectedPlant","field","dangerouslySetInnerHTML","__html","getClean__CATALOG_DESC","encodePathValue","GenusPreview","genus","species","setSpecies","querySpeciesByGenera","sort","genusName","LocationPreview","gardenLocationFromUrlPathParams","setLocation","gardenLocationFromUrlPath","setGardenLocationFromUrlPath","plantsAttributes","setPlantsAttributes","gardenLocation","LOCATIONS_GARDEN_LOCATION","queryLocationByGardenName","goToLocations","LOCATIONS_GARDEN_WEBSITE","feature","CommonNamePreferredResults","commonNamePreferred","plantNames","setPlantNames","handledCommonNamePreferred","queryPlantsByCommonNamePreferred","plantsAttributesSortedUniq","catch","Card","Switch","Route","exact","path","component","MAP_LINK__GENUS","MAP_LINK__COMMON_NAME","MAP_LINK__SPECIES","MAP_LINK__LOCATION","StyledMapContainer","styled","div","_templateObject","_taggedTemplateLiteral","visible","StyleMap","_templateObject2","atMapLocation","indexOf","Map","tourID","Number","filterSelectedOptions","$filterSelectedOptions","mapIsVisible","mapVisible","setMapVisible","mapRef","useRef","initializeMap","getGardenLocation","locationsAttributes","locations","filterSelectedOptionsUpdated","getUpdateFilterOptions","setGardenLocations","setFilterSelectedOptions","Promise","resolve","reject","process","fetch","res","json","data","processedGardenData","keyword","displayAttributes","split","trim","find","toLowerCase","assetBankGardenImages","gardenLocationsWithImages","_gardenImages","_gardenImages2","gardenImages","assetBankGardenImage","previewUrl","thumbnailUrl","getGardenLocationsWithImages","PlantsResultsContextProvider"],"mappings":"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","file":"static/js/4.d223c9ef.chunk.js","sourcesContent":["import React from 'react';\nimport { Link } from 'react-router-dom';\n\nimport WidgetImage from '../../WidgetImage/WidgetImage';\nimport { getPath } from '../../../../utils/path.util';\nimport mapController from '../../../../controllers/MapController';\n\nimport './LocationResult.scss';\n\nexport default function LocationResult(props: any) {\n const { index, location, width, garden } = props;\n const { GardenLocation, GardenCode } = garden;\n\n return (\n
\n
\n {garden && }\n
\n\n {\n mapController.updateMapSelectedGardenLocations(GardenCode);\n }}\n >\n {GardenLocation}\n \n
\n );\n}\n","//@ts-nocheck\nimport React, { useEffect, useState } from 'react';\nimport AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer';\nimport List from 'react-virtualized/dist/commonjs/List';\nimport _chunk from 'lodash/chunk';\n\n// Store\nimport { useDispatch, useSelector } from 'react-redux';\nimport { $gardenLocations, setMinimized } from '../../../../store/app/appSlice';\n\nimport LocationResult from './LocationResult';\nimport { PlantSearchFindPlantInGarden } from '../PlantSearchFindPlantInGarden/PlantSearchFindPlantInGarden';\n\nimport { getNumberOfResultColumns } from '../../../../utils/results.util';\n\nimport {\n AUTOSIZER_GARDEN_LOCATION__ROW_HEIGHT,\n LOCATIONS_ESRI_FIELD,\n LOCATIONS_GROUP_FIELD,\n} from '../../../../config/plant.config';\n\nimport './LocationSearchResults.scss';\n\nconst LocationSearchResults = () => {\n const dispatch = useDispatch();\n const gardenLocations = useSelector($gardenLocations);\n\n const [numberOfColumns, setNumberOfColumns] = useState(1);\n const [rows, setRows] = useState([]);\n\n useEffect(() => {\n dispatch(setMinimized(false));\n setRows(_chunk(gardenLocations, numberOfColumns));\n }, [gardenLocations, numberOfColumns]);\n\n const rowRenderer = ({ index, isScrolling, key, style }) => {\n const width = parseInt(100 / numberOfColumns);\n\n return (\n \n {rows[index].map((location, index) => {\n return (\n \n );\n })}\n \n );\n };\n\n const updateColumns = (width) => {\n const columns = getNumberOfResultColumns(width);\n if (numberOfColumns !== columns) setNumberOfColumns(columns);\n };\n\n return (\n
\n \n {({ height, width }) => {\n updateColumns(width);\n return (\n \n );\n }}\n \n
\n );\n};\n\nexport default LocationSearchResults;\n","import React from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n\nimport { RootState } from '../../store/store';\nimport { setModalContent } from '../../store/app/modalSlice';\n\nimport './FilterPlantsByCharacteristicsButton.scss';\n\nexport default function FilterPlantsByCharacteristicsButton() {\n const dispatch = useDispatch();\n\n const filterDefinitionExpression = useSelector((state: RootState) => state.filterReducer.filterDefinitionExpression);\n\n return (\n <>\n dispatch(setModalContent('Filter'))}\n data-map-filtered={filterDefinitionExpression.length > 0}\n />\n dispatch(setModalContent('Filter'))}\n data-map-filtered={filterDefinitionExpression.length > 0}\n />\n \n );\n}\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport _uniqBy from 'lodash/uniqBy';\nimport _sortBy from 'lodash/sortBy';\nimport {\n $phenologyFlowering,\n $phenologyFloweringDayEnd,\n $phenologyFloweringDayStart,\n $phenologyFloweringResults,\n FloweringRecord,\n setPhenologyDisplayFloweringResults,\n setPhenologyFloweringResults,\n} from '../../../../store/app/phenologySlice';\nimport IconFilter from '../../../icons/IconFilter';\nimport PlantSearchResults from '../../searchResults/PlantSearchResults';\nimport Loader from '../../../Loader';\nimport './PhenologySearchResults.scss';\n\nconst PhenologySearchResults = () => {\n const dispatch = useDispatch();\n const phenologyFloweringResults = useSelector($phenologyFloweringResults);\n const phenologyFloweringDayStart = useSelector($phenologyFloweringDayStart);\n const phenologyFloweringDayEnd = useSelector($phenologyFloweringDayEnd);\n const phenologyFlowering = useSelector($phenologyFlowering);\n\n useEffect(() => {\n if (phenologyFlowering && phenologyFloweringDayStart && phenologyFloweringDayEnd) {\n const { dayOfYear: dayOfYearStart } = phenologyFloweringDayStart;\n const { dayOfYear: dayOfYearEnd } = phenologyFloweringDayEnd;\n\n const phenologyDataFloweringFiltered = phenologyFlowering?.filter((item: FloweringRecord) => {\n if (dayOfYearStart <= dayOfYearEnd) {\n return item.dayOfYear >= dayOfYearStart && item.dayOfYear <= dayOfYearEnd;\n } else {\n // Handle date selection with start day > end day of the year. Eg.: Start: Nov20 | End: Jan03\n return item.dayOfYear >= dayOfYearStart || item.dayOfYear <= dayOfYearEnd;\n }\n });\n const phenologyDataFilteredNames = _uniqBy(\n phenologyDataFloweringFiltered,\n (phenologyResult: FloweringRecord) => phenologyResult.name\n );\n\n const sortedPhenologyResults = _sortBy(phenologyDataFilteredNames, (phenologyResult) => phenologyResult.name);\n\n dispatch(setPhenologyFloweringResults(sortedPhenologyResults));\n }\n }, [phenologyFloweringDayStart, phenologyFloweringDayEnd]);\n\n const handleFilterButtonClick = () => {\n dispatch(setPhenologyDisplayFloweringResults(false));\n };\n\n const formatDayOfTheYear = (dayOfTheYear: number) => {\n return new Date(2022, 0, dayOfTheYear).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n };\n\n return (\n
\n {phenologyFloweringResults ? (\n <>\n
\n

\n {'Selected Bloom Range'}\n {`${formatDayOfTheYear(phenologyFloweringDayStart!.dayOfYear)} - ${formatDayOfTheYear(\n phenologyFloweringDayEnd!.dayOfYear\n )}`}\n

\n \n
\n\n \n \n ) : (\n \n )}\n
\n );\n};\n\nexport default PhenologySearchResults;\n","import React, { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport dayjs from 'dayjs';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport { PickersDay } from '@mui/x-date-pickers/PickersDay';\nimport { MobileDatePicker } from '@mui/x-date-pickers/MobileDatePicker';\nimport { Button } from '@mui/material';\nimport EventIcon from '@material-ui/icons/Event';\nimport { $phenologyFloweringDayEnd, $phenologyFloweringDayStart } from '../../../../store/app/phenologySlice';\nimport './PhenologyDatePicker.scss';\n\ninterface IProps {\n date: Date;\n onChange: (value: Date | null) => void;\n minDate?: Date;\n maxDate?: Date;\n label?: string;\n type?: 'start-date' | 'end-date';\n buttonRef?: any;\n}\n\nconst PhenologyDatePicker = ({ date, onChange, minDate, maxDate, label, type, buttonRef }: IProps) => {\n const [open, setOpen] = useState(false);\n const handleOpen = () => setOpen(true);\n const handleClose = () => setOpen(false);\n const [currentHoverDate, setCurrentHoverDate] = useState();\n\n const phenologyFloweringDayStart = useSelector($phenologyFloweringDayStart);\n const phenologyFloweringDayEnd = useSelector($phenologyFloweringDayEnd);\n\n const formatDayOfTheYear = (date: Date) => {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: '2-digit',\n });\n };\n\n const handleChange = (date: Date | null) => {\n onChange(date);\n };\n\n return (\n \n {phenologyFloweringDayStart && phenologyFloweringDayEnd && (\n {\n return (\n }\n >\n \n \n );\n }}\n renderDay={(day, _value, DayComponentProps) => {\n const isSelected = dayjs(day).isSame(dayjs(_value[0]));\n\n const highlight =\n (minDate &&\n maxDate &&\n type === 'end-date' &&\n (currentHoverDate\n ? dayjs(day) >= dayjs(phenologyFloweringDayStart?.date) && dayjs(day) <= dayjs(currentHoverDate)\n : !currentHoverDate &&\n dayjs(day) >= dayjs(phenologyFloweringDayStart?.date) &&\n dayjs(day) < dayjs(phenologyFloweringDayEnd?.date))) ||\n (minDate &&\n maxDate &&\n type === 'start-date' &&\n (currentHoverDate\n ? dayjs(day) <= dayjs(phenologyFloweringDayEnd?.date) && dayjs(day) >= dayjs(currentHoverDate)\n : !currentHoverDate &&\n dayjs(day) <= dayjs(phenologyFloweringDayEnd?.date) &&\n dayjs(day) > dayjs(phenologyFloweringDayStart?.date)));\n\n return (\n setCurrentHoverDate(day)}\n onMouseLeave={() => {\n if (dayjs(currentHoverDate).isSame(day)) {\n setCurrentHoverDate(undefined);\n }\n }}\n />\n );\n }}\n />\n )}\n \n );\n};\n\nexport default PhenologyDatePicker;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { IconButton, Slider } from '@mui/material';\nimport { getDayOfYear } from 'date-fns';\nimport dayjs from 'dayjs';\nimport ArrowForwardIcon from '@material-ui/icons/ArrowForward';\nimport ArrowBackIcon from '@material-ui/icons/ArrowBack';\n\nimport {\n $phenologyFloweringDayEnd,\n $phenologyFloweringDayStart,\n $phenologySliderStartingDate,\n $phenologySliderValues,\n setPhenologyFloweringDateEnd,\n setPhenologyFloweringDateStart,\n setPhenologySliderStartingDate,\n setPhenologySliderValues,\n} from '../../../../store/app/phenologySlice';\nimport PhenologyDatePicker from '../PhenologyDatePicker/PhenologyDatePicker';\nimport {\n getSliderValueFromDate,\n getUpdatedSliderMarks,\n PHENOLOGY_SEARCH_YEAR,\n setInitialDateRange,\n} from '../../../../utils/phenologySearch';\nimport './PhenologySearchDateRangeSelection.scss';\n\nconst PhenologySearchDateRangeSelection = () => {\n const dispatch = useDispatch();\n const phenologySliderStartingDate = useSelector($phenologySliderStartingDate);\n const phenologySliderValues = useSelector($phenologySliderValues);\n const phenologyFloweringDayStart = useSelector($phenologyFloweringDayStart);\n const phenologyFloweringDayEnd = useSelector($phenologyFloweringDayEnd);\n const sliderNumberOfDays = dayjs(new Date(phenologySliderStartingDate))\n .add(1, 'year')\n .diff(new Date(phenologySliderStartingDate), 'day');\n\n const [sliderMarks, setSliderMarks] = useState<\n {\n value: number;\n label: string;\n }[]\n >(() => getUpdatedSliderMarks(new Date(phenologySliderStartingDate)));\n\n const [values, setValues] = useState<{ start: number; end: number } | undefined>(() => {\n if (phenologySliderValues) {\n return phenologySliderValues;\n }\n });\n\n // Update slider local values state when phenologySliderValues changes. Eg: On initial load and on \"What's Blooming Today\" button click\n useEffect(() => {\n if (phenologySliderValues) {\n if (phenologySliderValues.start <= phenologySliderValues.end) {\n setValues(phenologySliderValues);\n }\n }\n }, [phenologySliderValues]);\n\n useEffect(() => {\n if (!phenologyFloweringDayStart && !phenologyFloweringDayEnd) {\n setInitialDateRange();\n }\n }, [phenologyFloweringDayStart, phenologyFloweringDayEnd]);\n\n const handleSlideChange = (event: Event, newValue: number | number[]) => {\n const newValues = newValue as [number, number];\n\n setValues({\n start: newValues[0],\n end: newValues[1],\n });\n };\n\n const handleUpdateDates = (values: number | number[], sliderStartingMonth?: number) => {\n if (values && Array.isArray(values)) {\n dispatch(\n setPhenologySliderValues({\n start: values[0],\n end: values[1],\n })\n );\n\n const startDate = dayjs(phenologySliderStartingDate)\n .add(values[0] - 1, 'day')\n .toDate();\n const endDate = dayjs(phenologySliderStartingDate)\n .add(values[1] - 1, 'day')\n .toDate();\n\n dispatch(setPhenologyFloweringDateStart({ dayOfYear: getDayOfYear(startDate), date: startDate.toString() }));\n dispatch(setPhenologyFloweringDateEnd({ dayOfYear: getDayOfYear(endDate), date: endDate.toString() }));\n }\n };\n\n const handleMonthBack = () => {\n const currentStartingMonth = new Date(phenologySliderStartingDate).getMonth();\n const newSliderStartingMonth = currentStartingMonth ? currentStartingMonth - 1 : 11;\n\n const newSliderStartingDate = new Date(PHENOLOGY_SEARCH_YEAR, newSliderStartingMonth, 1);\n dispatch(setPhenologySliderStartingDate(newSliderStartingDate.toString()));\n\n // update dates in store based on new Slider starting date\n const startDate = dayjs(newSliderStartingDate)\n .add(values!.start - 1, 'day')\n .toDate();\n const endDate = dayjs(newSliderStartingDate)\n .add(values!.end - 1, 'day')\n .toDate();\n\n dispatch(setPhenologyFloweringDateStart({ dayOfYear: getDayOfYear(startDate), date: startDate.toString() }));\n dispatch(setPhenologyFloweringDateEnd({ dayOfYear: getDayOfYear(endDate), date: endDate.toString() }));\n\n setSliderMarks(getUpdatedSliderMarks(newSliderStartingDate));\n };\n\n const handleMonthForward = () => {\n const currentStartingMonth = new Date(phenologySliderStartingDate).getMonth();\n const newSliderStartingMonth = currentStartingMonth < 11 ? currentStartingMonth + 1 : 0;\n\n const newSliderStartingDate = new Date(PHENOLOGY_SEARCH_YEAR, newSliderStartingMonth, 1);\n dispatch(setPhenologySliderStartingDate(newSliderStartingDate.toString()));\n\n // update dates in store based on new Slider starting date\n const startDate = dayjs(newSliderStartingDate)\n .add(values!.start - 1, 'day')\n .toDate();\n const endDate = dayjs(newSliderStartingDate)\n .add(values!.end - 1, 'day')\n .toDate();\n\n dispatch(setPhenologyFloweringDateStart({ dayOfYear: getDayOfYear(startDate), date: startDate.toString() }));\n dispatch(setPhenologyFloweringDateEnd({ dayOfYear: getDayOfYear(endDate), date: endDate.toString() }));\n\n setSliderMarks(getUpdatedSliderMarks(newSliderStartingDate));\n };\n\n const handleStartDatePickerChange = (date: Date | null) => {\n if (date) {\n let selectedDate = new Date(date);\n let endDate = new Date(phenologyFloweringDayEnd!.date);\n let targetYear;\n\n // make sure new starting date stays within slider range\n if (selectedDate.getMonth() < endDate.getMonth()) {\n targetYear = endDate.getFullYear();\n } else if (selectedDate.getMonth() > endDate.getMonth() || selectedDate.getDate() > endDate.getDate()) {\n targetYear = endDate.getFullYear() - 1;\n } else {\n targetYear = endDate.getFullYear();\n }\n\n // update slider starting date\n selectedDate = new Date(targetYear, selectedDate.getMonth(), selectedDate.getDate());\n const newPhenologySliderStartingDate = selectedDate;\n dispatch(setPhenologySliderStartingDate(newPhenologySliderStartingDate.toString()));\n\n // update slider values based on new slider starting date\n const updatedValues = {\n start: getSliderValueFromDate(selectedDate, newPhenologySliderStartingDate),\n end: getSliderValueFromDate(endDate, newPhenologySliderStartingDate),\n };\n setValues(updatedValues);\n\n // update start date in store\n dispatch(\n setPhenologyFloweringDateStart({\n dayOfYear: getDayOfYear(newPhenologySliderStartingDate),\n date: newPhenologySliderStartingDate.toString(),\n })\n );\n\n setSliderMarks(getUpdatedSliderMarks(newPhenologySliderStartingDate));\n }\n };\n\n const handleEndDatePickerChange = (date: Date | null) => {\n if (date) {\n // update slider values based on new slider starting date\n const endDate = new Date(date);\n const startingDate = new Date(phenologyFloweringDayStart!.date);\n let updatedPhenologyStartingDate = new Date(phenologySliderStartingDate);\n\n let sliderValue = getSliderValueFromDate(endDate, updatedPhenologyStartingDate);\n\n if (sliderValue > sliderNumberOfDays) {\n // move slider range / update slider starting date\n updatedPhenologyStartingDate = startingDate;\n dispatch(setPhenologySliderStartingDate(updatedPhenologyStartingDate.toString()));\n }\n\n const updatedValues = {\n start: getSliderValueFromDate(startingDate, updatedPhenologyStartingDate),\n end: getSliderValueFromDate(endDate, updatedPhenologyStartingDate),\n };\n\n setValues(updatedValues);\n\n // update end date in store\n dispatch(setPhenologyFloweringDateEnd({ dayOfYear: getDayOfYear(endDate), date: endDate.toString() }));\n\n setSliderMarks(getUpdatedSliderMarks(updatedPhenologyStartingDate));\n }\n };\n\n return (\n
\n {values && (\n <>\n
\n \n -\n \n
\n\n
\n \n \n \n handleUpdateDates(values)}\n value={[values.start, values.end]}\n marks={sliderMarks}\n />\n \n \n \n
\n \n )}\n
\n );\n};\n\nexport default PhenologySearchDateRangeSelection;\n","import React, { useState } from 'react';\nimport { IconButton } from '@mui/material';\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';\nimport Modal from '../../../modal/Modal';\nimport './PhenologyInfoButtonModal.scss';\n\nconst ModalContent = () => (\n
\n

\n What's blooming today uses historical data to return a list of species that have flowered or fruited in the range\n of one week before to one week after today's date.\n

\n
\n);\n\nconst PhenologyInfoButtonModal = () => {\n const [open, setOpen] = useState(false);\n const closeModal = () => setOpen(false);\n const openModal = () => setOpen(true);\n\n return (\n
\n \n \n \n\n }\n />\n
\n );\n};\n\nexport default PhenologyInfoButtonModal;\n","import React, { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport _uniqBy from 'lodash/uniqBy';\nimport _sortBy from 'lodash/sortBy';\nimport dayjs from 'dayjs';\n\n// Store\nimport {\n $phenologyDisplayFloweringResults,\n $phenologyFlowering,\n $phenologyFloweringDayEnd,\n $phenologyFloweringDayStart,\n setPhenologyDisplayFloweringResults,\n setPhenologyFlowering,\n} from '../../../store/app/phenologySlice';\n\n// Components\nimport PhenologySearchResults from './PhenologySearchResults/PhenologySearchResults';\nimport PhenologySearchDateRangeSelection from './PhenologySearchDateRangeSelection/PhenologySearchDateRangeSelection';\nimport PhenologyInfoButtonModal from './PhenologyInfoButtonModal/PhenologyInfoButtonModal';\n\n// Services\nimport { getPlantsPhenologyData } from '../../../services/getPlantsPhenologyData';\n\n// Utils\nimport { getInitialDateRange, setInitialDateRange } from '../../../utils/phenologySearch';\n\n// Style\nimport './PhenologySearch.scss';\n\nexport const PhenologySearch = () => {\n const dispatch = useDispatch();\n const phenologyFlowering = useSelector($phenologyFlowering);\n const phenologyFloweringDayStart = useSelector($phenologyFloweringDayStart);\n const phenologyFloweringDayEnd = useSelector($phenologyFloweringDayEnd);\n const phenologyDisplayFloweringResults = useSelector($phenologyDisplayFloweringResults);\n\n useEffect(() => {\n if (!phenologyFlowering) {\n getPlantsPhenologyData().then((response) => {\n dispatch(setPhenologyFlowering(response));\n });\n }\n }, [dispatch, phenologyFlowering]);\n\n const handleSearchPlants = () => {\n if (phenologyFlowering && phenologyFloweringDayStart && phenologyFloweringDayEnd) {\n dispatch(setPhenologyDisplayFloweringResults(true));\n }\n };\n\n const handleTodaySearch = () => {\n setInitialDateRange();\n handleSearchPlants();\n };\n\n const initialDateRange = getInitialDateRange();\n\n const disableSearchButton = () => {\n const { startDate, endDate } = initialDateRange;\n\n const isSameStartDay = Boolean(\n phenologyFloweringDayStart?.date && dayjs(phenologyFloweringDayStart.date).isSame(startDate)\n );\n\n const isSameEndDay = Boolean(\n phenologyFloweringDayEnd?.date && dayjs(phenologyFloweringDayEnd.date).isSame(endDate)\n );\n\n return isSameStartDay && isSameEndDay;\n };\n\n return (\n
\n {phenologyDisplayFloweringResults ? (\n \n ) : (\n
\n
\n

What's in Bloom?

\n

\n Adjust the date range below to discover plants that have flowered or fruited at New York Botanical Garden\n based on historical data.\n

\n
\n\n
\n \n
\n \n Search Plants\n \n\n \n What's Blooming Today\n \n\n \n
\n
\n
\n )}\n
\n );\n};\n","/*\n\nhttps://nybg-gispt.nybg.org/server/rest/services/PlantTracker/Plant_Center_Production_PublicView/MapServer/0/query?where=1%3D1&text=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=NAME%2CCHECK_DT%2CREPRODUCTIVE_STATUS&returnGeometry=false&returnTrueCurves=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&returnIdsOnly=false&returnCountOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&gdbVersion=&historicMoment=&returnDistinctValues=false&resultOffset=&resultRecordCount=100&returnExtentOnly=false&datumTransformation=¶meterValues=&rangeValues=&quantizationParameters=&featureEncoding=esriDefault&f=html\n\n*/\n\nimport { loadModules } from 'esri-loader';\n\nimport { PLANT_DATA_LAYER_URL } from '../config/config';\nimport { getPhenologyFloweringData } from '../components/plants/SpecificPlant/PhenologyChart.util';\n\nexport const getPlantsPhenologyData = async () => {\n const [QueryTask, Query, SpatialReference] = await loadModules([\n 'esri/tasks/QueryTask',\n 'esri/tasks/support/Query',\n 'esri/geometry/SpatialReference',\n ]);\n\n var queryTask = new QueryTask({\n url: `${PLANT_DATA_LAYER_URL}/0`,\n });\n\n const query = new Query();\n query.returnGeometry = true;\n query.outSpatialReference = SpatialReference.WebMercator;\n query.outFields = ['NAME', 'COMMON_NAME_PRIMARY', 'CHECK_DT', 'REPRODUCTIVE_STATUS', 'ALIVE'];\n query.where = \"REPRODUCTIVE_STATUS LIKE '%F%'\";\n\n try {\n const queryResult = await queryTask.execute(query);\n const phenologyFloweringData = getPhenologyFloweringData(queryResult.features);\n return phenologyFloweringData;\n } catch (err) {\n console.log(err);\n debugger;\n }\n};\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useHistory, useLocation } from 'react-router-dom';\n\n// import InfiniteScroll from './InfiniteScroll';\n// import SearchResults from './searchResults/SearchResults';\nimport Loader from '../Loader';\nimport LocationSearchResults from './searchResults/LocationSearchResults/LocationSearchResults';\nimport PlantSearchResults from './searchResults/PlantSearchResults';\nimport FilterPlantsByCharacteristicsButton from '../filter/FilterPlantsByCharacteristicsButton';\nimport SearchPlantRecordsFilter from './SearchPlantRecordsFilter/SearchPlantRecordsFilter';\nimport IconSearch from '../icons/IconSearch';\nimport IconChevronUp from '../icons/IconChevronUp';\nimport SearchPlantsAlphabet from './SearchPlantsAlphabet/SearchPlantsAlphabet';\nimport SearchPlantsAdvancedFilters from '../modal/SearchPlantsAdvancedFilters/SearchPlantsAdvancedFilters';\nimport SearchPlantsAdvancedResults from './SearchPlantsAdvancedResults/SearchPlantsAdvancedResults';\nimport bloomIcon from '../../images/bloom-icon.png';\nimport mapController from '../../controllers/MapController';\nimport {\n generatePlantQueryWhereClause,\n handleSearchResults,\n queryLocations,\n queryPlants,\n setURLPath,\n} from '../../utils/query.utils';\nimport { getResultKey } from '../../utils/plant.util';\n\nimport { RootState } from '../../store/store';\nimport {\n $searchTerms,\n $searchType,\n $searchTypeAdvanced,\n $selectedAccession,\n selectedAccessionDefault,\n setGardenCodeSelected,\n setMinimized,\n setSearchTerms,\n setSearchType,\n setSearchTypeAdvanced,\n setSelectedAccession,\n} from '../../store/app/appSlice';\nimport { setSearchDefinitionExpression, setTourDefinitionExpressionByAccession } from '../../store/app/filterSlice';\nimport { setStopsByAccession, setTourStep, setTourStopIndex, setTourStops } from '../../store/app/tourSlice';\n\nimport {\n LOCATIONS_SEARCH_LABEL,\n SEARCH_OPTIONS,\n SEARCH_OPTIONS_ADVANCED,\n SEARCH_OPTIONS_FIELD_PHENOLOGY,\n SEARCH_PLANT_ALPHABET_SECTIONS,\n SEARCH_PLANT_ALPHABET_SECTIONS_DISABLE_SEARCH_PLACEHOLDER,\n SEARCH_PLANT_DISABLE_LOCATION_PLACEHOLDER,\n URL__SEARCH_TYPE,\n URL__SEARCH_TYPE_ADVANCED,\n URL__SEARCH_VALUE,\n} from '../../config/plant.config';\nimport { isMobileDevice } from '../../config/config';\n\nimport '../../styles/css/plants.scss';\nimport { PhenologySearch } from './PhenologySearch/PhenologySearch';\nimport IconFlower from '../icons/IconFlower';\n\ntype searchTypes = 'Location' | 'Plants' | 'Advanced';\ntype advancedSearchTypes = 'FAMILY_AND_FAMILY_COMMON' | 'GENUS_AND_GENUS_COMMON' | 'NAME' | 'COMMON_NAME_PRIMARY';\n\nconst SEARCH_INPUT_MIN_CHARACTERS: number = 1;\n\nfunction SearchPlants() {\n const { search } = useLocation();\n const history = useHistory();\n const dispatch = useDispatch();\n\n const query = new URLSearchParams(search);\n const paramSearchField: string = query.get(URL__SEARCH_TYPE) || '';\n const paramSearchValue: string = query.get(URL__SEARCH_VALUE) || '';\n const paramSearchFieldAdvanced: string = query.get(URL__SEARCH_TYPE_ADVANCED) || '';\n\n const cardMinimized = useSelector((state: RootState) => state.appReducer.cardMinimized);\n const mapLoaded = useSelector((state: RootState) => state.appReducer.mapLoaded);\n const filterDefinitionExpression = useSelector((state: RootState) => state.filterReducer.filterDefinitionExpression);\n const selectedAccession = useSelector($selectedAccession);\n const searchTerms = useSelector($searchTerms);\n const searchType = useSelector($searchType);\n const searchTypeAdvanced = useSelector($searchTypeAdvanced);\n\n const [allResults, setAllResults] = useState({});\n const [searchValue, setSearchValue] = useState(paramSearchValue || '');\n const [searchField, setSearchField] = useState(paramSearchField || searchType);\n const [searchFieldAdvanced, setSearchFieldAdvanced] = useState(\n paramSearchFieldAdvanced || SEARCH_OPTIONS_ADVANCED[0].esriField\n );\n const [selectedLetter, setSelectedLetter] = useState(\n paramSearchValue.length > 0 &&\n paramSearchFieldAdvanced.length > 0 &&\n SEARCH_PLANT_ALPHABET_SECTIONS.includes(paramSearchFieldAdvanced)\n ? paramSearchValue\n : 'A'\n );\n const [isLoading, setIsLoading] = useState(false);\n\n const searchTermsKey = getResultKey(searchType, searchTypeAdvanced);\n const searchTerm = searchTerms[searchTermsKey];\n const searchTypeOptionTerm = `${searchTermsKey}_${searchTerm}`;\n\n const setDefinitionExpression = (searchValue: string, searchField: string, searchFieldAdvanced: string) => {\n const where = generatePlantQueryWhereClause(searchValue, searchField, searchFieldAdvanced);\n dispatch(setSearchDefinitionExpression(where[0]));\n };\n\n useEffect(() => {\n if (\n mapLoaded &&\n searchValue.length >= SEARCH_INPUT_MIN_CHARACTERS &&\n !SEARCH_PLANT_ALPHABET_SECTIONS.includes(searchFieldAdvanced)\n ) {\n handleSearch();\n }\n dispatch(setSearchTerms({ ...searchTerms, [getResultKey(searchField, searchFieldAdvanced)]: searchValue }));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mapLoaded]);\n\n useEffect(() => {\n if (SEARCH_PLANT_ALPHABET_SECTIONS.includes(searchFieldAdvanced)) {\n handleSelectedLetter(searchField, searchFieldAdvanced, searchTerm);\n }\n }, [searchTypeOptionTerm]);\n\n const handleSearch = async (searchType = searchField, advSearchField = searchFieldAdvanced) => {\n if (!mapLoaded) {\n return;\n }\n\n const resultKey = getResultKey(searchType, advSearchField);\n dispatch(setSearchTerms({ ...searchTerms, [resultKey]: searchValue }));\n\n setIsLoading(true);\n if (searchType !== LOCATIONS_SEARCH_LABEL) {\n setDefinitionExpression(searchValue.replace(/'/g, ''), searchType, searchFieldAdvanced);\n }\n\n setURLPath(searchType, searchFieldAdvanced, searchValue);\n\n if (cardMinimized) {\n dispatch(setMinimized(false));\n }\n\n try {\n const { queryResults, query } =\n searchType === LOCATIONS_SEARCH_LABEL\n ? await queryLocations()\n : await queryPlants(searchValue, searchType, searchFieldAdvanced);\n\n const searchResults = handleSearchResults(searchValue, query, queryResults, filterDefinitionExpression);\n setAllResults({\n ...allResults,\n [resultKey]: searchResults,\n });\n\n if (queryResults.features.length) {\n dispatch(setMinimized(false));\n }\n } catch (err) {\n setAllResults({\n ...allResults,\n [resultKey]: [],\n });\n }\n\n setIsLoading(false);\n };\n\n const _handleSearchPlantInputKeyDown = (evt: React.KeyboardEvent) => {\n if (evt.key === 'Enter') {\n if (searchValue.length >= SEARCH_INPUT_MIN_CHARACTERS) {\n handleSearch();\n resetTourWidget();\n } else {\n clearResults();\n }\n }\n };\n\n const resetTourWidget = () => {\n dispatch(setTourStep('ViewTours'));\n dispatch(setTourStopIndex(0));\n dispatch(setStopsByAccession([]));\n dispatch(setTourStops([]));\n dispatch(setTourDefinitionExpressionByAccession([]));\n mapController.resetTourStopsGraphicsLayer();\n };\n\n /**\n * Reset search input value and results\n */\n function clearResults() {\n setSearchValue('');\n setAllResults({});\n mapController.resetMapGraphics();\n dispatch(setSearchDefinitionExpression(''));\n dispatch(setSearchTerms({ ...searchTerms, [searchField]: '' }));\n history.push('/map');\n }\n\n function resetSelectedSearchOption(esriField: string, resultKey: string) {\n if (!SEARCH_PLANT_ALPHABET_SECTIONS.includes(esriField)) {\n setAllResults({\n ...allResults,\n [resultKey]: {},\n });\n }\n\n setSearchValue('');\n if (cardMinimized) {\n dispatch(setMinimized(false));\n }\n\n dispatch(setSearchDefinitionExpression(''));\n setURLPath(searchField, esriField, SEARCH_PLANT_ALPHABET_SECTIONS.includes(esriField) ? selectedLetter : '');\n\n if (selectedAccession.attributes.ACC_NUM_AND_QUAL) {\n dispatch(setSelectedAccession(selectedAccessionDefault));\n }\n }\n\n function handleSearchType(searchType: string, advSearchField: string) {\n if (searchType === LOCATIONS_SEARCH_LABEL) {\n handleSearch(LOCATIONS_SEARCH_LABEL, advSearchField);\n }\n const resultKey = getResultKey(searchType, advSearchField);\n resetSelectedSearchOption(advSearchField, resultKey);\n setSearchField(searchType as searchTypes);\n dispatch(setSearchType(searchType));\n dispatch(setGardenCodeSelected(''));\n setURLPath(searchType, searchFieldAdvanced, '');\n }\n\n function handleAdvancedSearchField(searchType: string, esriField: string) {\n const resultKey = getResultKey(searchType, esriField);\n resetSelectedSearchOption(esriField, resultKey);\n setSearchFieldAdvanced(esriField as advancedSearchTypes);\n }\n\n function handleSelectedLetter(searchField: string, searchFieldAdvanced: string, letter: string) {\n setIsLoading(true);\n\n const resultKey = getResultKey(searchField, searchFieldAdvanced);\n dispatch(setSearchTerms({ ...searchTerms, [resultKey]: letter }));\n if (cardMinimized) {\n dispatch(setMinimized(false));\n }\n\n mapController.queryScientificCommonByLetter(letter, searchFieldAdvanced).then((result) => {\n setAllResults({\n ...allResults,\n [resultKey]: handleSearchResults(letter, query, result, filterDefinitionExpression),\n });\n setIsLoading(false);\n setURLPath(searchField, searchFieldAdvanced, letter);\n });\n }\n\n const isAdvancedSearchField =\n searchField === LOCATIONS_SEARCH_LABEL ||\n (searchField === 'Advanced' && SEARCH_PLANT_ALPHABET_SECTIONS.includes(searchFieldAdvanced));\n\n const resultKey = getResultKey(searchField, searchFieldAdvanced);\n\n const isMobileAndAdvanced = isMobileDevice && searchType === 'Advanced';\n\n return (\n
\n
\n
\n
\n dispatch(setMinimized(!cardMinimized))}\n >\n \n \n\n {isMobileAndAdvanced ? (\n \n ) : (\n
\n {\n const searchTerm = evt.target.value;\n setSearchValue(searchTerm);\n }}\n onKeyUp={(evt) => _handleSearchPlantInputKeyDown(evt)}\n placeholder={\n isAdvancedSearchField\n ? searchField === LOCATIONS_SEARCH_LABEL\n ? SEARCH_PLANT_DISABLE_LOCATION_PLACEHOLDER\n : SEARCH_PLANT_ALPHABET_SECTIONS_DISABLE_SEARCH_PLACEHOLDER\n : 'Search Plants'\n }\n disabled={isAdvancedSearchField}\n />\n clearResults()}\n disabled={isAdvancedSearchField}\n />\n handleSearch()}\n disabled={isAdvancedSearchField}\n data-search-disabled={isAdvancedSearchField}\n >\n \n \n
\n )}\n\n
\n \n
\n
\n\n \n\n
\n {SEARCH_OPTIONS.map((searchType) => {\n return (\n
\n handleSearchType(searchType, searchFieldAdvanced)}\n >\n {searchType === SEARCH_OPTIONS_FIELD_PHENOLOGY && (\n \n )}\n\n {searchType}\n \n
\n );\n })}\n
\n
\n\n {searchField === 'Advanced' && !isMobileDevice && (\n
\n {SEARCH_OPTIONS_ADVANCED.map(({ label, esriField }) => {\n return (\n {\n handleAdvancedSearchField(searchField, esriField);\n dispatch(setSearchTypeAdvanced(esriField));\n }}\n >\n {label}\n \n );\n })}\n
\n )}\n\n {searchField === SEARCH_OPTIONS_FIELD_PHENOLOGY && }\n\n {searchType === 'Advanced' && SEARCH_PLANT_ALPHABET_SECTIONS.includes(searchTypeAdvanced) && (\n \n )}\n\n {isMobileAndAdvanced && searchField === 'Advanced' && }\n\n {!isMobileAndAdvanced && isLoading && }\n\n {!isMobileAndAdvanced && !isLoading && searchField === LOCATIONS_SEARCH_LABEL && }\n\n {!isMobileAndAdvanced &&\n !isLoading &&\n searchField !== LOCATIONS_SEARCH_LABEL &&\n searchField !== SEARCH_OPTIONS_FIELD_PHENOLOGY && (\n \n )}\n
\n
\n );\n}\n\nexport default SearchPlants;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAYAAAA7bUf6AAAABHNCSVQICAgIfAhkiAAAAk5JREFUOE+NlElME1EYx/+vLdNNWgRa1C6CDQUbt+CScjRKYkQ4cPXIwcS7kZNnl7OeDGdjInGJxgNojAm4RUwMUIQaBouRKbTQ0m060+fr0Om0DorvMJn5lt973//73hD8x6JffniQK11GXupDtngcLbYREvaPqqnkXwz6efkUkoW7SOTO1MW12ifI2cB5HURJyJauoFA8hmKpDQ2GaaznLoKA021k4+Kkv9tdhdDxxQ/Iit0oSI11wUsCkM4Dhz2Ayag/cOdeLznhWyk7CH0Z4ZEW/bqo2RiQygGBNsDl0EN8TcOqLoS+XbqPX6lhXVRsHYglAIcVCHl3gbznL2F585kuKpHG/AaPbwdk9Fo70SpIQHILkEpA8x7gtL+fhNtfKOWUH/TJTBqizDyVlS9i2iLgXkdUMVhFgmuvWuBLNmwHHGIlBlw8udDVrkHeRB9ByAwhw4Tk1xQtRsMbmOpgmlTWwEwjBn/uB9xMH4dt2+p1jpDeg7eqc0LHvq7i3YIbMlX8D06mMBHMVCE3VnrgE7XDKo4myxzpC4Y0yOvoOL7Hz7FWA2aTsttT6yLmyRq6BA6DpqOApVKOijYaRDJ0xKxB/tbqj0wXmYkZYvOillHbBb9zQIOoutQGlN+jq0A8BQT3sa7Uz6MS6raPaZAp/jpimzf/ZECSgVk2mEEmam05TA9YuElw5LEGKd/UhSQb0x2Wx3kHBhIBpS4QEq+9wdUWq2n0eURg98ilfHPGLdjNc2jmrpIe/6cd4RVj3a+ATvK3FbuFPNwtsRb6Gxy+0kaX1NakAAAAAElFTkSuQmCC\"","import React from 'react';\n\nimport './ExternalLink.scss';\n\nexport interface ExternalLinkParams {\n href: string;\n title?: string;\n color?: string;\n fontSize?: number;\n}\n\nexport function ExternalLink({ href, title = 'LINK', fontSize = 14, color }: ExternalLinkParams) {\n return (\n \n {title}\n \n opens in a new tab\n \n \n );\n}\n","import React from 'react';\nimport { Link, useHistory } from 'react-router-dom';\nimport { useDispatch, useSelector } from 'react-redux';\nimport _isEmpty from 'lodash/isEmpty';\n\nimport FilterPlantsByCharacteristicsButton from '../../filter/FilterPlantsByCharacteristicsButton';\nimport mapController from '../../../controllers/MapController';\nimport ScientificNameFormatted from '../searchResults/PlantResultScientificName/ScientificNameFormatted';\n\n// REDUX Store\nimport { RootState } from '../../../store/store';\nimport {\n $cardMinimized,\n $gardenCodeSelected,\n DEFAULT_SEARCH_TYPE,\n setGardenCodeSelected,\n setMinimized,\n setSearchType,\n} from '../../../store/app/appSlice';\nimport { setSearchDefinitionExpression } from '../../../store/app/filterSlice';\n\n// Config\nimport { BASE_URL } from '../../../config/config';\nimport { LOCATIONS_SEARCH_LABEL } from '../../../config/plant.config';\n\nimport IconChevronUp from '../../icons/IconChevronUp';\nimport IconReset from '../../icons/IconReset';\n\nimport './SearchPlantsCardHeader.scss';\nimport { decodePathValue } from '../../../utils/path.util';\nimport { ExternalLink } from '../../common/ExternalLink/ExternalLink';\n\nexport const SearchPlantsCardHeader = ({\n section,\n title,\n link,\n backToSearch,\n scientificName,\n}: {\n section?: string;\n title: string;\n link?: string;\n backToSearch?: boolean;\n scientificName?: boolean;\n}) => {\n const dispatch = useDispatch();\n const { goBack, push } = useHistory();\n\n const cardMinimized = useSelector($cardMinimized);\n const gardenCodeSelected = useSelector($gardenCodeSelected);\n const searchWidgetLocation = useSelector((state: RootState) => state.appReducer.searchWidgetLocation);\n const searchLocationMatch =\n searchWidgetLocation.includes('NAME') || searchWidgetLocation.includes('COMMON_NAME_PRIMARY');\n\n return (\n
\n
\n
\n dispatch(setMinimized(!cardMinimized))}\n >\n \n \n
\n {\n mapController.resetMapGraphics();\n\n if (!_isEmpty(gardenCodeSelected)) {\n // Handle back to main Garden Search view\n goBack();\n } else if (searchWidgetLocation.length > 0) {\n push(searchWidgetLocation);\n } else {\n push('/map');\n }\n\n // TODO: Clean this part before final deployment\n // if (!backToSearch) {\n // // * NOTE: if backToSearch is not true\n // goBack();\n // return;\n // }\n //\n // if (!searchWidgetLocation.length) {\n // // * NOTE: if the user is loading this component w/o using the search widget\n // return;\n // }\n //\n // if (searchLocationMatch) {\n // // * NOTE: if component loaded via search widget workflow\n // // * and they're searching by scientific name or common name\n // push(searchWidgetLocation);\n // } else {\n // goBack();\n // }\n // return;\n }}\n >\n \n Back to Search\n \n\n
\n {section} {scientificName ? : title}\n
\n\n {link && }\n
\n\n
\n {section === LOCATIONS_SEARCH_LABEL && }\n\n {\n mapController.resetMapGraphics();\n dispatch(setMinimized(true));\n dispatch(setSearchType(DEFAULT_SEARCH_TYPE));\n dispatch(setSearchDefinitionExpression(''));\n dispatch(setGardenCodeSelected(''));\n }}\n >\n \n \n
\n
\n\n
\n
\n {decodePathValue(title)}\n
\n
\n
\n
\n );\n};\n","//@ts-nocheck\nimport React, { useEffect, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer';\nimport List from 'react-virtualized/dist/commonjs/List';\nimport { alphabet, AUTOSIZER__ROW_HEIGHT } from '../../../config/plant.config';\nimport './SearchPlantsPreviewResults.scss';\nimport { getPath } from '../../../utils/path.util';\nimport { getNumberOfResultColumns } from '../../../utils/results.util';\n\nexport const SearchPlantsPreviewResults = ({ list, taxonomy }: { list: []; taxonomy: string }) => {\n const [numberOfColumns, setNumberOfColumns] = useState(1);\n const [rows, setRows] = useState([]);\n\n useEffect(() => {\n const bins: any = {};\n list.forEach((value: any) => {\n const firstLetter = value.charAt(0).toUpperCase();\n if (!bins.hasOwnProperty(firstLetter)) {\n bins[firstLetter] = [];\n }\n bins[firstLetter].push(value);\n });\n const rows = [];\n\n alphabet.forEach((letter: string) => {\n const resultsByLetter = bins[letter];\n\n if (resultsByLetter) {\n for (let i = 0; i < Math.ceil(resultsByLetter.length / numberOfColumns); i++) {\n const start = i * numberOfColumns;\n rows.push(resultsByLetter.slice(start, start + numberOfColumns));\n }\n }\n });\n\n setRows(rows);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [list, numberOfColumns]);\n\n const rowRenderer = ({ index, isScrolling, key, style }) => {\n const width = parseInt(100 / numberOfColumns);\n const currentLetter = rows[index][0].charAt(0).toUpperCase();\n const previousLetter = rows[index - 1] ? rows[index - 1][0].charAt(0).toUpperCase() : '';\n\n return (\n
\n
\n {currentLetter !== previousLetter && (\n {currentLetter}\n )}\n
\n {rows[index].map((value) => {\n return (\n
\n {value}\n
\n );\n })}\n
\n );\n };\n\n const noRowsRenderer = () => {\n return
No Results Found
;\n };\n\n const updateColumns = (width) => {\n const columns = getNumberOfResultColumns(width);\n if (numberOfColumns !== columns) setNumberOfColumns(columns);\n };\n\n return (\n
\n \n {({ height, width }) => {\n updateColumns(width);\n return (\n \n );\n }}\n \n
\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\n\nimport { setMinimized } from '../../../store/app/appSlice';\nimport { setSearchDefinitionExpression } from '../../../store/app/filterSlice';\n\nimport mapController from '../../../controllers/MapController';\n\nimport { SearchPlantsCardHeader } from './SearchPlantsCardHeader';\nimport { SearchPlantsPreviewResults } from './SearchPlantsPreviewResults';\nimport ResultsError from '../../error/ResultsError';\nimport Loader from '../../Loader';\n\nimport { splitByCharacter } from '../../../utils/plantSyntax.util';\nimport { RootState } from '../../../store/store';\n\nimport '../../../styles/css/plant.scss';\n\nconst FamilyPreview = () => {\n const mapLoaded = useSelector((state: RootState) => state.appReducer.mapLoaded);\n const dispatch = useDispatch();\n const { value: family } = useParams();\n\n const [error, setError] = useState(false);\n const [genera, setGenera] = useState([]);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const generateDefinitionExpression = () => {\n let expression: any = '';\n expression = `FAMILY = '${family}'`;\n\n dispatch(setSearchDefinitionExpression(expression));\n };\n\n const fetchAndSetData = async () => {\n try {\n const genera: Array = await mapController.queryGeneraByFamily(family);\n setGenera(genera);\n generateDefinitionExpression();\n } catch {\n setError(true);\n }\n\n setLoading(false);\n };\n\n if (mapLoaded && family) {\n dispatch(setMinimized(false));\n fetchAndSetData();\n } else {\n return;\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mapLoaded, family]);\n\n const familyName = splitByCharacter(family);\n\n return (\n
\n {loading ? (\n \n ) : error ? (\n \n ) : (\n
\n \n \n
\n )}\n
\n );\n};\n\nexport default FamilyPreview;\n","import React from 'react';\n\nimport { PlantPreviewData } from '../../../../interfaces/plantData';\nimport WidgetImage from '../../WidgetImage/WidgetImage';\nimport ScientificNameFormatted from '../../searchResults/PlantResultScientificName/ScientificNameFormatted';\n\nimport './PlantPreviewDetailsHeader.scss';\n\nexport function PlantPreviewDetailsHeader({\n livingPlant,\n plant: { FAMILY, HABIT_FULL, NAME, RANGE, NAME_NUM },\n}: {\n livingPlant: boolean;\n plant: PlantPreviewData;\n}) {\n return (\n
\n \n \n {!livingPlant && (\n \n \n \n \n )}\n\n \n \n \n \n\n {livingPlant && RANGE && (\n \n \n \n \n )}\n\n \n \n \n \n\n {/* Adding row to keep same spacing when RANGE is not present */}\n {!RANGE && (\n \n \n )}\n \n
\n Name:\n \n \n
\n Family:\n {FAMILY ? FAMILY : 'Data coming soon'}
\n Range:\n {RANGE}
\n Habit:\n {HABIT_FULL ? HABIT_FULL : 'Data coming soon'}
\n \n
\n\n \n
\n );\n}\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Link, useLocation, useParams } from 'react-router-dom';\n\nimport mapController from '../../../controllers/MapController';\n\nimport { RootState } from '../../../store/store';\nimport { selectedPlanInitialState, setMinimized, setSelectedPlant } from '../../../store/app/appSlice';\nimport { setSearchDefinitionExpression } from '../../../store/app/filterSlice';\n\nimport { PlantPreviewData } from '../../../interfaces/plantData';\nimport { BASE_URL } from '../../../config/config';\n\nimport { PlantPreviewDetailsHeader } from './PlantPreviewDetailsHeader/PlantPreviewDetailsHeader';\nimport { SearchPlantsCardHeader } from './SearchPlantsCardHeader';\nimport ResultsError from '../../error/ResultsError';\nimport Loader from '../../Loader';\n\nimport ScientificNameFormatted from '../searchResults/PlantResultScientificName/ScientificNameFormatted';\nimport { decodePathValue, encodePathValue } from '../../../utils/path.util';\nimport { getClean__CATALOG_DESC } from '../../../utils/plant.util';\nimport { splitByComma } from '../../../utils/plantSyntax.util';\n\nimport '../../../styles/css/plant.scss';\n\nconst PlantPreview = () => {\n const mapLoaded = useSelector((state: RootState) => state.appReducer.mapLoaded);\n const dispatch = useDispatch();\n const { value } = useParams();\n const { pathname, state: locationState } = useLocation();\n const fieldType = pathname.includes('commonname') ? 'commonname' : 'species';\n const plantValue = decodePathValue(value);\n\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(false);\n\n const [plant, setPlant] = useState(selectedPlanInitialState);\n const [livingPlant, setLivingPlant] = useState(true);\n const formattedValue = splitByComma(plantValue);\n\n useEffect(() => {\n const generateDefinitionExpression = () => {\n let expression: any = '';\n\n const name = formattedValue.replace(/'/gi, \"''\");\n const field = pathname.includes('species') ? 'NAME' : 'COMMON_NAME_PRIMARY';\n\n expression = `${field} = '${name}'`;\n\n dispatch(setSearchDefinitionExpression(expression));\n };\n\n const fetchAndSetData = async () => {\n try {\n let results: any;\n let livingPlant: boolean = true;\n\n if (fieldType === 'commonname') {\n results = await mapController.queryPlantByCommonName(formattedValue);\n } else {\n results = await mapController.queryPlantBySpeciesName(formattedValue);\n if (results.length === 0) {\n livingPlant = false;\n results = await mapController.queryPlantBySpeciesName(formattedValue, 1);\n }\n }\n const plantData = results[0].attributes;\n\n if (!plantData) {\n setLoading(false);\n setError(true);\n return;\n }\n\n setLivingPlant(livingPlant);\n\n if ('NAME' in plantData) {\n const plant = {\n NAME: plantData.NAME,\n NAME_NUM: plantData.NAME_NUM,\n COMMON_NAME_PRIMARY: plantData.COMMON_NAME_PRIMARY,\n FAMILY: plantData.FAMILY,\n RANGE: plantData.RANGE,\n HABIT_FULL: plantData.HABIT_FULL,\n CATALOG_DESC: plantData.CATALOG_DESC,\n };\n\n setPlant(plant);\n dispatch(setSelectedPlant(plant));\n }\n generateDefinitionExpression();\n } catch (err) {\n setError(true);\n }\n\n setLoading(false);\n };\n\n if (mapLoaded && plantValue) {\n dispatch(setMinimized(false));\n fetchAndSetData();\n } else {\n return;\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mapLoaded, plantValue]);\n\n return (\n
\n {loading ? (\n \n ) : error ? (\n \n ) : (\n <>\n \n
\n \n\n {livingPlant ? (\n <>\n \n
\n {\n dispatch(setMinimized(false));\n }}\n >\n Go To Plant Page\n \n
\n \n ) : (\n

\n is no longer in The New York Botanical Garden plant\n collection.\n

\n )}\n
\n \n )}\n
\n );\n};\n\nexport default PlantPreview;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\n\nimport mapController from '../../../controllers/MapController';\n\nimport { setMinimized } from '../../../store/app/appSlice';\nimport { setSearchDefinitionExpression } from '../../../store/app/filterSlice';\n\nimport '../../../styles/css/plant.scss';\n\nimport { SearchPlantsCardHeader } from './SearchPlantsCardHeader';\nimport { SearchPlantsPreviewResults } from './SearchPlantsPreviewResults';\nimport ResultsError from '../../error/ResultsError';\nimport Loader from '../../Loader';\n\nimport { splitByCharacter } from '../../../utils/plantSyntax.util';\nimport { RootState } from '../../../store/store';\n\nconst GenusPreview = () => {\n const mapLoaded = useSelector((state: RootState) => state.appReducer.mapLoaded);\n const dispatch = useDispatch();\n const { value: genus } = useParams();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(false);\n const [species, setSpecies] = useState([]);\n\n useEffect(() => {\n const generateDefinitionExpression = () => {\n let expression: any = '';\n\n expression = `GENUS = '${genus}'`;\n\n dispatch(setSearchDefinitionExpression(expression));\n };\n\n const fetchAndSetData = async () => {\n try {\n const results: Array = await mapController.querySpeciesByGenera(genus);\n const species = results.map((species: string) => species && species).sort();\n setSpecies(species);\n generateDefinitionExpression();\n } catch {\n setError(true);\n }\n\n setLoading(false);\n };\n\n if (mapLoaded && genus) {\n dispatch(setMinimized(false));\n fetchAndSetData();\n } else {\n return;\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mapLoaded, genus]);\n\n const genusName = splitByCharacter(genus);\n\n return (\n
\n {loading ? (\n \n ) : error ? (\n \n ) : (\n <>\n \n \n \n )}\n
\n );\n};\n\nexport default GenusPreview;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\nimport _uniqBy from 'lodash/uniqBy';\nimport _sortBy from 'lodash/sortBy';\n\nimport PlantSearchResults from '../searchResults/PlantSearchResults';\nimport { SearchPlantsCardHeader } from './SearchPlantsCardHeader';\nimport ResultsError from '../../error/ResultsError';\nimport Loader from '../../Loader';\n\nimport mapController from '../../../controllers/MapController';\n\nimport { RootState } from '../../../store/store';\nimport { $cardMinimized, $gardenLocations, setMinimized } from '../../../store/app/appSlice';\n\nimport {\n LOCATIONS_ESRI_FIELD,\n LOCATIONS_GROUP_FIELD,\n LOCATIONS_SEARCH_LABEL,\n LOCATIONS_GARDEN_WEBSITE,\n LOCATIONS_GARDEN_LOCATION,\n LOCATIONS_GARDEN_CODE,\n} from '../../../config/plant.config';\nimport { decodePathValue } from '../../../utils/path.util';\n// import { BASE_URL } from '../../config/config';\n\nimport '../../../styles/css/plants.scss';\nimport '../../../styles/css/plant.scss';\n\nconst LocationPreview = () => {\n const dispatch = useDispatch();\n const { value: gardenLocationFromUrlPathParams } = useParams();\n\n const [location, setLocation] = useState({ [LOCATIONS_ESRI_FIELD]: '' });\n const [gardenLocationFromUrlPath, setGardenLocationFromUrlPath] = useState();\n const [loading, setLoading] = useState(true);\n const [plantsAttributes, setPlantsAttributes] = useState([]);\n const [error, setError] = useState(false);\n const mapLoaded = useSelector((state: RootState) => state.appReducer.mapLoaded);\n const cardMinimized = useSelector($cardMinimized);\n const gardenLocations = useSelector($gardenLocations);\n\n useEffect(() => {\n const fetchAndSetData = async () => {\n setGardenLocationFromUrlPath(gardenLocationFromUrlPathParams);\n\n if (gardenLocationFromUrlPathParams) {\n const gardenLocation = decodePathValue(gardenLocationFromUrlPathParams);\n try {\n const [location] = gardenLocations.filter((location) => {\n return location[LOCATIONS_GARDEN_LOCATION] === gardenLocation;\n });\n const { results, features } = await mapController.queryLocationByGardenName(location[LOCATIONS_GROUP_FIELD]);\n\n if (!results) {\n setLoading(false);\n setError(true);\n return;\n }\n\n mapController.goToLocations(features);\n setLocation({\n [LOCATIONS_ESRI_FIELD]: results[LOCATIONS_ESRI_FIELD],\n [LOCATIONS_GARDEN_WEBSITE]: location[LOCATIONS_GARDEN_WEBSITE],\n [LOCATIONS_GARDEN_LOCATION]: location[LOCATIONS_GARDEN_LOCATION],\n });\n\n setLoading(false);\n\n const plantsAttributes = features.map((feature: any) => feature.attributes);\n setPlantsAttributes(_sortBy(_uniqBy(plantsAttributes, 'NAME'), 'NAME'));\n } catch (err) {\n console.log('Error in fetchAndSetData() of LocationPreview.tsx', err);\n setError(true);\n }\n }\n };\n\n if (mapLoaded && gardenLocations.length > 0 && gardenLocationFromUrlPath !== gardenLocationFromUrlPathParams) {\n dispatch(setMinimized(false));\n fetchAndSetData();\n }\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mapLoaded, gardenLocationFromUrlPathParams, gardenLocations]);\n\n return (\n
\n {loading ? (\n \n ) : error ? (\n \n ) : (\n <>\n \n \n \n )}\n
\n );\n};\n\nexport default LocationPreview;\n","import React, { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useParams } from 'react-router-dom';\nimport _sortBy from 'lodash/sortBy';\nimport _uniqBy from 'lodash/uniqBy';\n\nimport Loader from '../../../Loader';\nimport PlantSearchResults from '../../searchResults/PlantSearchResults';\nimport { SearchPlantsCardHeader } from '../SearchPlantsCardHeader';\n\nimport mapController from '../../../../controllers/MapController';\n\nimport { $cardMinimized, setMinimized } from '../../../../store/app/appSlice';\nimport { decodePathValue } from '../../../../utils/path.util';\n\nexport default function CommonNamePreferredResults(props: any) {\n const dispatch = useDispatch();\n const cardMinimized = useSelector($cardMinimized);\n const { value: commonNamePreferred } = useParams();\n\n const [plantNames, setPlantNames] = useState(undefined);\n\n useEffect(() => {\n if (cardMinimized) {\n dispatch(setMinimized(false));\n }\n\n const handledCommonNamePreferred = decodePathValue(commonNamePreferred);\n mapController\n .queryPlantsByCommonNamePreferred(handledCommonNamePreferred)\n .then((results: any) => {\n const plantsAttributes = results.features.map((feature: any) => feature.attributes);\n const plantsAttributesSortedUniq = _uniqBy(_sortBy(plantsAttributes, 'ALIVE'), 'NAME');\n setPlantNames(plantsAttributesSortedUniq);\n })\n .catch((err) => {\n console.log(err);\n setPlantNames([]);\n });\n }, [cardMinimized, commonNamePreferred, dispatch]);\n\n return !plantNames ? (\n \n ) : (\n
\n
\n \n \n
\n
\n );\n}\n","import React, { useEffect } from 'react';\nimport { Route, Switch, useHistory } from 'react-router-dom';\nimport { useSelector } from 'react-redux';\n\nimport SearchPlants from '../plants/SearchPlants';\nimport FamilyPreview from './previews/FamilyPreview';\nimport PlantPreview from './previews/PlantPreview';\nimport GenusPreview from './previews/GenusPreview';\nimport LocationPreview from './previews/LocationPreview';\nimport CommonNamePreferredResults from './previews/CommonNamePreferredResults/CommonNamePreferredResults';\n\nimport { RootState } from '../../store/store';\n\nimport {\n getPath,\n MAP_LINK__COMMON_NAME,\n MAP_LINK__GENUS,\n MAP_LINK__LOCATION,\n MAP_LINK__SPECIES,\n} from '../../utils/path.util';\nimport { BASE_URL } from '../../config/config';\n\nimport '../../styles/css/card.scss';\n\nconst Card = (): JSX.Element | null => {\n const history = useHistory();\n const cardMinimized = useSelector((state: RootState) => state.appReducer.cardMinimized);\n // const cardContent = useSelector((state: RootState) => state.appReducer.cardContent);\n const species = useSelector((state: RootState) => state.appReducer.species);\n\n useEffect(() => {\n if (species.length) {\n history.push(`${BASE_URL}${getPath('species', species)}`);\n }\n }, [history, species]);\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n
\n );\n};\n\nexport default Card;\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport Card from '../plants/Card';\n// import Snackbar from '../error/Snackbar';\n\n// REDUX Store\nimport { RootState } from '../../store/store';\nimport { setModalContent } from '../../store/app/modalSlice';\nimport { setGardenLocations } from '../../store/app/appSlice';\nimport { $filterSelectedOptions, setFilterSelectedOptions } from '../../store/app/filterSlice';\n\n// CONTEXT Store\nimport { PlantsResultsContextProvider } from '../../store/PlantsResultsContextProvider';\n\n// Utils\nimport { getGardenLocation, getUpdateFilterOptions } from '../../utils/query.utils';\nimport { getGardenLocationsWithImages } from '../../utils/map/images.util';\nimport { getGardenImages } from '../../utils/garden.util';\nimport mapController from '../../controllers/MapController';\n\nimport '../../styles/css/filterPlants.scss';\nimport '../../styles/css/favorites.scss';\nimport '../../styles/css/map.scss';\nimport './map.scss';\n\ninterface MapContainerProps {\n readonly visible: boolean;\n}\n\nconst StyledMapContainer = styled.div`\n display: ${(props) => (props.visible ? '' : 'none;')};\n`;\n\nconst StyleMap = styled.div`\n height: 100%;\n width: 100%;\n`;\n\nconst atMapLocation = (location: string) => {\n return location.indexOf('/map') > -1;\n};\n\nfunction Map() {\n const dispatch = useDispatch();\n const { pathname, search } = useLocation();\n const query = new URLSearchParams(search);\n const tourID = Number(query.get('id'));\n\n const filterSelectedOptions = useSelector($filterSelectedOptions);\n // const searchType = useSelector($searchType);\n const cardMinimized = useSelector((state: RootState) => state.appReducer.cardMinimized);\n const mapLoaded = useSelector((state: RootState) => state.appReducer.mapLoaded);\n const mapIsVisible = atMapLocation(pathname);\n const [mapVisible, setMapVisible] = useState(atMapLocation(pathname));\n const mapRef = useRef(null);\n\n useEffect(() => {\n if (mapIsVisible && !mapLoaded) {\n mapController.initializeMap(mapRef);\n }\n\n if (tourID) {\n dispatch(setModalContent('ViewTours'));\n }\n setMapVisible(mapIsVisible);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pathname, mapLoaded]);\n\n // Load Garden Locations and images\n useEffect(() => {\n getGardenLocation().then(({ locationsAttributes, locations }) => {\n const filterSelectedOptionsUpdated = getUpdateFilterOptions(filterSelectedOptions, locations);\n\n dispatch(setGardenLocations(locationsAttributes));\n dispatch(setFilterSelectedOptions(filterSelectedOptionsUpdated));\n\n getGardenImages()\n .then((assetBankGardenImages: any) => {\n const gardenLocationsWithImages = getGardenLocationsWithImages(locationsAttributes, assetBankGardenImages);\n dispatch(setGardenLocations(gardenLocationsWithImages));\n })\n .catch((err) => {\n console.log('handleGardenImages()', err);\n });\n });\n }, [dispatch]);\n\n // useEffect(() => {\n // if (searchType === 'Advanced' && isMobileDevice) {\n // dispatch(setModalContent('Advanced'));\n // }\n // }, [dispatch, searchType]);\n\n return (\n \n \n \n \n {/**/}\n \n \n );\n}\n\nexport default Map;\n","/**\n * Get Garden Images. Call Asset Bank API to get garden images links\n */\nexport function getGardenImages() {\n return new Promise((resolve, reject) => {\n const IMAGE_API =\n process.env.NODE_ENV === 'production'\n ? process.env.REACT_APP_ASSET_BANK_URL_PROD\n : process.env.REACT_APP_ASSET_BANK_URL_DEV;\n const url = `${IMAGE_API}/api/getGardenImages`;\n\n fetch(url)\n .then((res) => res.json())\n .then(({ data }) => {\n const processedGardenData = data.map((garden: any) => {\n let keyword;\n garden.displayAttributes.forEach((item: any) => {\n if (item.label === 'Keywords') {\n keyword = item.value\n .split(',')\n .map((keyword: string) => keyword.trim())\n .find((keyword: string) => keyword.includes('!'))\n .replace('!', '')\n .toLowerCase();\n }\n });\n\n return {\n ...garden,\n keyword: keyword,\n };\n });\n\n resolve(processedGardenData);\n })\n .catch((err) => {\n reject(err);\n });\n });\n}\n","import { LOCATIONS_GROUP_FIELD } from '../../config/plant.config';\n\n/**\n * Get Garden Locations with Images\n * @param {[]} locationsAttributes - List of garden locations\n * @param {[]} assetBankGardenImages - List of garden images from Asset Bank\n * @return {[]} - List of garden locations with images\n */\nexport function getGardenLocationsWithImages(locationsAttributes: any[], assetBankGardenImages: any[]) {\n return locationsAttributes.map((garden: any) => {\n const gardenLocation = garden[LOCATIONS_GROUP_FIELD].toLowerCase().replace(/ /g, '').replace(/_/g, '');\n\n let gardenImages;\n // Default image selector\n gardenImages = assetBankGardenImages.find((assetBankGardenImage: any) => {\n return gardenLocation === assetBankGardenImage.keyword;\n });\n\n if (!gardenImages) {\n console.log(`Garden Location Code doesn't have exact match in AssetBank: ${garden[LOCATIONS_GROUP_FIELD]}`);\n // Fallback image selector\n gardenImages = assetBankGardenImages.find((assetBankGardenImage: any) => {\n return gardenLocation.includes(assetBankGardenImage.keyword);\n });\n }\n\n return {\n ...garden,\n previewUrl: gardenImages?.previewUrl,\n thumbnailUrl: gardenImages?.thumbnailUrl,\n };\n });\n}\n"],"sourceRoot":""}