{"version":3,"sources":["components/results/result.js","components/icons/search.js","components/text-search/no-autocomplete.js","helpers/index.js","components/text-search/search-as-you-type.js","components/text-search/index.js","components/list-facet/index.js","components/range-facet/index.js","components/search-field-container.js","components/results/list.js","components/icons/chevrons.js","components/results/pagination.js","components/results/count-label.js","components/current-query/index.js","components/sort-menu/index.js","components/results/instructions.js","components/federated_solr_component_pack.js","components/results/result-components/index.js","components/results/result-components/directory.js","components/results/result-components/condition.js","components/results/result-components/treatment.js","components/results/result-components/recipe.js","components/results/result-components/department.js","components/federated-solr-faceted-search.js","index.js"],"names":["FederatedResult","date","Intl","DateTimeFormat","year","month","day","format","Date","parse","phoneNumberString","match","replace","join","doc","hostname","this","props","Object","hasOwnProperty","call","ss_canonical_url","Array","isArray","sm_urls","currentHostUrl","find","item","url","ss_url","console","log","arr","sep","length","slice","reduce","xs","x","i","concat","sitenames","urls","originalSitename","sites","push","className","href","key","departments","highlight","sm_department","onClick","onSelect","getCanonicalLink","dangerouslySetInnerHTML","__html","ss_federated_type","ss_sort_az_field","ss_federated_title","ss_summary","sm_federated_type","React","Component","Search","xmlns","viewBox","d","FederatedTextSearchNoAutocomplete","state","value","handleInputChange","bind","handleInputKeyDown","handleSubmit","nextProps","setState","ev","target","keyCode","onChange","field","parsed","queryString","window","location","search","stringified","stringify","history","pushState","newUrl","protocol","host","pathname","path","label","Fragment","htmlFor","type","name","id","autoFocus","onKeyDown","e","preventDefault","defaultProps","filterFieldsWithQsState","qs","getParsedQsAndParams","arrayFormat","params","entries","getFieldQsInfo","values","foundIdx","indexOf","isQsParamField","param","addValueToQsParam","newParsed","includes","addQsParam","fieldType","split","isMultiple","charAt","removeValueFromQsParam","filter","addNewUrlToBrowserHistory","newurl","setFieldStateFromQs","searchField","newSearchField","collapse","decodeURI","expandedHierarchies","forEach","decodedParam","map","highlightText","text","toString","trim","parts","RegExp","part","style","toLowerCase","fontWeight","FederatedTextSearchAsYouType","suggestions","reset","getSuggestionValue","loadSuggestions","onSuggestionSelected","onSuggestionsFetchRequested","onSuggestionsClearRequested","renderSuggestion","renderSuggestionsContainer","shouldRenderSuggestions","active","suggestQuery","docs","event","newValue","method","suggestion","autocomplete","mode","stopPropagation","assign","persist","onSuggest","query","defaultPrevented","numChars","containerProps","children","hasResultModeConfig","hasTermModeConfig","resultTitleText","result","titleText","termTitleText","showDirectionsText","term","decodedTitle","he","decode","highlightedTitle","helpers","currentHumanIndex","suggestionsLength","inputProps","role","focusInputOnSuggestionClick","renderInputComponent","theme","container","containerOpen","input","inputOpen","inputFocused","suggestionsContainer","suggestionsContainerOpen","suggestionsList","suggestionFirst","suggestionHighlighted","sectionContainer","sectionContainerFirst","sectionTitle","FederatedTextSearch","InputComponent","FederatedListFacet","truncateFacetListsAt","v","hierarchyFacetValue","onSetCollapse","indexOfExpandedHierarchyFacetValue","splice","facets","hierarchy","options","siteList","facetCounts","facet","facetValues","facetInputs","keys","expanded","height","types","terms","facetValue","pieces","items","facetCount","uniqueTypes","self","String","listFacetHierarchyLis","listFacetHierarchyTermsLis","termObj","checked","handleClick","tabIndex","cx","toggleExpand","duration","FederatedRangeFacet","startDate","endDate","focusedInput","momentToSolrStart","moment","subtract","hours","momentToSolrEnd","add","minutes","seconds","calendarOrientation","undefined","calendarFullScreen","calendarMonths","getLastMonth","matchMedia","matches","startDateId","endDateId","onDatesChange","handleDatesChange","onFocusChange","isOutsideRange","today","diff","isBefore","minimumNights","small","showClearDates","onClose","handleCalendarClose","phrases","calendarLabel","chooseAvailableStartDate","chooseAvailableEndDate","clearDates","closeDatePicker","dateIsSelected","dateIsUnavailable","enterKey","escape","focusStartDate","hideKeyboardShortcutsPanel","homeEnd","jumpToNextMonth","jumpToPrevMonth","keyboardNavigationInstructions","keyboardShortcuts","leftArrowRightArrow","moveFocusByOneDay","moveFocusByOneMonth","moveFocusByOneWeek","moveFocustoStartAndEndOfWeek","openThisPanel","pageUpPageDown","questionMark","returnFocusToInput","selectFocusedDate","showKeyboardShortcutsPanel","upArrowDownArrow","initialVisibleMonth","numberOfMonths","orientation","withFullScreenPortal","FederatedSearchFieldContainer","intFrameWidth","innerWidth","addEventListener","onNewSearch","resultsCount","title","aria-labelledby","FederatedResultList","DoubleChevronLeft","DoubleChevronRight","ArrowRight","ArrowLeft","FederatedPagination","buildHandleEnterKeyPress","page","pageAmt","document","getElementById","focus","preventScroll","currentPage","isCurrentPage","onPageChange","onKeyPress","aria-current","results","start","rows","numFound","Math","ceil","numButtons","paginationButtons","rangeStart","rangeEnd","pages","firstPageHidden","prevPageHidden","nextPageHidden","lastPageHidden","aria-hidden","rel","idx","renderPage","FederatedCountLabel","termValue","noResultsText","message","a11yMessage","aria-live","searchResultsStat","FacetType","ListFacetType","announcePolite","val","removeListFacetValue","RangeFacetType","utc","startFormatted","end","endFormatted","filterValue","removeRangeFacetValue","TextFacetType","removeTextValue","FederatedCurrentQuery","fields","searchFields","facetTypes","isHidden","MyFacetType","FederatedSortMenu","sortField","sortFields","order","option","customDropdownStyles","control","styles","backgroundColor","borderColor","fontSize","borderRadius","padding","minWidth","border","outline","isDisabled","isSelected","color","cursor","indicatorSeparator","display","dropdownIndicator","menu","paddingTop","paddingBottom","margin","menuList","placeholder","selectedValue","FederatedInstructions","FederatedSolrComponentPack","defaultComponentPack","currentQuery","list","paginate","resultCount","instructions","Directory","sm_federated_image","media","srcset","src","alt","width","ss_field_clinical_title","tm_X3b_en_field_special_interest","interest","bs_field_accepting_patients","bs_field_top_dentist","bs_field_top_doc","sm_field_phone","phone","formatPhoneNumber","Conditions","Treatment","Recipe","Department","FederatedSolrFacetedSearch","submitted","resetFilters","searchTerm","mainQueryField","onSearchFieldChange","ResultComponents","customComponents","bootstrapCss","onTextInputChange","onSortFieldChange","SearchFieldContainerComponent","ResultContainerComponent","ResultComponent","ResultCount","ResultHeaderComponent","header","ResultInstructionsComponent","ResultListComponent","ResultPendingComponent","pending","PaginateComponent","PreloadComponent","preloadIndicator","CurrentQueryComponent","SortComponent","resultPending","pagination","pageStrategy","preloadListItem","pageTitle","sortChange","a","b","autoComplete","sf","menuTitle","sidebarFilters","lowerBound","upperBound","SearchComponent","getFacetValues","showEmptySearchResults","noResults","CustomResultComponent","getResultByType","onSelectDoc","resultIndex","highlighting","showCsvExport","searchFromQuerystring","solrClient","searchFieldsState","prototype","filterField","siteSearch","sort","defaultSort","sendQuery","root","dataset","settings","defaults","isD7","proxyIsDisabled","hiddenSearchFields","hl","fl","usePhraseHighlighter","filters","sm_site_name_value","sm_site_name","SolrClient","userpass","handlers","ReactDOM","render","onpopstate","init","JSON","federatedSearchAppConfig","error"],"mappings":"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","file":"static/js/main.chunk.js","sourcesContent":["import PropTypes from 'prop-types';\nimport React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport url from 'url';\n\n// Custom class for the result component\nclass FederatedResult extends React.Component {\n\n dateFormat(date){\n if (typeof date !== 'undefined') {\n const prettyDate = new Intl.DateTimeFormat('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n }).format(Date.parse(date));\n return prettyDate;\n }\n }\n\n // https://stackoverflow.com/questions/8358084/regular-expression-to-reformat-a-us-phone-number-in-javascript\n formatPhoneNumber(phoneNumberString) {\n let cleaned = ('' + phoneNumberString).replace(/\\D/g, '');\n let match = cleaned.match(/^(1|)?(\\d{3})(\\d{3})(\\d{4})$/);\n if (match) {\n let intlCode = (match[1] ? '+1 ' : '');\n // return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('');\n return [match[2], '.', match[3], '.', match[4]].join('');\n }\n return null;\n}\n\n /**\n * Returns the appropriate link for a given search result.\n * 1. Use the canonical url if present.\n * 2. Next, attempt to find a url from the current host.\n * 3. Then, use the first url returned in the array of urls.\n * 4. Fall back to the legacy url field.\n * 5. Send an empty string if none of these options work.\n *\n * @param doc\n * Search result object\n * @returns string\n */\n getCanonicalLink(doc) {\n const { hostname } = this.props;\n\n // 1. Use the canonical url as a first option\n if (Object.hasOwnProperty.call(doc, 'ss_canonical_url') && doc.ss_canonical_url) {\n return doc.ss_canonical_url;\n }\n\n // Use a url from the current host, if present. Otherwise use the first Url.\n if (Object.hasOwnProperty.call(doc, 'sm_urls') && Array.isArray(doc.sm_urls)) {\n // Attempt to find a url from the current host.\n const currentHostUrl = doc.sm_urls.find((item) => {\n const myUrl = url.parse(item);\n return myUrl.hostname === hostname;\n });\n\n // 2. Use the url from the current host.\n if (currentHostUrl) {\n return currentHostUrl;\n }\n\n // 3. Use the first url.\n return doc.sm_urls[0];\n }\n\n // 4. Fall back to the single url (which will be relative)\n if (Object.hasOwnProperty.call(doc, 'ss_url') && doc.ss_url) {\n return doc.ss_url;\n }\n console.log(\"test\")\n // 5. If no valid urls are passed, return nothing. This will result in an\n // unlinked title, but at least it won't crash.\n return '';\n }\n\n intersperse(arr, sep) {\n if (arr.length === 0) {\n return [];\n }\n\n return arr.slice(1).reduce(function(xs, x, i) {\n return xs.concat([sep, x]);\n }, [arr[0]]);\n }\n\n renderSitenameLinks(sitenames, urls, originalSitename) {\n if (sitenames != null && urls != null) {\n var sites = [];\n for (var i = 0; i < sitenames.length; i++) {\n sites.push(<a className=\"tag site\" href={urls[i]} key={i}>{sitenames[i]}</a>);\n if (i !== (sitenames.length - 1)) {\n\n }\n }\n }\n\n if (originalSitename != null) {\n return originalSitename;\n }\n\n return null;\n }\n\n render() {\n const { doc, highlight } = this.props;\n let departments = null;\n if (Array.isArray(doc.sm_department)){\n departments = doc.sm_department.join(\" | \");\n }\n return (\n <li\n className=\"search-card search-card--default tile\"\n onClick={() => this.props.onSelect(doc)}\n >\n <a href={this.getCanonicalLink(doc)}>\n\n <div className=\"text wrapper\">\n {departments ? (\n <span className=\"department-tag\">{departments}</span>\n ) : null}\n\n <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_federated_type == 'Provider'\n ? doc.ss_sort_az_field\n : doc.ss_federated_title\n }}></h3>\n\n <p\n className=\"search-card__summary\"\n dangerouslySetInnerHTML={{ __html: doc.ss_summary }}\n />\n\n <div className=\"meta tags tags--pipe\">\n {doc.sm_federated_type ? (\n <span className=\"content-type-tag type\">\n {doc.sm_federated_type}\n </span>\n ) : null}\n\n </div>\n </div>\n </a>\n </li>\n );\n }\n}\n\nFederatedResult.propTypes = {\n doc: PropTypes.object,\n fields: PropTypes.array,\n onSelect: PropTypes.func.isRequired,\n hostname: PropTypes.string\n};\n\nexport default FederatedResult;\n","import React from \"react\";\n\nclass Search extends React.Component {\n\trender() {\n\t\treturn (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M17.545 15.467l-3.779-3.779a6.15 6.15 0 0 0 .898-3.21c0-3.417-2.961-6.377-6.378-6.377A6.185 6.185 0 0 0 2.1 8.287c0 3.416 2.961 6.377 6.377 6.377a6.15 6.15 0 0 0 3.115-.844l3.799 3.801a.953.953 0 0 0 1.346 0l.943-.943c.371-.371.236-.84-.135-1.211zM4.004 8.287a4.282 4.282 0 0 1 4.282-4.283c2.366 0 4.474 2.107 4.474 4.474a4.284 4.284 0 0 1-4.283 4.283c-2.366-.001-4.473-2.109-4.473-4.474z\"/></svg>\n\t\t);\n\t}\n}\n\nexport default Search;","import PropTypes from 'prop-types';\nimport queryString from 'query-string';\nimport React from 'react';\nimport SearchIcon from '../icons/search';\n\n// Renders plain text input and submit button for text search.\n// Rendered when env config autocomplete is not present or set to false.\n// @see /env.local.js.example\nclass FederatedTextSearchNoAutocomplete extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n value: '',\n };\n\n this.handleInputChange = this.handleInputChange.bind(this);\n this.handleInputKeyDown = this.handleInputKeyDown.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n this.setState({\n value: nextProps.value,\n });\n }\n\n handleInputChange(ev) {\n this.setState({\n value: ev.target.value,\n });\n }\n\n handleInputKeyDown(ev) {\n if (ev.keyCode === 13) {\n this.handleSubmit();\n }\n }\n\n handleSubmit() {\n this.props.onChange(this.props.field, this.state.value);\n // Get existing querystring params.\n const parsed = queryString.parse(window.location.search);\n // Update the search querystring param with the value from the search field.\n parsed.search = this.state.value;\n const stringified = queryString.stringify(parsed);\n // Update the querystring params in the browser, add path to history.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method\n if (window.history.pushState) {\n const newUrl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${stringified}`;\n window.history.pushState({ path: newUrl }, '', newUrl);\n } else {\n window.location.search = stringified;\n }\n }\n\n render() {\n const { label } = this.props;\n\n return (\n <React.Fragment>\n <label htmlFor=\"search\" className=\"fs-search-form__label\">{label}</label>\n <div className=\"fs-search-form__input-wrapper\">\n <input\n type=\"search\"\n name=\"search\"\n id=\"search\"\n className=\"fs-search-form__input\"\n autoFocus\n onChange={this.handleInputChange}\n onKeyDown={this.handleInputKeyDown}\n value={this.state.value || ''}\n />\n <button\n type=\"submit\"\n className=\"fs-search-form__submit btn-secondary\"\n onClick={e=> { e.preventDefault(); this.handleSubmit(e);}}\n >\n <span className=\"screen-hide\">Perform Search</span>\n <SearchIcon />\n </button>\n </div>\n </React.Fragment>\n );\n }\n}\n\nFederatedTextSearchNoAutocomplete.defaultProps = {\n label: '',\n onChange: () => {},\n value: '',\n};\n\nFederatedTextSearchNoAutocomplete.propTypes = {\n field: PropTypes.string.isRequired,\n label: PropTypes.string,\n onChange: PropTypes.func,\n value: PropTypes.string,\n};\n\nexport default FederatedTextSearchNoAutocomplete;\n","import React from 'react';\nimport queryString from 'query-string';\n\n/**\n * Find and highlight relevant keywords within a block of text\n * @param {string} text - The text to parse\n * @param {string} highlight - The search keyword/partial to highlight\n * @return {object} A JSX object containing an array of alternating strings and JSX\n */\nconst highlightText = (text, highlight) => {\n if (!highlight.toString().trim()) {\n return <span>{text}</span>;\n }\n // Split on highlight term and include term into parts, ignore case\n const parts = text.split(new RegExp(`(${highlight})`, 'gi'));\n return (\n <span> { parts.map((part, i) =>\n (\n <span key={i} style={part.toLowerCase() === highlight.toString().toLowerCase() ? { fontWeight: 'bold' } : {}}>\n { part }\n </span>\n ))}\n </span>);\n};\n\n// Those filter fields for which we want to preserve state in qs.\nconst filterFieldsWithQsState = [\n 'sm_site_name',\n 'sm_federated_type',\n 'sm_department',\n 'sm_federated_terms',\n];\n\nconst qs = {\n /**\n * Gets the qs params as an object and broken into array of [key,value] pairs.\n * Params with multiple values (i.e. federated terms) use the following syntax:\n * ...&sm_federated_terms[]=value1&sm_federated_terms[]=value2\n *\n * @returns {{parsed: (*|*|*), params: [string, any][]}}\n */\n getParsedQsAndParams: () => {\n const parsed = queryString.parse(window.location.search, { arrayFormat: 'bracket' });\n return {\n parsed,\n params: Object.entries(parsed),\n };\n },\n /**\n * Determines information related this search field, its value, and state.\n *\n * @param field\n * this.props.query.searchField.field (i.e. the solr field name)\n * @param values\n * this.props.query.searchField.value (i.e. the current value for the field)\n * @param value\n * The value of the field with which interaction has happened.\n * @returns object\n * An object with:\n * foundIdx: the position of the field value in question found in this field's state,\n * parsed: an object with parsed qs params and their values,\n * isQsParamField: whether or not the field in question should track state in the qs,\n * param: an object with the as param and value for this field, if it exists\n */\n getFieldQsInfo: ({ field, values, value }) => {\n // Determine if the field value in question exists in this search field's state.\n // i.e. was it toggled on or off?\n const foundIdx = values.indexOf(value);\n // Get existing querystring params.\n const { parsed, params } = qs.getParsedQsAndParams();\n\n // Check if the search field is one for which we preserve state through qs.\n const isQsParamField = filterFieldsWithQsState.find(item => item === field);\n\n // Check if the filter field exists in qs param.\n const param = params.find(item => item[0] === field);\n\n return {\n foundIdx,\n parsed,\n isQsParamField,\n param,\n };\n },\n /**\n * Updates the parsed object by adding the field value in question to its param key.\n *\n * @param field\n * this.props.query.searchField.field (i.e. the solr field name)\n * @param value\n * The value of the field with which interaction has happened.\n * @param param\n * An object with the as param and value for this field, if it exists.\n * @param parsed\n * An object with parsed qs params and their values.\n * @returns Object\n * An updated parsed object with the field value in question added.\n */\n addValueToQsParam: ({\n field,\n value,\n param,\n parsed,\n }) => {\n const newParsed = parsed;\n // Handle single value params.\n if (typeof param[1] !== 'object' && value !== param[1]) {\n // Add the param for this field from the parsed qs object.\n newParsed[field] = value;\n }\n // Handle multi value params.\n if (typeof param[1] === 'object' && !param[1].includes(value)) {\n // Add the list item facet value to the param value.\n param[1].push(value);\n // Set the new param value.\n newParsed[field] = [...param[1]];\n }\n return newParsed;\n },\n /**\n * Updates the parsed object by adding the field and its value to the\n * current object of params and their values.\n *\n * @param field\n * this.props.query.searchField.field (i.e. the solr field name)\n * @param value\n * The value of the field with which interaction has happened.\n * @param param\n * An object with the as param and value for this field, if it exists.\n * @param parsed\n * An object with parsed qs params and their values.\n * @returns Object\n * An updated parsed object with the field + value added.\n */\n addQsParam: ({\n field,\n value,\n parsed,\n }) => {\n const newParsed = parsed;\n const fieldType = field.split('_')[0];\n const isMultiple = fieldType.charAt(fieldType.length - 1) === 'm';\n\n // Handle single value params.\n if (!isMultiple) {\n // Add the param for this field from the parsed qs object.\n newParsed[field] = value;\n }\n // Handle multi value params.\n if (isMultiple) {\n // Set the new param value.\n newParsed[field] = [value];\n }\n return newParsed;\n },\n /**\n * Updates the parsed object by removing the field value in question to its param key.\n *\n * @param field\n * this.props.query.searchField.field (i.e. the solr field name)\n * @param value\n * The value of the field with which interaction has happened.\n * @param param\n * An object with the as param and value for this field, if it exists.\n * @param parsed\n * An object with parsed qs params and their values.\n * @returns Object\n * An updated parsed object with the field value in question removed.\n */\n removeValueFromQsParam: ({\n field,\n value,\n param,\n parsed,\n }) => {\n const newParsed = parsed;\n // Remove value from parsed qs params.\n // Handle single value params.\n if (typeof param[1] !== 'object' && value === param[1]) {\n // Remove the param for this field from the parsed qs object.\n delete newParsed[field];\n }\n // Handle multi value params.\n if (typeof param[1] === 'object' && param[1].includes(value)) {\n // Remove the list facet value from the param.\n newParsed[field] = param[1].filter(item => item !== value);\n }\n\n return newParsed;\n },\n /**\n * Updates the browser window.history with an entry based on the new parsed qs params and values.\n *\n * @param parsed\n * An object with parsed qs params and their values.\n */\n addNewUrlToBrowserHistory: (parsed) => {\n // Update the search querystring param with the value from the search field.\n const stringified = queryString.stringify(parsed, { arrayFormat: 'bracket' });\n // Update the querystring params in the browser, add path to history.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method\n if (window.history.pushState) {\n const newurl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${stringified}`;\n window.history.pushState({ path: newurl }, '', newurl);\n } else {\n window.location.search = stringified;\n }\n },\n /**\n * Sets query.searchFields state based on the state of the qs.\n * Allows searches to be executed on app load based on URL.\n *\n * @param params\n * QS params broken into array of [key,value] pairs.\n * @param searchField\n * Search field in question. (this.props.query.searchField)\n * @returns Object\n * Updated this.props.query.searchField based on qs param values.\n */\n setFieldStateFromQs: ({\n params,\n searchField,\n }) => {\n // Make a copy of the searchField arg.\n const newSearchField = searchField;\n // Check if the filter field exists in qs params.\n const param = params.find(item => item[0] === searchField.field);\n // Check if the filter field is sm_federated_terms.\n // If searchField has corresponding qs param present.\n if (param) {\n // Since there is a param for this search field, set it's toggle group to be open.\n // Note: sm_federated_terms needs to list active \"parents\".\n // See below in logic for multivalue fields.\n newSearchField.collapse = false;\n // Ensure we can push to searchField value.\n newSearchField.value = searchField.value || [];\n // Don't add qs param values if they're already set in app state.\n // Push single values onto the searchField.value array.\n if (typeof param[1] !== 'object' && !searchField.value.find(item => item === param[1])) {\n newSearchField.value.push(decodeURI(param[1]));\n }\n // Concatenate existing searchField.value array with multivalue param array..\n if (typeof param[1] === 'object' && searchField.value !== param[1]) {\n const isFederatedTerms = searchField.field === 'sm_federated_terms';\n if (isFederatedTerms) {\n const expandedHierarchies = [];\n param[1].forEach((item) => {\n // Add the first part of the term to indicate it's toggle should be open.\n expandedHierarchies.push(item.split('>')[0]);\n });\n // Set tm_federated_terms expanded hierarchies.\n newSearchField.expandedHierarchies = expandedHierarchies;\n }\n // Decode param values.\n const decodedParam = param[1].map(item => decodeURI(item));\n // Set the searchField.value to the new decoded param values.\n newSearchField.value = [...decodedParam];\n }\n } else {\n // If the searchField does not have qs param present, clear its value in state.\n delete newSearchField.value;\n // Set its sidebar toggle group to be closed.\n newSearchField.collapse = true;\n }\n\n return newSearchField;\n },\n};\n\nexport default {\n highlightText,\n filterFieldsWithQsState,\n qs,\n};\n","import React from 'react';\nimport queryString from 'query-string';\nimport he from 'he';\nimport PropTypes from 'prop-types';\nimport Autosuggest from 'react-autosuggest';\nimport helpers from '../../helpers';\nimport SearchIcon from '../icons/search';\n\n// Renders autocomplete text input and submit button for text search.\n// Rendered when env config autocomplete is present.\n// @see /env.local.js.example\nclass FederatedTextSearchAsYouType extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n value: '',\n suggestions: [],\n reset: false,\n };\n\n this.getSuggestionValue = this.getSuggestionValue.bind(this);\n this.handleInputKeyDown = this.handleInputKeyDown.bind(this);\n this.handleSubmit = this.handleSubmit.bind(this);\n this.loadSuggestions = this.loadSuggestions.bind(this);\n this.onChange = this.onChange.bind(this);\n this.onSuggestionSelected = this.onSuggestionSelected.bind(this);\n this.onSuggestionsFetchRequested = this.onSuggestionsFetchRequested.bind(this);\n this.onSuggestionsClearRequested = this.onSuggestionsClearRequested.bind(this);\n this.renderSuggestion = this.renderSuggestion.bind(this);\n this.renderSuggestionsContainer = this.renderSuggestionsContainer.bind(this);\n this.shouldRenderSuggestions = this.shouldRenderSuggestions.bind(this);\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n // nextProps.value will be null if the filter is reset.\n // The logic here is rather tortured, which seemed a better option\n // than trying to fix the iteration bug in the core react suite.\n // See https://github.com/palantirnet/federated-search-react/pull/63.\n // The 'reset' state indicates that we should reset the field. The\n // 'active' variable indicates that we are clearing the field and\n // should not act on the nextProps value.\n var active = false;\n if (nextProps.value !== null) {\n this.setState({\n reset: true,\n });\n active = false;\n }\n if (nextProps.value === null && this.state.reset === true) {\n this.setState({\n value: \"\",\n suggestions: [],\n reset: false,\n });\n active = true;\n }\n if ((this.state.value !== \"\" || this.props.value !== null) && active === false) {\n this.setState({\n value: nextProps.suggestQuery && nextProps.suggestQuery.value\n ? nextProps.suggestQuery.value\n : nextProps.value,\n suggestions: nextProps.suggestions ? nextProps.suggestions.docs : this.state.suggestions,\n });\n }\n }\n\n /**\n * Called every time the input value changes\n *\n * @param event\n * Event object\n * @param newValue\n * The new value of the input\n * @param method\n * String describing how the change has occurred. The possible values are:\n * 'down' - user pressed Down\n * 'up' - user pressed Up\n * 'escape' - user pressed Escape\n * 'enter' - user pressed Enter\n * 'click' - user clicked (or tapped) on suggestion\n * 'type' - none of the methods above (usually means that user typed something,\n * but can also be that they pressed Backspace, pasted something into the input, etc.)\n */\n onChange(event, { newValue, method }) {\n if (method === 'type') {\n this.setState({\n value: newValue,\n });\n\n // Ensure that the suggestQuery.value prop gets cleared on backspace / cut.\n this.props.suggestQuery.value = newValue;\n }\n }\n\n // Called every time you need to recalculate suggestions.\n onSuggestionsFetchRequested({ value }) {\n this.loadSuggestions(value);\n }\n\n /**\n * Called every time suggestion is selected via mouse or keyboard.\n *\n * @param event\n * Event object\n * @param suggestion\n * The selected suggestion\n * Unused: suggestionValue\n * The value of the selected suggestion\n * (equivalent to getSuggestionValue(suggestion))\n * Unused: suggestionIndex\n * The index of the selected suggestion in the suggestions array\n * Unused: sectionIndex\n * When rendering multiple sections,this will be the section index\n * (in suggestions) of the selected suggestion. Otherwise, it will be null.\n * @param method\n * String describing how user selected the suggestion. The possible values are:\n * 'click' - user clicked (or tapped) on the suggestion\n * 'enter' - user selected the suggestion using Enter\n */\n onSuggestionSelected(event, { suggestion, method }) {\n const { mode } = this.props.autocomplete;\n // If results are rendered, redirect to the result url and prevent search execution.\n if (mode === 'result' && (event.keyCode === 13 || method === 'click')) {\n event.preventDefault(); // don't submit the search query\n event.stopPropagation(); // don't bubble up event\n window.location.assign(suggestion.sm_urls[0]); // redirect to the selected item\n }\n }\n\n // Called every time you need to set suggestions to [].\n onSuggestionsClearRequested() {\n // TODO: JL added prop to short circuit clearing of suggestions\n if (!this.props.persist) {\n this.setState({\n suggestions: [],\n });\n }\n }\n\n // For search term autocomplete mode:\n // When user navigates the suggestions using the Up and Down keys,\n // the input value should be set according to the highlighted suggestion.\n getSuggestionValue(suggestion) {\n const { mode } = this.props.autocomplete;\n if (mode === 'result') return false;\n if (mode === 'term') {\n return suggestion.ss_federated_title; // @todo get the value of the term\n }\n return false;\n }\n\n // Gets search suggestions based on input.\n // @todo support different modes: term, results\n loadSuggestions(value) {\n // Run typeahead search query based on the autocomplete config and current value.\n this.props.onSuggest(this.props.query, this.props.autocomplete, value);\n }\n\n handleInputKeyDown(event) {\n // Call submit handler when enter is pressed while text input\n // has focused. This functionality is prevented by the\n // onSuggestionSelected method.\n if (event.keyCode === 13 && !event.defaultPrevented) {\n this.handleSubmit();\n }\n\n // Clear and close suggetsions.\n if (event.keyCode === 27) {\n this.onSuggestionsClearRequested();\n }\n }\n\n // Trigger search query execution by updating the current URL based\n // on current state.\n handleSubmit() {\n this.props.onChange(this.props.field, this.state.value);\n // Get existing querystring params.\n const parsed = queryString.parse(window.location.search);\n // Update the search querystring param with the value from the search field.\n parsed.search = this.state.value;\n const stringified = queryString.stringify(parsed);\n // Update the querystring params in the browser, add path to history.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method\n if (window.history.pushState) {\n const newUrl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${stringified}`;\n window.history.pushState({ path: newUrl }, '', newUrl);\n } else {\n window.location.search = stringified;\n }\n }\n\n // When the input is focused, Autosuggest will consult this function\n // when to render suggestions. Use it, for example, if you want to\n // display suggestions when input value is at least 2 characters long.\n shouldRenderSuggestions(value) {\n const numChars = this.props.autocomplete.numChars || 2;\n return value.trim().length > numChars;\n }\n\n renderSuggestionsContainer({ containerProps, children, query }) {\n const { mode } = this.props.autocomplete;\n const hasResultModeConfig = Object.hasOwnProperty.call(this.props.autocomplete, 'result');\n const hasTermModeConfig = Object.hasOwnProperty.call(this.props.autocomplete, 'term');\n const resultTitleText = hasResultModeConfig && this.props.autocomplete.result.titleText\n ? this.props.autocomplete.result.titleText\n : 'What are you looking for?';\n const resultShowDirectionsText = hasResultModeConfig\n && Object.hasOwnProperty.call(this.props.autocomplete.result, 'showDirectionsText')\n ? this.props.autocomplete.result.showDirectionsText\n : true;\n const termTitleText = hasTermModeConfig && this.props.autocomplete.term.titleText\n ? this.props.autocomplete.term.titleText\n : 'Suggested search terms';\n const termShowDirectionsText = hasTermModeConfig\n && Object.hasOwnProperty.call(this.props.autocomplete.term, 'showDirectionsText')\n ? this.props.autocomplete.term.showDirectionsText\n : true;\n\n const titleText = mode === 'term' ? termTitleText : resultTitleText;\n const directionsText = mode === 'term' ? termShowDirectionsText : resultShowDirectionsText;\n\n const suggestionsWrapperClasses = directionsText\n ? 'react-autosuggest__suggestions-itemslist-wrapper react-autosuggest__suggestions-itemslist-wrapper--with-directions'\n : 'react-autosuggest__suggestions-itemslist-wrapper';\n\n return (\n <section {...containerProps} className={containerProps.className + \" suggestions\"}>\n <h3 className=\"heading h6\">{titleText}</h3>\n {/* <button className=\"suggestions__close-button\" onClick={this.onSuggestionsClearRequested}>x</button> */}\n \n {children}\n \n {/* {% for suggestion in site.data.search.suggestions %}\n <li class=\"text\">\n <a href=\"{{ suggestion.url }}\">{{ suggestion.term }}</a>\n <span class=\"visually-hidden\">({{ forloop.index }} of {{ forloop.length }})</span>\n </li>\n {% endfor %} */}\n </section>\n\n\n // <div {...containerProps}>\n // <div className=\"react-autosuggest__container-title\">\n // {titleText}\n // <button className=\"react-autosuggest__container-close-button\" onClick={this.onSuggestionsClearRequested}>x</button>\n // </div>\n // <div className={suggestionsWrapperClasses}>\n // {children}\n // </div>\n // {/* @todo add logic for suggestion mode and alter directionsText accordingly */}\n // {directionsText &&\n // <div className=\"react-autosuggest__container-directions\">\n // <span className=\"react-autosuggest__container-directions-item\">Press <code>ENTER</code> to search for <strong>{query}</strong> or <code>ESC</code> to close.</span>\n // <span className=\"react-autosuggest__container-directions-item\">Press ↑ and ↓ to highlight a suggestion then <code>ENTER</code> to be redirected to that suggestion.</span>\n // </div>\n // }\n // </div>\n );\n }\n\n /**\n * Define how suggestions are rendered.\n * Note: must be a pure function.\n *\n * @param suggestion\n * The suggestion to render\n *\n * @param query\n * Used to highlight the matching string. As user types in the input,\n * query will be equal to the trimmed value of the input. Then, if user\n * interacts using the Up or Down keys, the input will get the value of\n * the highlighted suggestion, but query will remain to be equal to the\n * trimmed value of the input prior to the Up and Down interactions.\n *\n * unused - isHighlighted\n * Whether or not the suggestion is highlighted.\n *\n * @return a ReactElement\n */\n renderSuggestion(suggestion, { query }) {\n // Determine if we are returning results or terms. @todo or both\n const { mode } = this.props.autocomplete;\n // Decode any html entities that come from title.\n const decodedTitle = he.decode(suggestion.ss_federated_title);\n // Wrap the query partial string in <b>.\n const highlightedTitle = helpers.highlightText(decodedTitle, query);\n // Define a11y message i.e. (1 of 3) to append to suggestion text.\n const currentHumanIndex = this.state.suggestions.indexOf(suggestion) + 1;\n const suggestionsLength = this.state.suggestions.length;\n\n // Render plain text for search term suggestions.\n // @todo update this when we have a return structure for terms.\n if (mode === 'term') {\n return (<span>highlightedTitle</span>);\n }\n\n // Defaults to result based autosuggestion.\n // Render a link for search result suggestions.\n return (\n <a\n className=\"react-autosuggest__suggestion-link\"\n href={suggestion.sm_urls[0]}\n >\n {highlightedTitle}\n <span className=\"screen-hide\">\n {` (${currentHumanIndex} of ${suggestionsLength})`}\n </span>\n </a>\n );\n }\n\n // Wrap the input component with our expected wrapper.\n static renderInputComponent(inputProps) {\n return (\n <input {...inputProps} />\n );\n }\n\n render() {\n const { label, suggestQuery } = this.props;\n const { suggestions, value } = this.state;\n // Define props for autocomplete input element.\n const inputProps = {\n type: 'search',\n name: 'search',\n id: 'search',\n className: 'react-autosuggest__input',\n onChange: this.onChange,\n onKeyDown: this.handleInputKeyDown,\n value: value || '',\n role: 'combobox',\n 'aria-autocomplete': 'both',\n };\n\n return (\n <React.Fragment>\n <label htmlFor=\"search\">{label}</label>\n <fieldset>\n {/* @see: https://github.com/moroshko/react-autosuggest#react-autosuggest */}\n <Autosuggest\n focusInputOnSuggestionClick={false}\n getSuggestionValue={this.getSuggestionValue}\n inputProps={inputProps}\n onSuggestionsClearRequested={this.onSuggestionsClearRequested}\n onSuggestionsFetchRequested={this.onSuggestionsFetchRequested}\n onSuggestionSelected={this.onSuggestionSelected}\n renderInputComponent={FederatedTextSearchAsYouType.renderInputComponent}\n renderSuggestion={this.renderSuggestion}\n renderSuggestionsContainer={this.renderSuggestionsContainer}\n shouldRenderSuggestions={this.shouldRenderSuggestions}\n suggestQuery={suggestQuery}\n suggestions={suggestions}\n theme={{\n container: 'react-autosuggest__container',\n containerOpen: 'react-autosuggest__container--open',\n input: 'react-autosuggest__input react-autosuggest__input--open',\n inputOpen: 'react-autosuggest__input--open',\n inputFocused: 'react-autosuggest__input--focused',\n suggestionsContainer: 'react-autosuggest__suggestions-container',\n suggestionsContainerOpen: 'react-autosuggest__suggestions-container--open',\n suggestionsList: 'terms',\n suggestion: 'text',\n suggestionFirst: 'react-autosuggest__suggestion--first',\n suggestionHighlighted: 'react-autosuggest__suggestion--highlighted',\n sectionContainer: 'react-autosuggest__section-container',\n sectionContainerFirst: 'react-autosuggest__section-container--first',\n sectionTitle: 'react-autosuggest__section-title'\n }}\n />\n <button\n type=\"submit\"\n className=\"fs-search-form__submit\"\n onClick={e=> { e.preventDefault(); this.handleSubmit(e);}}\n >\n <span className=\"screen-hide\">Perform Search</span>\n <SearchIcon />\n </button>\n </fieldset>\n </React.Fragment>\n );\n }\n}\n\nFederatedTextSearchAsYouType.defaultProps = {\n label: 'Enter a search term',\n value: '',\n suggestQuery: {\n value: '',\n },\n};\n\nFederatedTextSearchAsYouType.propTypes = {\n autocomplete: PropTypes.oneOfType([\n PropTypes.shape({\n mode: PropTypes.string,\n method: PropTypes.string,\n url: PropTypes.string,\n queryField: PropTypes.string,\n suggestionRows: PropTypes.number,\n numChars: PropTypes.number,\n result: PropTypes.shape({\n titleText: PropTypes.string,\n showDirectionsText: PropTypes.bool,\n }),\n term: PropTypes.shape({\n titleText: PropTypes.string,\n showDirectionsText: PropTypes.bool,\n }),\n }),\n PropTypes.bool,\n ]).isRequired,\n field: PropTypes.string.isRequired,\n label: PropTypes.string,\n onChange: PropTypes.func.isRequired,\n onSuggest: PropTypes.func.isRequired,\n suggestQuery: PropTypes.shape({\n value: PropTypes.string,\n }),\n value: PropTypes.string,\n};\n\nexport default FederatedTextSearchAsYouType;\n","import React from 'react';\nimport FederatedTextSearchNoAutocomplete from './no-autocomplete';\nimport FederatedTextSearchAsYouType from './search-as-you-type';\n\nconst FederatedTextSearch = (props) => {\n const { autocomplete } = props;\n const InputComponent = autocomplete\n ? FederatedTextSearchAsYouType\n : FederatedTextSearchNoAutocomplete;\n return <InputComponent {...props} />;\n};\n\nexport default FederatedTextSearch;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport cx from 'classnames';\nimport AnimateHeight from 'react-animate-height';\nimport helpers from '../../helpers';\n\nclass FederatedListFacet extends React.Component {\n\n constructor(props) {\n super(props);\n\n this.state = {\n filter: '',\n truncateFacetListsAt: props.truncateFacetListsAt,\n };\n }\n\n handleClick(value) {\n const {\n foundIdx,\n parsed,\n isQsParamField,\n param,\n } = helpers.qs.getFieldQsInfo({\n field: this.props.field,\n values: this.props.value,\n value,\n });\n\n // Define var for new parsed qs params object.\n let newParsed = parsed;\n\n // If the clicked list facet field is one whose state is tracked in the qs.\n if (isQsParamField) {\n // If the click is adding the field value.\n if (foundIdx < 0) {\n // If there is already a qs param for this field value.\n if (param) {\n // Add value to parsed qs params.\n newParsed = helpers.qs.addValueToQsParam({\n field: this.props.field,\n value,\n param,\n parsed,\n });\n } else { // If there is not already a qs param for this field value.\n // Add new qs param for field + value.\n newParsed = helpers.qs.addQsParam({\n field: this.props.field,\n value,\n parsed,\n });\n }\n\n // Send new query based on app state.\n this.props.onChange(this.props.field, this.props.value.concat(value));\n } else { // If the click is removing this field value.\n // If their is already a qs param for this field value.\n if (param) {\n newParsed = helpers.qs.removeValueFromQsParam({\n field: this.props.field,\n value,\n param,\n parsed,\n });\n }\n\n // Send new query based on app state.\n this.props.onChange(this.props.field, this.props.value.filter((v, i) => i !== foundIdx));\n }\n\n helpers.qs.addNewUrlToBrowserHistory(newParsed);\n }\n }\n\n toggleExpand(hierarchyFacetValue) {\n this.props.onSetCollapse(this.props.field, !(this.props.collapse || false));\n // If this is a hierarchical list facet.\n if (hierarchyFacetValue) {\n // Determine the current state of the expanded hierarchical list facets.\n const indexOfExpandedHierarchyFacetValue = this.props.expandedHierarchies\n .indexOf(hierarchyFacetValue);\n if (indexOfExpandedHierarchyFacetValue > -1) {\n // This accordion is currently expanded, so collapse it.\n this.props.expandedHierarchies.splice(indexOfExpandedHierarchyFacetValue,1);\n } else {\n // This accordion is currently collapsed, so expand it.\n this.props.expandedHierarchies.push(hierarchyFacetValue);\n }\n }\n }\n\n render() {\n const {\n label,\n facets,\n field,\n value,\n collapse,\n hierarchy,\n options,\n } = this.props;\n const { truncateFacetListsAt } = this.state;\n\n const siteList = options.siteList;\n const facetCounts = facets.filter((facet, i) => i % 2 === 1);\n const facetValues = facets.filter((facet, i) => i % 2 === 0);\n // Create an object of facets {value: count} to keep consistent for inputs.\n const facetInputs = {};\n\n // Handle site name restrictions.\n if (field === 'sm_site_name' && siteList.length > 0) {\n facetValues.forEach((v, i) => {\n const key = facetValues[i];\n if (siteList.indexOf(v) > -1) {\n facetInputs[key] = facetCounts[i];\n }\n });\n // If only one option exists and nothing is selected, don't show it.\n if (value.length < 1 && Object.keys(facetInputs).length < 2) {\n return null;\n }\n }\n else {\n facetValues.forEach((v, i) => {\n const key = facetValues[i];\n facetInputs[key] = facetCounts[i];\n });\n }\n\n //This line controls default filter expansion \n const expanded = this.props.field ==\"sm_federated_type\" ? collapse : !collapse;\n const height = expanded ? 'auto' : 0;\n\n // If we need to generate multiple list-fact accordion groups\n // from this list-facet field (i.e. sm_federated_terms).\n if (hierarchy) {\n // Iterate through sm_federated_terms array of values.\n // Each value is a string with the format Type>Term.\n // Define array of types which will render as accordion li links.\n const types = [];\n // Define object to hold data for each type:\n // {\n // type: {\n // items: [{\n // term (the checkbox label),\n // facetValue (the checkbox value, Type>Term),\n // facetCount (the number of items with this value returned)\n // },...],\n // expanded: bool (whether or not this accordion is expanded)\n // },...\n // }\n const terms = {};\n facetValues.forEach((facetValue, i) => {\n // Create array of [Type, Term] from Type>Term.\n const pieces = facetValue.split('>');\n types.push(pieces[0]);\n // If we don't already have terms.Type then create it.\n if (!Object.hasOwnProperty.call(terms, pieces[0])) {\n terms[pieces[0]] = {};\n terms[pieces[0]].items = [];\n terms[pieces[0]].expanded = (this.props.expandedHierarchies.indexOf(pieces[0]) > -1);\n terms[pieces[0]].height = terms[pieces[0]].expanded ? 'auto' : 0;\n }\n // Add the object for this facet value to the array of terms for this type.\n terms[pieces[0]].items.push({\n term: pieces[1],\n facetValue,\n facetCount: facetCounts[i],\n });\n });\n\n // Remove duplicate types\n // So facet values of \"Condition>Bones\", \"Condition>Bone growth\" should only\n // Add \"Condition\" type once so we only render 1 Condition accordion group.\n const uniqueTypes = types.filter((v, i, self) => self.indexOf(v) === i).filter(String);\n\n // Define array of accordion Lis which we'll populate with react fragments.\n const listFacetHierarchyLis = [];\n // Define array of checkbox Lis which we'll populate with react fragments, per type.\n const listFacetHierarchyTermsLis = [];\n // Iterate through types (accordion lis).\n uniqueTypes.forEach((type, i) => {\n // Populate the checkbox lis react fragments for each type.\n listFacetHierarchyTermsLis[type] = [];\n terms[type].items.forEach((termObj, i) => termObj.facetCount\n && listFacetHierarchyTermsLis[type].push(<li className=\"fs-search-accordion__content-item\" key={`${termObj.term}_${termObj.facetValue}_${i}`}>\n <label className=\"fs-search-accordion__checkbox-label\">\n <input\n type=\"checkbox\"\n name={type}\n className=\"fs-search-accordion__checkbox-input\"\n value={termObj.facetValue}\n checked={value.indexOf(termObj.facetValue) > -1}\n onChange={() => this.handleClick(termObj.facetValue)}\n /> {termObj.term}\n <span className=\"facet-item-amount\"> ({termObj.facetCount}\n <span className=\"screen-hide\">results</span>)\n </span>\n </label>\n </li>));\n\n // Populate the accordion lis array with all of its checkboxes.\n listFacetHierarchyTermsLis[type].length && listFacetHierarchyLis.push(\n <li className=\"fs-search-accordion__content-item\" id={`solr-list-facet-${type}`} key={`solr-list-facet-${type}-${i}`}>\n <div\n tabIndex=\"0\"\n className={cx('fs-search-accordion__title', { 'js-fs-search-accordion-open': terms[type].expanded })}\n id={label.replace(/\\s+/g, '-').toLowerCase()}\n onClick={this.toggleExpand.bind(this, type)}\n onKeyDown={(event) => {\n if (event.keyCode === 13) {\n this.toggleExpand(type);\n }\n }}\n >\n <span className=\"screen-hide\">Toggle filter group for</span> {type}\n </div>\n <AnimateHeight\n duration={600}\n height={terms[type].height}\n >\n <ul className=\"fs-search-accordion__content\" key={`solr-list-facet-${type}-ul`}>\n {listFacetHierarchyTermsLis[type]}\n </ul>\n </AnimateHeight>\n </li>);\n });\n // Render the group of accordion lis with their facet value checkbox lists.\n return listFacetHierarchyLis;\n }\n // This is not a hierarchy of accordion groups,\n // just render the single list-facet accordion.\n return (\n <li className=\"fs-search-accordion__group-item\" id={`solr-list-facet-${field}`}>\n <div\n tabIndex=\"0\"\n className={cx('fs-search-accordion__title', { 'js-fs-search-accordion-open': expanded })}\n id={label.replace(/\\s+/g, '-').toLowerCase()}\n onClick={this.toggleExpand.bind(this)}\n onKeyDown={(event) => {\n if (event.keyCode === 13) {\n this.toggleExpand();\n }\n }}\n >\n <span className=\"screen-hide\">Toggle filter group for</span> {label}\n </div>\n <AnimateHeight\n duration={600}\n height={height}\n >\n <ul className=\"fs-search-accordion__content\" key={`solr-list-facet-${field}-ul`}>\n {facetValues.filter((facetValue, i) => facetInputs[facetValue] > 0\n && (truncateFacetListsAt < 0 || i < truncateFacetListsAt))\n .map((facetValue, i) => {\n if (this.state.filter.length === 0\n || facetValue.toLowerCase().indexOf(this.state.filter.toLowerCase()) > -1) {\n return (\n <li className=\"fs-search-accordion__content-item\" key={`${facetValue}_${facetInputs[facetValue]}`}>\n <label className=\"fs-search-accordion__checkbox-label\">\n <input\n type=\"checkbox\"\n name={field}\n value={facetValue}\n checked={value.indexOf(facetValue) > -1}\n onChange={() => this.handleClick(facetValue)}\n /> {facetValue} ({facetInputs[facetValue]})\n </label>\n </li>\n );\n }\n return null;\n })}\n </ul>\n </AnimateHeight>\n </li>\n );\n }\n}\n\nFederatedListFacet.defaultProps = {\n hierarchy: false,\n expandedHierarchies: [],\n value: [],\n};\n\nFederatedListFacet.propTypes = {\n bootstrapCss: PropTypes.bool,\n children: PropTypes.array,\n collapse: PropTypes.bool,\n expandedHierarchies: PropTypes.array,\n facetSort: PropTypes.string,\n facets: PropTypes.array.isRequired,\n field: PropTypes.string.isRequired,\n hierarchy: PropTypes.bool,\n label: PropTypes.string,\n onChange: PropTypes.func,\n onFacetSortChange: PropTypes.func,\n onSetCollapse: PropTypes.func,\n query: PropTypes.object,\n truncateFacetListsAt: PropTypes.number,\n value: PropTypes.array,\n};\n\nexport default FederatedListFacet;\n","import PropTypes from 'prop-types';\nimport React from \"react\";\nimport cx from \"classnames\";\nimport moment from \"moment\";\nimport 'react-dates/initialize';\nimport { DateRangePicker } from 'react-dates';\nimport AnimateHeight from 'react-animate-height';\n\nclass FederatedRangeFacet extends React.Component {\n\n constructor(props) {\n super(props);\n\n this.state = {\n filter: \"\",\n truncateFacetListsAt: props.truncateFacetListsAt,\n startDate: null,\n endDate: null,\n focusedInput: null,\n };\n }\n\n toggleExpand() {\n this.props.onSetCollapse(this.props.field, !(this.props.collapse || false));\n }\n\n handleCalendarClose(value) {\n // If there are not start/end dates, we've likely just cleared them, so update props.\n if (value.startDate !== null && value.endDate !== null) {\n // The default time is noon, so start date should start at midnight.\n const momentToSolrStart = moment(value.startDate).subtract({hours:12}).format(\"YYYY-MM-DDTHH:mm:ss\") + 'Z';\n // The default time is noon, so end date should end at 11:59:59.\n const momentToSolrEnd = moment(value.endDate).add({hours:11, minutes:59, seconds: 59}).format(\"YYYY-MM-DDTHH:mm:ss\") + 'Z';\n this.props.onChange(this.props.field, [momentToSolrStart, momentToSolrEnd]);\n }\n }\n\n handleDatesChange(startDate,endDate) {\n this.setState({startDate, endDate});\n // If there are no start/end dates, something has just cleared them, so update props.\n if (startDate === null && endDate === null) {\n this.props.onChange(this.props.field, []);\n }\n }\n\n // See: https://reactjs.org/docs/react-component.html#the-component-lifecycle\n componentDidUpdate(nextProps) {\n // Clear component inputs when rangeFacet value transitions from populated->empty.\n if (this.props.value.length && !nextProps.value.length) {\n this.setState({\n startDate: null,\n endDate: null\n });\n }\n }\n\n render() {\n const {label, facets, field, collapse } = this.props;\n\n const expanded = !(collapse || false);\n const height = expanded ? 'auto' : 0;\n\n // Set better react date props for responsive behavior.\n // See: https://github.com/airbnb/react-dates/issues/262\n let calendarOrientation = undefined; // prop will not be added unless set.\n let calendarFullScreen = undefined; // prop will not be added unless set.\n let calendarMonths = 2; // view 2 months on large screens\n // When viewing 2 months, the last month should be the current.\n let getLastMonth = () => moment().subtract(1, 'months');\n\n // Set prop values for mobile.\n if (window.matchMedia(\"(max-width: 600px)\").matches) {\n /* the viewport is less than 600 pixels wide */\n calendarMonths = 1;\n calendarOrientation = \"vertical\";\n calendarFullScreen = true;\n getLastMonth = undefined; // prop will not be added on mobile.\n }\n\n return (\n <li className=\"fs-search-accordion__group-item\" id={`solr-list-facet-${field}`}>\n <div\n tabIndex=\"0\"\n className={cx(\"fs-search-accordion__title\", {\"js-fs-search-accordion-open\": expanded})}\n id={label.replace(/\\s+/g, '-').toLowerCase()}\n onClick={this.toggleExpand.bind(this)}\n onKeyDown={(event)=>{if (event.keyCode === 13) {this.toggleExpand()}}}\n >{label}</div>\n <AnimateHeight\n duration={600}\n height={height}\n >\n <ul className=\"fs-search-accordion__content\">\n <li className=\"fs-search-accordion__content-item\">\n {/* See: https://github.com/airbnb/react-dates#daterangepicker */}\n <DateRangePicker\n startDate={this.state.startDate} // momentPropTypes.momentObj or null,\n startDateId=\"solr-start-date\" // PropTypes.string.isRequired,\n endDate={this.state.endDate} // momentPropTypes.momentObj or null,\n endDateId=\"solr-end-date\" // PropTypes.string.isRequired,\n onDatesChange={({ startDate, endDate }) => this.handleDatesChange(startDate,endDate)} // PropTypes.func.isRequired,\n focusedInput={this.state.focusedInput} // PropTypes.oneOf([START_DATE, END_DATE]) or null,\n onFocusChange={focusedInput => this.setState({ focusedInput })} // PropTypes.func.isRequired,\n isOutsideRange={(day) => {\n const today = moment().format('YYYY-MM-DD');\n return day.diff(today, 'days') > 0 || moment(day).isBefore(facets[0])\n }} // allow only past dates & dates after earliest facet value\n minimumNights={0} // allow just 1 day (same start/end date)\n small={true} // use the smaller theme\n showClearDates // show the clear dates button\n onClose={(value)=> this.handleCalendarClose(value)}\n // custom phrases for screenreader\n phrases={{\n calendarLabel: \"Calendar\",\n chooseAvailableStartDate: ({ date }) => `Choose ${date} as your search filter start date.`,\n chooseAvailableEndDate: ({ date }) => `Choose ${date} as your search filter end date.`,\n clearDates: \"Clear Dates\",\n closeDatePicker: \"Close\",\n dateIsSelected: ({ date }) => `You have selected ${date}.`,\n dateIsUnavailable: ({ date }) => `Sorry, ${date} is unavailable.`,\n enterKey: \"Enter key\",\n escape: \"Escape key\",\n focusStartDate: \"Interact with the calendar and add the check-in date for your trip.\",\n hideKeyboardShortcutsPanel: \"Close the shortcuts panel.\",\n homeEnd: \"Home and end keys\",\n jumpToNextMonth: \"Move forward to switch to the next month.\",\n jumpToPrevMonth: \"Move backward to switch to the previous month.\",\n keyboardNavigationInstructions: \"Press the down arrow key to interact with the calendar and\\n select a date. Press the question mark key to get the keyboard shortcuts for changing dates.\",\n keyboardShortcuts: \"Keyboard Shortcuts\",\n leftArrowRightArrow: \"Right and left arrow keys\",\n moveFocusByOneDay: \"Move backward (left) and forward (right) by one day.\",\n moveFocusByOneMonth: \"Switch months.\",\n moveFocusByOneWeek: \"Move backward (up) and forward (down) by one week.\",\n moveFocustoStartAndEndOfWeek: \"Go to the first or last day of a week.\",\n openThisPanel: \"Open this panel.\",\n pageUpPageDown: \"page up and page down keys\",\n questionMark: \"Question mark\",\n returnFocusToInput: \"Return to the date input field.\",\n selectFocusedDate: \"Select the date in focus.\",\n showKeyboardShortcutsPanel: \"Open the keyboard shortcuts panel.\",\n upArrowDownArrow: \"up and down arrow keys\"\n }}\n // > mobile only props\n initialVisibleMonth={getLastMonth} // large viewports only\n // mobile only props\n numberOfMonths={calendarMonths} // view one month at a time\n orientation={calendarOrientation} // use vertical orientation\n withFullScreenPortal={calendarFullScreen} // use full screen\n />\n </li>\n </ul>\n </AnimateHeight>\n </li>\n );\n }\n}\n\nFederatedRangeFacet.defaultProps = {\n value: []\n};\n\nFederatedRangeFacet.propTypes = {\n bootstrapCss: PropTypes.bool,\n children: PropTypes.array,\n collapse: PropTypes.bool,\n facetSort: PropTypes.string,\n facets: PropTypes.array.isRequired,\n field: PropTypes.string.isRequired,\n label: PropTypes.string,\n onChange: PropTypes.func,\n onFacetSortChange: PropTypes.func,\n onSetCollapse: PropTypes.func,\n query: PropTypes.object,\n truncateFacetListsAt: PropTypes.number,\n value: PropTypes.array\n};\n\nexport default FederatedRangeFacet;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport cx from 'classnames';\nimport AnimateHeight from 'react-animate-height';\n\n\nclass FederatedSearchFieldContainer extends React.Component {\n constructor(props) {\n super(props);\n\n // This will return the width of the viewport.\n let intFrameWidth = window.innerWidth;\n\n this.state = {\n // Filters are visible for large / hidden for small screens by default.\n expanded: intFrameWidth > 900,\n };\n\n this.handleClick = this.handleClick.bind(this);\n\n window.addEventListener('resize', () => {\n // Desktop height.\n let height = 'auto';\n // In mobile view, when resized, lets close things.\n if (window.innerWidth < 900) {\n height = 0;\n }\n this.setState({\n expanded: height,\n });\n });\n }\n\n handleClick() {\n this.setState({\n expanded: !this.state.expanded,\n });\n }\n\n render() {\n const { onNewSearch } = this.props;\n const height = this.state.expanded ? \"auto\" : 0;\n\n console.log(this.props.resultsCount);\n // fs-search-filters__form\n return (\n <div className=\"fs-search-filters\">\n <button\n className={cx(\"fs-search-filters__trigger\", {\n \"js-fs-search-filters-open\": this.state.expanded,\n })}\n onClick={this.handleClick}\n >\n {this.props.title ? this.props.title : \"Filter Results\"}\n </button>\n <AnimateHeight duration={450} height={height}>\n\n <form className=\"fs-search-filters__form\">\n <h2 className=\"fs-search-filters__title\" id=\"fs-section-title\">\n {this.props.title ? this.props.title : \"Filter results by\"}\n </h2>\n\n <section\n className=\"fs-search-accordion\"\n aria-labelledby=\"fs-section-title\"\n >\n {this.props.resultsCount > 0 ? (\n <ul className=\"fs-search-accordion__group\">\n {this.props.children}\n </ul>\n ) : (\n <div className=\"fs-search-filters__no-results\">\n There are no results to filter.\n </div>\n )}\n </section>\n\n {this.props.resultsCount > 0 ? (\n <div className=\"fs-search-filters__row\">\n <button\n className=\"fs-search-filters__reset btn-tertiary\"\n type=\"button\"\n onClick={onNewSearch}\n >\n Clear All\n </button>\n </div>\n ) : null}\n </form>\n </AnimateHeight>\n </div>\n );\n }\n}\n\nFederatedSearchFieldContainer.propTypes = {\n children: PropTypes.array,\n onNewSearch: PropTypes.func,\n title: PropTypes.string\n};\n\nexport default FederatedSearchFieldContainer;\n","import PropTypes from 'prop-types';\nimport React from \"react\";\n\nclass FederatedResultList extends React.Component {\n\n\trender() {\n\t\treturn (\n\t\t\t<React.Fragment>\n\t\t\t\t<h2 className=\"screen-hide\">Search results</h2>\n\t\t\t\t<ul className=\"fs-search-results search-card-wrapper\">\n\t\t\t\t\t{this.props.children}\n\t\t\t\t</ul>\n\t\t\t</React.Fragment>\n\t\t);\n\t}\n}\n\nFederatedResultList.propTypes = {\n\tchildren: PropTypes.array\n};\n\nexport default FederatedResultList;\n","/**\n * Defines react components from chevron svgs (see styleguide/src/includes/svg)\n * @todo consider using an svg loader package (i.e. https://www.npmjs.com/package/react-svg-loader) to import and return the svg elements directly vs duplicating markup\n */\n\nimport React from \"react\";\n\nconst DoubleChevronLeft = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M16.1 4.5c.4.4.5 1 0 1.6L12.3 10l3.7 3.9c.5.5.4 1.1 0 1.6-.4.4-1.2.4-1.6 0-.4-.4-4.5-4.7-4.5-4.7-.2-.2-.3-.5-.3-.8s.1-.6.3-.8c0 0 4.1-4.3 4.5-4.7.5-.4 1.2-.4 1.7 0z\"/><path d=\"M10.1 4.5c.4.4.5 1 0 1.6L6.3 10l3.7 3.9c.5.5.4 1.1 0 1.6-.4.4-1.2.4-1.6 0-.4-.4-4.5-4.7-4.5-4.7-.2-.2-.3-.5-.3-.8s.1-.6.3-.8c0 0 4.1-4.3 4.5-4.7.5-.4 1.2-.4 1.7 0z\"/></svg>\n);\n\nconst ChevronLeft = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M12.452 4.516c.446.436.481 1.043 0 1.576L8.705 10l3.747 3.908c.481.533.446 1.141 0 1.574-.445.436-1.197.408-1.615 0-.418-.406-4.502-4.695-4.502-4.695a1.095 1.095 0 0 1 0-1.576s4.084-4.287 4.502-4.695c.418-.409 1.17-.436 1.615 0z\"/></svg>\n);\n\nconst ChevronRight = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M9.163 4.516c.418.408 4.502 4.695 4.502 4.695a1.095 1.095 0 0 1 0 1.576s-4.084 4.289-4.502 4.695c-.418.408-1.17.436-1.615 0-.446-.434-.481-1.041 0-1.574L11.295 10 7.548 6.092c-.481-.533-.446-1.141 0-1.576.445-.436 1.197-.409 1.615 0z\"/></svg>\n);\n\nconst DoubleChevronRight = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\"><path d=\"M5.6 4.5c.4.4 4.5 4.7 4.5 4.7.2.2.3.5.3.8s-.1.6-.3.8c0 0-4.1 4.3-4.5 4.7-.4.4-1.2.4-1.6 0-.4-.4-.5-1 0-1.6L7.7 10 3.9 6.1c-.4-.5-.4-1.1 0-1.6.5-.4 1.2-.4 1.7 0z\"/><path d=\"M11.6 4.5c.4.4 4.5 4.7 4.5 4.7.2.2.3.5.3.8s-.1.6-.3.8c0 0-4.1 4.3-4.5 4.7-.4.4-1.2.4-1.6 0-.4-.4-.5-1 0-1.6l3.7-3.9-3.8-3.9c-.4-.5-.4-1.1 0-1.6.5-.4 1.2-.4 1.7 0z\"/></svg>\n);\n\nconst ArrowRight = () => (\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m14.7071068 2.29289322 9.1923881 9.19238818v1.0294372l-9.1923881 9.1923882-1.4142136-1.4142136 7.2921068-7.2928932h-20.585v-2h20.585l-7.2921068-7.29289322z\"/></svg>\n)\n\nconst ArrowLeft = () => (\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M9.2,21.7L0,12.5l0-1l9.2-9.2l1.4,1.4L3.3,11h20.6v2H3.3l7.3,7.3L9.2,21.7z\"/></svg>\n)\n\nexport {DoubleChevronLeft, ChevronLeft, ChevronRight, DoubleChevronRight, ArrowRight, ArrowLeft};\n","import PropTypes from 'prop-types';\nimport React from \"react\";\nimport cx from \"classnames\";\nimport {DoubleChevronLeft, ChevronLeft, ChevronRight, DoubleChevronRight, ArrowLeft, ArrowRight} from \"../icons/chevrons\";\n\nclass FederatedPagination extends React.Component {\n\n onPageChange(page, pageAmt) {\n if (page >= pageAmt || page < 0) { return; }\n this.props.onChange(page);\n\n if(document.getElementById(\"stat\") != null) {\n document.getElementById(\"stat\").focus({preventScroll: false});\n }\n }\n\n buildHandleEnterKeyPress = (onClick) => ({ key }) => {\n if (key === 'Enter') {\n onClick();\n }\n };\n\n renderPage(page, currentPage, key) {\n let isCurrentPage = page === currentPage;\n return (\n <li className={cx(\"pagination__control tag\", (isCurrentPage ? 'is-active' : 'not-active'))} key={key}>\n <button className={cx(\"pagination__control-button pagination__control-button--number\")} tabIndex=\"0\" onClick={this.onPageChange.bind(this, page)} onKeyPress={this.buildHandleEnterKeyPress(this.onPageChange.bind(this, page))} title={isCurrentPage ? \"Current page\" : `Go to page ${page + 1}`} aria-current={isCurrentPage ? page + 1 : undefined}>\n <span className=\"screen-hide\">Page</span>{page + 1}\n </button>\n </li>\n );\n }\n\n render() {\n const { query, results } = this.props;\n const { start, rows } = query;\n const { numFound } = results;\n const pageAmt = Math.ceil(numFound / rows);\n const currentPage = start / rows;\n const numButtons = this.props.options.paginationButtons || 5;\n\n if (numFound === 0) {\n return (\"\");\n }\n\n let rangeStart = currentPage - 2 < 0 ? 0 : currentPage - 2;\n let rangeEnd = rangeStart + numButtons > pageAmt ? pageAmt : rangeStart + numButtons;\n\n if (rangeEnd - rangeStart < numButtons && rangeStart > 0) {\n rangeStart = rangeEnd - numButtons;\n if (rangeStart < 0) { rangeStart = 0; }\n }\n\n let pages = [];\n for (let page = rangeStart; page < rangeEnd; page++) {\n if (pages.indexOf(page) < 0) {\n pages.push(page);\n }\n }\n\n let firstPageHidden = (currentPage === 0);\n let prevPageHidden = (currentPage - 1 < 0);\n let nextPageHidden = (currentPage + 1 >= pageAmt);\n let lastPageHidden = (pageAmt === 0 || currentPage === pageAmt - 1);\n\n return (\n <nav className=\"pagination\" role=\"navigation\" aria-labelledby=\"pagination__heading\">\n <h4 id=\"pagination__heading\" className=\"screen-hide\">Pagination</h4>\n <ul className=\"pagination__controls\">\n <li className={cx(\"pagination__control pagination__control--first\")} key=\"start\">\n <button className={cx(\"pagination__control-button pagination__control-button--first\", {\"screen-hide\": firstPageHidden})} tabIndex={firstPageHidden ? \"-1\" : \"0\"} onClick={this.onPageChange.bind(this, 0)} onKeyPress={ this.buildHandleEnterKeyPress(this.onPageChange.bind(this, 0)) } title=\"Go to first page\">\n <span className=\"screen-hide\">First page</span>\n <span aria-hidden={firstPageHidden ? \"true\" : \"false\"}>\n <DoubleChevronLeft/>\n </span>\n </button>\n </li>\n <li className={cx(\"pagination__control pagination__control--previous\")} key=\"prev\">\n <button className={cx(\"pagination__control-button pagination__control-button--prev\", {\"screen-hide\": prevPageHidden})} tabIndex={prevPageHidden ? \"-1\" : \"0\"} onClick={this.onPageChange.bind(this, currentPage - 1)} onKeyPress={ this.buildHandleEnterKeyPress(this.onPageChange.bind(this, currentPage - 1)) }title=\"Go to previous page\" rel=\"previous\">\n <span className=\"screen-hide\">Previous page</span>\n <span aria-hidden={prevPageHidden ? \"true\" : \"false\"}>\n <ArrowLeft/>\n </span>\n </button>\n </li>\n <li>\n <ul className=\"pagination__controls tags\">\n {pages.map((page, idx) => this.renderPage(page, currentPage, idx))}\n </ul>\n </li>\n <li className={cx(\"pagination__control pagination__control--next\")} key=\"next\">\n <button className={cx(\"pagination__control-button pagination__control-button--next\", {\"screen-hide\": nextPageHidden})} tabIndex={nextPageHidden ? \"-1\" : \"0\"} onClick={this.onPageChange.bind(this, currentPage + 1, pageAmt)} onKeyPress={ this.buildHandleEnterKeyPress(this.onPageChange.bind(this, currentPage + 1, pageAmt)) } title=\"Go to next page\" rel=\"next\">\n <span className=\"screen-hide\">Next page</span>\n <span aria-hidden={nextPageHidden ? \"true\" : \"false\"}>\n <ArrowRight/>\n </span>\n </button>\n </li>\n <li className={cx(\"pagination__control pagination__control--last\")} key=\"end\">\n <button className={cx(\"pagination__control-button pagination__control-button--last\", {\"screen-hide\": lastPageHidden})} tabIndex={lastPageHidden ? \"-1\" : \"0\"} onClick={this.onPageChange.bind(this, pageAmt - 1)} onKeyPress={ this.buildHandleEnterKeyPress(this.onPageChange.bind(this, pageAmt - 1)) } title=\"Go to last page\">\n <span className=\"screen-hide\">Last page</span>\n <span aria-hidden={lastPageHidden ? \"true\" : \"false\"}>\n <DoubleChevronRight/>\n </span>\n </button>\n </li>\n </ul>\n </nav>\n );\n }\n}\n\nFederatedPagination.propTypes = {\n onChange: PropTypes.func,\n query: PropTypes.object,\n results: PropTypes.object\n};\n\nexport default FederatedPagination;\n","import PropTypes from 'prop-types';\nimport React from 'react';\nimport { LiveMessage } from 'react-aria-live';\n\nfunction searchResultsStat(currentPage, numFound, rows, pageAmt, noResultsText, termValue) {\n // Set visible and a11y message based on query results.\n let message = '';\n let a11yMessage = '';\n if (numFound > rows) { // Many pages\n a11yMessage = `Showing page ${currentPage + 1} of ${pageAmt} (${numFound} results).`;\n message = (\n <span>Showing page\n <b> {currentPage + 1}</b> of\n <b> {pageAmt}</b> of <b>{numFound}</b> results\n </span>\n );\n } else if (numFound <= rows && numFound > 1) { // Single page\n a11yMessage = `Showing ${numFound} results.`;\n message = (<span>Showing <b>{numFound}</b> results.</span>);\n } else if (numFound === 1) { // Single item\n a11yMessage = `Showing ${numFound} result.`;\n message = (<span>Showing <b>{numFound}</b> result.</span>);\n } else if (numFound === 0) { // No results\n // noResultsText is set in the Federated Search Drupal Module\n message = \"\";\n a11yMessage = message;\n }\n // Don't announce total results when wildcard query sent on term clear.\n a11yMessage = termValue ? a11yMessage : '';\n return (\n <React.Fragment>\n <LiveMessage message={a11yMessage} aria-live=\"polite\" />\n <p id=\"stat\" tabIndex=\"-1\" className=\"fs-search-results-stat\">{message}</p>\n </React.Fragment>\n );\n}\n\nclass FederatedCountLabel extends React.Component {\n render() {\n const {\n numFound,\n start,\n rows,\n noResultsText,\n termValue,\n } = this.props;\n const currentPage = start / rows;\n const pageAmt = Math.ceil(numFound / rows);\n return (\n <React.Fragment>\n {searchResultsStat(currentPage, numFound, rows, pageAmt, noResultsText, termValue)}\n </React.Fragment>\n );\n }\n}\n\nFederatedCountLabel.propTypes = {\n numFound: PropTypes.number.isRequired,\n start: PropTypes.number.isRequired,\n rows: PropTypes.number,\n};\n\nFederatedCountLabel.defaultProps = {\n start: 0,\n};\n\nexport default FederatedCountLabel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport queryString from 'query-string';\nimport moment from 'moment';\nimport { LiveMessenger } from 'react-aria-live';\nimport helpers from '../../helpers';\n\n\n// Create dumb component which can be configured by props.\nconst FacetType = props => (\n <button className=\"fs-applied-filters__filter\" key={props.id} onClick={props.onClick}>\n <span className=\"screen-hide\">\n Remove filter\n </span>\n {props.children}\n </button>\n);\n\n// Configure and render the FacetType component to render as list facet type.\nclass ListFacetType extends React.Component {\n removeListFacetValue(field, values, value) {\n this.props.announcePolite(`Removed ${field.value} filter.`);\n\n const {\n foundIdx,\n parsed,\n isQsParamField,\n param,\n } = helpers.qs.getFieldQsInfo({\n field,\n values,\n value,\n });\n\n // Confirm the field value is set in state.\n if (foundIdx > -1) {\n // If the field is one whose state is tracked in qs and there is currently a param for it.\n if (isQsParamField && param) {\n const newParsed = helpers.qs.removeValueFromQsParam({\n field,\n value,\n param,\n parsed,\n });\n\n helpers.qs.addNewUrlToBrowserHistory(newParsed);\n }\n\n // Send query based on new state.\n this.props.onChange(field, values.filter((v, i) => i !== foundIdx));\n }\n }\n\n render() {\n const { searchField } = this.props;\n return (searchField.value.map((val, i) => (\n <FacetType\n key={i}\n id={i}\n onClick={() => this.removeListFacetValue(searchField.field, searchField.value, val)}\n >\n {/* Add spacing to hierarchical facet values: Type>Term = Type > Term. */}\n {val.replace('>', ' > ')}\n </FacetType>\n )));\n }\n}\n\n// Configure and render the FacetType component to render as range facet type.\nclass RangeFacetType extends React.Component {\n removeRangeFacetValue(field) {\n this.props.announcePolite(`Removed ${field.value} filter.`);\n this.props.onChange(field, []);\n }\n\n render() {\n const { searchField } = this.props;\n // Create a moment from the search start date.\n const start = moment(searchField.value[0]);\n // Use UTC.\n start.utc();\n // Create a formatted string from start date.\n const startFormatted = start.format('MM/DD/YYYY');\n // Create a moment from search end date.\n const end = moment(searchField.value[1]);\n // Use utc.\n end.utc();\n // Create a formatted string from end date.\n const endFormatted = end.format('MM/DD/YYYY');\n // Determine if we chose the same or different start / end dates.\n const diff = start.diff(end, 'days');\n // Only show the start date if the same date were chosen, otherwise: start - end.\n const filterValue = diff ? `${startFormatted} - ${endFormatted}` : startFormatted;\n return (\n <FacetType onClick={() => this.removeRangeFacetValue(searchField.field)}>\n {filterValue}\n </FacetType>\n );\n }\n}\n\n// Configure and render the FacetType component to render as text facet type.\nclass TextFacetType extends React.Component {\n removeTextValue(field) {\n this.props.announcePolite(`Removed search term ${field.value}.`);\n // Setting this to '' or \"\" throws a fatal error.\n this.props.onChange(field, null);\n // Get current querystring params.\n const parsed = queryString.parse(window.location.search);\n // Remove the search term param, if it exists.\n if (parsed.search) {\n delete parsed.search;\n }\n const stringified = queryString.stringify(parsed);\n // Update the querystring params in the browser, add path to history.\n // See: https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState()_method\n if (window.history.pushState) {\n if (stringified) {\n const newurl = `${window.location.protocol}//${window.location.host}${window.location.pathname}?${stringified}`;\n window.history.pushState({ path: newurl }, '', newurl);\n } else {\n const newurl = `${window.location.protocol}//${window.location.host}${window.location.pathname}`;\n window.history.pushState({ path: newurl }, '', newurl);\n }\n } else {\n window.location.search = stringified;\n }\n }\n\n render() {\n const { searchField } = this.props;\n return (\n <FacetType onClick={() => this.removeTextValue(searchField.field)}>\n {searchField.value}\n </FacetType>\n );\n }\n}\n\nclass FederatedCurrentQuery extends React.Component {\n render() {\n const { query } = this.props;\n\n const fields = query.searchFields.filter(searchField => searchField.value\n && searchField.value.length > 0);\n\n // Create a map of known facet type child components which can be rendered dynamically.\n const facetTypes = {\n 'list-facet': ListFacetType,\n 'range-facet': RangeFacetType,\n text: TextFacetType,\n };\n\n return (\n <LiveMessenger>\n {({ announcePolite }) => (\n <React.Fragment>\n {fields.length > 0 && // Only render this if there are filters applied.\n <div className=\"fs-applied-filters\">\n <h2 className=\"screen-hide\">\n Currently Applied Search Filters.\n </h2>\n <p className=\"screen-hide\">\n Click a filter to remove it from your search query.\n </p>\n {/* Only render the values for visible facets / filters */}\n {fields.filter(searchField => !searchField.isHidden).map((searchField, i) => {\n // Determine which child component to render.\n const MyFacetType = facetTypes[searchField.type];\n return (\n <MyFacetType\n {...this.props}\n key={i}\n searchField={searchField}\n announcePolite={announcePolite}\n />\n );\n })}\n </div>\n }\n </React.Fragment>\n )}\n </LiveMessenger>\n );\n }\n}\n\nFederatedCurrentQuery.propTypes = {\n onChange: PropTypes.func,\n query: PropTypes.object,\n};\n\nexport default FederatedCurrentQuery;\n","import PropTypes from 'prop-types';\nimport React, {useState} from \"react\";\nimport Select from 'react-select';\n\nclass FederatedSortMenu extends React.Component {\n\tconstructor(props) {\n\t\tsuper(props);\n \tthis.onSelect = this.onSelect.bind(this);\n\t\tthis.options = [];\n\t}\n\n\tonSelect({value}) {\n\t// \tdebugger\n\t// this.setState({sort: event.target.value});\n\n\t \tconst sortField = value;\n\t\tconst result = this.props.sortFields.find( ( { field } ) => field === sortField );\n\n\t\t// let order = result.order ?result.order : \"desc\"\n\t\t// this.setState({\n\t\t// \tsort: sortField,\n\t\t// \torder: order\n\t\t// },()=>{\n\t\t\tthis.props.onChange(result.field, result.order);\n\t\t// })\n\t}\n\n\tcomponentDidMount() {\n\t\t// call api or anything\n\t\tconsole.log(\"Component has been rendered\");\n\t}\n\n\t// componentDidUpdate(prevProps, prevState){\n\t// \tif (this.props.defaultSort !== prevProps.defaultSort){\n\t// \t\tthis.setState({sort: this.props.defaultSort} )\n\t// \t}\n\t//}\n\tonTestChange(option) {\n\t\tconsole.log(option)\n\t}\n\n\trender() {\n\t\tconst { sortFields } = this.props;\n\t\tif (sortFields.length === 0) { return null; }\n\t\tconst result = this.props.sortFields.find( ( { value } ) => !!value );\n\n\t\tsortFields.map((sortField) => {\n\t\t\tconst { field, label } = sortField\n\t\t\tconst result = this.options.find((option) => option.value === field);\n\t\t\tif(!result) {\n\t\t\t\tthis.options.push({\n\t\t\t\t\tvalue: field,\n\t\t\t\t\tlabel: label\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\tconst customDropdownStyles = {\n\t\t\tcontrol: styles => ({ \n\t\t\t\t...styles, \n\t\t\t\tbackgroundColor: '#fff',\n\t\t\t\tborderColor: '#6D6D6D',\n\t\t\t\tfontSize: '1rem',\n\t\t\t\tborderRadius: '0.25rem',\n\t\t\t\tpadding: '0.5rem'\n\t\t\t}),\n\t\t\tcontainer: styles => ({\n\t\t\t\t...styles, \n\t\t\t\tminWidth: \"11.75rem\",\n\t\t\t\t\"&:focus-visible\": {\n\t\t\t\t\tborder: \"0.125rem solid #553178\",\n\t\t\t\t\toutline: 'none'\n\t\t\t\t},\n\t\t\t\t\"@media only screen and (max-width: 768px)\": {\n\t\t\t\t\t...styles[\"@media only screen and (max-width: 768px)\"],\n\t\t\t\t\tminWidth: \"100%\",\n\t\t\t\t},\n\t\t\t}),\n\t\t\toption: (styles, { isDisabled, isSelected }) => {\n\t\t\t return {\n\t\t\t\t...styles,\n\t\t\t\tbackgroundColor: isDisabled \n\t\t\t\t\t? 'red' \n\t\t\t\t\t: isSelected\n\t\t\t\t\t? '#CCE7E5'\n\t\t\t\t\t: '#fff',\n\t\t\t\tcolor: '#181818',\n\t\t\t\tfontSize: '1rem',\n\t\t\t\tcursor: isDisabled ? 'not-allowed' : 'default',\n\t\t\t\tpadding: '0.625rem 1rem',\n\t\t\t\t\"&:hover\": {\n\t\t\t\t\tbackgroundColor: \"#daedeb\"\n\t\t\t\t}\n\t\t\t };\n\t\t\t},\n\t\t\tindicatorSeparator: styles => ({ \n\t\t\t\t...styles, \n\t\t\t\tdisplay: 'none',\n\t\t\t}),\n\t\t\tdropdownIndicator: styles => ({ \n\t\t\t\t...styles, \n\t\t\t\tcolor: '#181818',\n\t\t\t}),\n\t\t\tmenu: styles => ({ \n\t\t\t\t...styles, \n\t\t\t\tpaddingTop: '0',\n\t\t\t\tpaddingBottom: '0',\n\t\t\t\tmargin: '0',\n\t\t\t\tborderRadius: '0.25rem',\n\t\t\t}),\n\t\t\tmenuList: styles => ({ \n\t\t\t\t...styles,\n\t\t\t\tpadding: '0',\n\t\t\t\tmargin: '0',\n\t\t\t\theight: '100%',\n\t\t\t\tborderColor: '#6D6D6D',\n\t\t\t\tborderRadius: '0.25rem',\n\t\t\t\tpaddingTop: '0',\n\t\t\t\tpaddingBottom: '0',\n\t\t\t\tfontSize: '1rem',\n\t\t\t}),\n\t\t\tplaceholder: styles => ({ \n\t\t\t\t...styles,\n\t\t\t\tfontSize: '1rem',\n\t\t\t}),\n\t\t\tselectedValue: styles => ({ \n\t\t\t\t...styles,\n\t\t\t\tfontSize: '1rem',\n\t\t\t}),\n\t\t};\n\n\t\treturn (\n\t\t\t<div className=\"search-results__sortby js-form-type-select\">\n\t\t\t\t<label htmlFor=\"sort-by\">Sort results by</label>\n\t\t\t\t<Select\n\t\t\t\t\tonChange={this.onSelect}\n\t\t\t\t\toptions={this.options}\n\t\t\t\t\tstyles={customDropdownStyles}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}}\n\n\nFederatedSortMenu.propTypes = {\n\tbootstrapCss: PropTypes.bool,\n\tonChange: PropTypes.func,\n\tsortFields: PropTypes.array,\n\tdefaultSort: PropTypes.string\n};\n\nexport default FederatedSortMenu;\n","import PropTypes from 'prop-types';\nimport React from \"react\";\n\nclass FederatedInstructions extends React.Component {\n\n render() {\n\n const { query, results } = this.props;\n const { numFound } = results;\n\n if (numFound > 0) {\n return (\"\")\n }\n\n return (\n <div className=\"search-no-results-text\">\n <p>\n No results were found for your search. Try again by changing your\n search terms or checking the spelling of your search terms.\n </p>\n </div>\n );\n }\n}\n\nFederatedInstructions.propTypes = {\n query: PropTypes.object,\n results: PropTypes.object\n}\n\nexport default FederatedInstructions;\n","// Create a custom component pack from the default component pack\nimport {defaultComponentPack} from \"../solr-faceted-search-react/src/index\";\nimport FederatedResult from \"./results/result\";\nimport FederatedTextSearch from \"./text-search/index\";\nimport FederatedListFacet from \"./list-facet/index\";\nimport FederatedRangeFacet from \"./range-facet/index\";\nimport FederatedSearchFieldContainer from \"./search-field-container\";\nimport FederatedResultList from \"./results/list\";\nimport FederatedPagination from \"./results/pagination\";\nimport FederatedCountLabel from \"./results/count-label\";\nimport FederatedCurrentQuery from \"./current-query\";\nimport FederatedSortMenu from \"./sort-menu\";\nimport FederatedInstructions from \"./results/instructions\";\n\nconst FederatedSolrComponentPack = {\n ...defaultComponentPack,\n searchFields: {\n ...defaultComponentPack.searchFields,\n text: FederatedTextSearch,\n \"list-facet\": FederatedListFacet,\n \"range-facet\": FederatedRangeFacet,\n container: FederatedSearchFieldContainer,\n currentQuery: FederatedCurrentQuery\n },\n results: {\n ...defaultComponentPack.results,\n result: FederatedResult,\n list: FederatedResultList,\n paginate: FederatedPagination,\n resultCount: FederatedCountLabel,\n instructions: FederatedInstructions\n },\n sortFields: {\n menu: FederatedSortMenu\n }\n}\n\nexport default FederatedSolrComponentPack;\n","import FederatedDirectoryResult from \"./directory\";\nimport FederatedConditionResult from \"./condition\";\nimport FederatedTreatmentResult from './treatment';\nimport FederatedRecipeResult from \"./recipe\";\nimport FederatedDepartmentResult from \"./department\";\n\nexport default {\n Directory: FederatedDirectoryResult,\n Conditions: FederatedConditionResult,\n Treatment: FederatedTreatmentResult,\n Recipe: FederatedRecipeResult,\n Department: FederatedDepartmentResult\n}","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedDirectoryResult extends FederatedResult {\n\n render() {\n const { doc, highlight } = this.props;\n const placeholderImage = \"/themes/custom/bmc_base_theme/assets/images/placeholders/headshoticon.png\";\n let departments = null;\n if (Array.isArray(doc.sm_department)){\n departments = doc.sm_department.join(\" | \");\n }\n return (\n <li\n className=\"search-card search-card--directory tile\"\n onClick={() => this.props.onSelect(doc)}\n >\n <a href={this.getCanonicalLink(doc)} >\n <div className=\"wrapper\">\n <div className=\"img\">\n {doc.sm_federated_image && doc.sm_federated_image.length ? (\n <picture className=\"aspect-ratio-2x3\">\n <source\n media=\"(min-width:340px)\"\n srcset={`${doc.sm_federated_image[0]}?io=transform:fill,width:333,height:500, ${doc.sm_federated_image[0]}?io=transform:fill,width:666,height:1000 2x`}\n />\n <img\n src={`${doc.sm_federated_image[0]}?io=transform:fill,width:166,height:250&format=jpg`}\n alt=\"\"\n style={{ width: \"100%\" }}\n className=\"aspect-ratio-2x3\"\n />\n </picture>\n ) : (\n <picture className=\"aspect-ratio-2x3\">\n <img src={placeholderImage} />\n </picture>\n )}\n </div>\n\n <div className=\"text\">\n {departments ? (\n <span className=\"department-tag\">{departments}</span>\n ) : null}\n\n <div className=\"heading-wrapper\">\n // Use the sort field instead of the title field to match the sort with the title showed to the user.\n <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_sort_az_field }} >\n </h3>\n\n {doc.ss_field_clinical_title && (\n <h5 className=\"subheading\">{doc.ss_field_clinical_title}</h5>\n )}\n </div>\n\n <p\n className=\"summary\"\n dangerouslySetInnerHTML={{ __html: doc.ss_summary }}\n />\n\n {doc.tm_X3b_en_field_special_interest && (\n <div className=\"tags tags--comma special-interests\">\n <h5>Specialty:</h5>\n <p>\n {Array.isArray(doc.tm_X3b_en_field_special_interest) &&\n doc.tm_X3b_en_field_special_interest.map((interest) => (\n <span className=\"tag\">{interest}</span>\n ))}\n </p>\n </div>\n )}\n\n {(doc.bs_field_accepting_patients ||\n doc.bs_field_top_dentist ||\n doc.bs_field_top_doc) && (\n <div className=\"tags tags attributes\">\n <p>\n {doc.bs_field_accepting_patients && (\n <span className=\"tag attributes--accepting-patients\">\n <span className=\"visually-hidden\">Accepting Patients</span>\n </span>\n )}\n {doc.bs_field_top_dentist && (\n <span className=\"tag attributes--top-dentist\">\n <span className=\"visually-hidden\">Top Dentist</span>\n </span>\n )}\n {doc.bs_field_top_doc && (\n <span className=\"tag attributes--top-doc\">\n <span className=\"visually-hidden\">Top Doctor</span>\n </span>\n )}\n </p>\n </div>\n )}\n\n {doc.sm_field_phone && (\n <div className=\"tags tags--pipe phone\">\n <p>\n {Array.isArray(doc.sm_field_phone) &&\n doc.sm_field_phone.map((phone) => (\n <a\n className=\"tag\"\n href={`tel:${this.formatPhoneNumber(phone)}`}\n >\n {this.formatPhoneNumber(phone)}\n </a>\n ))}\n </p>\n </div>\n )}\n\n <div className=\"meta tags tags--pipe\">\n <span className=\"content-type-tag type\">\n {doc.sm_federated_type}\n </span>\n </div>\n\n\n </div>\n </div>\n </a>\n </li>\n );\n }\n}\n\nexport default FederatedDirectoryResult;\n","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedConditionResult extends FederatedResult {\n \n render() {\n const { doc, highlight } = this.props;\n\n return (\n <li className=\"search-card search-card--condition tile\" onClick={() => this.props.onSelect(doc)}>\n {/* {doc.sm_federated_image && doc.sm_federated_image.length && \n <div className=\"img\">\n <img src={doc.sm_federated_image[0]} />\n </div>\n } */}\n \n <div className=\"text\">\n\n <h3 className=\"heading h5\">\n <a href={this.getCanonicalLink(doc)} dangerouslySetInnerHTML={{__html: doc.ss_federated_title}} />\n </h3>\n\n <p className=\"summary\" dangerouslySetInnerHTML={{__html: doc.ss_summary}} />\n\n <div className=\"meta tags tags--pipe\">\n {/* <cite className=\"tags tags--list citation\">{this.renderSitenameLinks(doc.sm_site_name, doc.sm_urls, doc.ss_site_name)}</cite> */}\n <span className=\"content-type-tag type\">{doc.sm_federated_type}</span>\n </div>\n </div>\n </li>\n )\n }\n}\n\nexport default FederatedConditionResult;\n","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedTreatmentResult extends FederatedResult {\n render() {\n const { doc, highlight } = this.props;\n\n return (\n <li className=\"search-card search-card--treatment tile\" onClick={() => this.props.onSelect(doc)}>\n <a href={this.getCanonicalLink(doc)} >\n\n <div className=\"text\">\n {doc.sm_department && doc.sm_department.length && doc.ss_federated_title.toLowerCase() !== doc.sm_department[0].toLowerCase() &&\n <div className=\"tags tags--comma department\">\n <p>\n <span className=\"department-tag\">{doc.sm_department[0]}</span>\n </p>\n </div>\n }\n\n <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_federated_title }}>\n </h3>\n\n <p className=\"summary\" dangerouslySetInnerHTML={{__html: doc.ss_summary}} />\n\n <div className=\"meta tags tags--pipe\">\n {/* <cite className=\"tags tags--list citation\">{this.renderSitenameLinks(doc.sm_site_name, doc.sm_urls, doc.ss_site_name)}</cite> */}\n <span className=\"content-type-tag type\">{doc.sm_federated_type}</span>\n </div>\n </div>\n </a>\n </li>\n )\n }\n}\n\nexport default FederatedTreatmentResult;\n","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedRecipeResult extends FederatedResult {\n render() {\n const { doc, highlight } = this.props;\n\n return (\n <li\n className=\"search-card search-card--recipe tile\"\n onClick={() => this.props.onSelect(doc)}\n >\n <a href={this.getCanonicalLink(doc)} >\n\n <div className=\"text\">\n\n <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_federated_title }}>\n </h3>\n\n <p\n className=\"summary\"\n dangerouslySetInnerHTML={{ __html: doc.ss_summary }}\n />\n\n <div className=\"meta tags tags--pipe\">\n <span className=\"content-type-tag type\">\n {doc.sm_federated_type}\n </span>\n </div>\n\n </div>\n </a>\n </li>\n );\n }\n}\n\nexport default FederatedRecipeResult;\n","import React from \"react\";\nimport 'intl';\nimport 'intl/locale-data/jsonp/en';\nimport FederatedResult from '../result';\n\n// Custom class for the result component\nclass FederatedDepartmentResult extends FederatedResult {\n\n render() {\n const { doc, highlight } = this.props;\n return (\n <li\n className=\"search-card search-card--department tile\"\n onClick={() => this.props.onSelect(doc)}\n >\n <a href={this.getCanonicalLink(doc)}>\n <div className=\"text\">\n <h3 className=\"heading h5\" dangerouslySetInnerHTML={{ __html: doc.ss_federated_title }}></h3>\n\n <p\n className=\"search-card__summary\"\n dangerouslySetInnerHTML={{ __html: doc.ss_summary }}\n />\n\n <div className=\"meta tags tags--pipe\">\n <span className=\"content-type-tag type\">\n {doc.sm_federated_type}\n </span>\n </div>\n </div>\n </a>\n </li>\n );\n }\n}\n\nexport default FederatedDepartmentResult;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { LiveAnnouncer } from 'react-aria-live';\nimport FederatedSolrComponentPack from './federated_solr_component_pack';\nimport helpers from '../helpers';\nimport ResultComponents from './results/result-components';\n//import componentPack from \"./component-pack\";\n\nconst getFacetValues = (type, results, field, lowerBound, upperBound) => {\n return type === 'period-range-facet'\n ? (results.facets[lowerBound] || []).concat(results.facets[upperBound] || [])\n : type === 'list-facet' || type === 'range-facet'\n ? results.facets[field] || []\n : null;\n};\n\nclass FederatedSolrFacetedSearch extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n submitted: false\n }\n this.resetFilters = this.resetFilters.bind(this);\n }\n\n resetFilters() {\n let { query } = this.props;\n let searchTerm = '';\n // Keep only the value of the main search field.\n for (const field of query.searchFields) {\n if (field.field !== query.mainQueryField) {\n // Remove the field value.\n delete (field.value);\n // Collapse the sidebar filter toggle.\n field.collapse = true;\n // Collapse the terms sidebar filter toggle.\n if (Object.hasOwnProperty.call(field, 'expandedHierarchies')) {\n field.expandedHierarchies = [];\n }\n } else {\n // Extract the value of the main search term to use when setting new URL for this state.\n searchTerm = field.value;\n }\n }\n // Set new parsed params based on only search term value.\n const parsed = {\n search: searchTerm,\n };\n // Add new url to browser window history.\n helpers.qs.addNewUrlToBrowserHistory(parsed);\n\n // Update state to remove the filter field values.\n this.setState({ query });\n // Execute search.\n this.props.onSearchFieldChange();\n }\n\n getResultByType(type) {\n if (Array.isArray(type)) {\n type = type[0];\n }\n\n if (type) {\n switch (type.toLowerCase()) {\n case \"administrative\":\n case \"provider\":\n return ResultComponents.Directory\n break;\n // case \"conditions\":\n // return ResultComponents.Conditions\n // break;\n // case \"treatments\":\n // return ResultComponents.Treatment\n // break;\n case \"recipes\":\n return ResultComponents.Recipe;\n break;\n case \"department\":\n return ResultComponents.Department;\n break;\n }\n }\n }\n\n render() {\n const {\n customComponents,\n bootstrapCss,\n query,\n results,\n truncateFacetListsAt,\n options,\n onSearchFieldChange,\n onTextInputChange,\n onSortFieldChange,\n onPageChange,\n } = this.props;\n //TODO: SORT\n const { searchFields, sortFields, rows } = query;\n const start = query.start ? query.start : 0;\n const SearchFieldContainerComponent = customComponents.searchFields.container;\n const ResultContainerComponent = customComponents.results.container;\n const ResultComponent = customComponents.results.result;\n const ResultCount = customComponents.results.resultCount;\n const ResultHeaderComponent = customComponents.results.header;\n const ResultInstructionsComponent = customComponents.results.instructions;\n const ResultListComponent = customComponents.results.list;\n const ResultPendingComponent = customComponents.results.pending;\n const PaginateComponent = customComponents.results.paginate;\n const PreloadComponent = customComponents.results.preloadIndicator;\n const CurrentQueryComponent = customComponents.searchFields.currentQuery;\n //TODO: SORT\n const SortComponent = customComponents.sortFields.menu;\n const FederatedTextSearch = FederatedSolrComponentPack.searchFields.text;\n\n const resultPending = results.pending\n ? (<ResultPendingComponent bootstrapCss={bootstrapCss} />)\n : null;\n\n const pagination = query.pageStrategy === 'paginate' ?\n <PaginateComponent {...this.props} bootstrapCss={bootstrapCss} onChange={onPageChange} /> :\n null;\n\n const preloadListItem = query.pageStrategy === 'cursor'\n && results.docs.length < results.numFound\n ? <PreloadComponent {...this.props} />\n : null;\n\n let pageTitle;\n if (this.props.options.pageTitle != null) {\n pageTitle = <h1>{this.props.options.pageTitle}</h1>;\n }\n let sortChange = (a, b) => {\n\n if (!this.state.submitted) {\n this.setState(\n {\n submitted: true,\n },\n () => {onSearchFieldChange(a, b);}\n );\n } else {\n onSortFieldChange(\"score\", \"desc\");\n onSearchFieldChange(a, b);\n }\n };\n\n\n return (\n <LiveAnnouncer>\n <form className=\"site-search-form\" autoComplete=\"off\">\n {/* {pageTitle} */}\n <div className=\"fs-search-form\" autoComplete=\"off\">\n <FederatedTextSearch\n {...this.props}\n autocomplete={false} //options.autocomplete} TODO: JL remove autocomplete from search page\n field=\"tm_rendered_item\"\n label=\"Showing results for:\"\n onSuggest={onTextInputChange}\n onChange={sortChange}\n value={searchFields.find((sf) => sf.field === \"tm_rendered_item\").value}\n />\n <CurrentQueryComponent {...this.props} onChange={sortChange} />\n </div>\n </form>\n <div className=\"search-results\">\n <aside className=\"fs-aside\">\n <SearchFieldContainerComponent\n bootstrapCss={bootstrapCss}\n onNewSearch={this.resetFilters}\n resultsCount={this.props.results.numFound}\n title={this.props.options.menuTitle}\n >\n {/* Only render the visible facets / filters.\n Note: their values may still be used in the query, if they were pre-set. */}\n {searchFields\n .filter(\n (searchField) =>\n this.props.sidebarFilters.indexOf(searchField.field) > -1 &&\n !searchField.isHidden\n )\n .map((searchField, i) => {\n const { type, field, lowerBound, upperBound } = searchField;\n const SearchComponent = customComponents.searchFields[type];\n const facets = getFacetValues(\n type,\n results,\n field,\n lowerBound,\n upperBound\n );\n\n return (\n <SearchComponent\n key={i}\n {...this.props}\n {...searchField}\n bootstrapCss={bootstrapCss}\n facets={facets}\n truncateFacetListsAt={truncateFacetListsAt}\n onChange={onSearchFieldChange}\n />\n );\n })}\n </SearchFieldContainerComponent>\n </aside>\n\n <div className=\"fs-main\">\n <div\n className={\n searchFields.find((sf) => sf.field === \"tm_rendered_item\")\n .value || this.props.options.showEmptySearchResults\n ? \"search-results__wrapper\"\n : \"search-results__wrapper screen-hide\"\n }\n >\n <ResultContainerComponent bootstrapCss={bootstrapCss}>\n <ResultHeaderComponent bootstrapCss={bootstrapCss}>\n {/* conditional rendering to hide white css block */}\n <div className=\"search-results__header\">\n <div className=\"search-results__count\">\n <ResultCount\n bootstrapCss={bootstrapCss}\n numFound={results.numFound}\n start={start}\n rows={rows}\n onChange={onPageChange}\n noResultsText={this.props.options.noResults || null}\n termValue={\n searchFields.find(\n (sf) => sf.field === \"tm_rendered_item\"\n ).value\n }\n />\n {resultPending}\n </div>\n <SortComponent\n bootstrapCss={bootstrapCss}\n onChange={onSortFieldChange}\n sortFields={sortFields}\n />\n </div>\n </ResultHeaderComponent>\n\n <ResultInstructionsComponent {...this.props} />\n\n <ResultListComponent bootstrapCss={bootstrapCss}>\n {results.docs.map((doc, i) => {\n let CustomResultComponent =\n this.getResultByType(doc.sm_federated_type) ||\n ResultComponent;\n\n return (\n <CustomResultComponent\n bootstrapCss={bootstrapCss}\n doc={doc}\n fields={searchFields}\n key={doc.id || i}\n onSelect={this.props.onSelectDoc}\n resultIndex={i}\n rows={rows}\n start={start}\n highlight={results.highlighting[doc.id]}\n hostname={this.props.options.hostname}\n />\n );\n })}\n\n {preloadListItem}\n </ResultListComponent>\n {pagination}\n </ResultContainerComponent>\n </div>\n </div>\n </div>\n </LiveAnnouncer>\n );\n }\n}\n\nFederatedSolrFacetedSearch.defaultProps = {\n bootstrapCss: true,\n customComponents: FederatedSolrComponentPack,\n pageStrategy: 'paginate',\n rows: 20,\n searchFields: [\n {\n type: 'text', field: '*',\n },\n ],\n sortFields: [],\n truncateFacetListsAt: -1,\n showCsvExport: false,\n sidebarFilters: ['sm_site_name', 'sm_federated_type', 'sm_department', 'ds_federated_date', 'sm_federated_terms'],\n options: {},\n};\n\nFederatedSolrFacetedSearch.propTypes = {\n bootstrapCss: PropTypes.bool,\n customComponents: PropTypes.object,\n onCsvExport: PropTypes.func,\n onNewSearch: PropTypes.func,\n onPageChange: PropTypes.func,\n onSearchFieldChange: PropTypes.func.isRequired,\n onTextInputChange: PropTypes.func,\n onSelectDoc: PropTypes.func,\n onSortFieldChange: PropTypes.func.isRequired,\n query: PropTypes.object,\n results: PropTypes.object,\n showCsvExport: PropTypes.bool,\n truncateFacetListsAt: PropTypes.number,\n options: PropTypes.object,\n};\n\nexport default FederatedSolrFacetedSearch;\n","// index.js\nimport 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\nimport 'babel-polyfill';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { SolrClient } from './solr-faceted-search-react/src/index';\nimport FederatedSolrComponentPack from './components/federated_solr_component_pack';\nimport FederatedSolrFacetedSearch from './components/federated-solr-faceted-search';\nimport helpers from './helpers';\n\n// import search app boilerplate styles\nimport './styles.css';\n\n/**\n * Executes search query based on the value of URL querystring params.\n *\n * @param solrClient\n * Instantiated solrClient.\n * @param options\n * Config options, used to determine initial site search name\n */\nconst searchFromQuerystring = (solrClient, options = {}) => {\n // Get existing querystring params.\n const { parsed, params } = helpers.qs.getParsedQsAndParams();\n\n let searchFieldsState = solrClient.state.query.searchFields;\n\n // Set the state for searchFields based on qs params.\n searchFieldsState.forEach((searchField) => {\n // Get the field machine name for the main query field.\n if (Object.prototype.hasOwnProperty.call(options,'mainQueryField') && searchField.field === options.mainQueryField) {\n // Set the state of the main query field to the value of the search qs param\n searchField.value = parsed.search;\n }\n // If the searchField is one for which we preserve state through qs.\n if (helpers.filterFieldsWithQsState.find((filterField) => filterField === searchField.field )) {\n searchField = helpers.qs.setFieldStateFromQs({\n params,\n searchField\n }) // this resets our initial state of search sites\n }\n // If restricted to the current site by configuration, enforce it here.\n // This rule only applies if site has not been selected by the user.\n if (options.siteSearch !== undefined && searchField.field === 'sm_site_name' && searchField.value === undefined && searchField.isHidden === false) {\n searchField.value = [options.siteSearch];\n }\n });\n // Ensure the initial query succeeds by setting a default start value.\n solrClient.state.query.start = solrClient.state.query.start || 0;\n // Send query based on state derived from querystring.\n solrClient.state.query.sort = options.defaultSort\n solrClient.sendQuery(solrClient.state.query);\n};\n\n// Initialize the solr client + search app with settings.\nconst init = (settings) => {\n const defaults = {\n isD7: false,\n // Whether or not we should be querying the solr backend directly.\n proxyIsDisabled: false,\n // The query request endpoint url must be assigned in ./.env.local.js and by the search app settings in the module.\n url: \"\",\n // The search fields and filterable facets.\n searchFields: [\n {label: \"Enter Search Term:\", field: \"tm_rendered_item\", type: \"text\", isHidden: false},\n {label: \"Site Name\", field: \"sm_site_name\", type: \"list-facet\", collapse: true, isHidden: false},\n {label: \"Type\", field: \"sm_federated_type\", type: \"list-facet\", collapse: true, isHidden: false},\n {label: \"Department\", field: \"sm_department\", type: \"list-facet\", collapse: true, isHidden: false},\n {label: \"Date\", field: \"ds_federated_date\", type: \"range-facet\", collapse: true, isHidden: false},\n {label: \"Federated Terms\", field: \"sm_federated_terms\", type: \"list-facet\", hierarchy: true, expandedHierarchies: [], isHidden: false},\n ],\n // The solr field to use as the source for the main query param \"q\".\n mainQueryField: \"tm_rendered_item\",\n sortFields: [\n //The following field is used to sort by first name\n // {id: \"a-z-title\", label: \"A-Z\", field:\"ss_federated_title\", order: \"asc\"},\n // {label: \"Z-A\", field:\"ss_federated_title\", order: \"desc\"},\n // Z-A sort needs to be continuously worked on, build is not picking it up correctly\n {id: \"score\", label: \"Relevance\", field: \"score\", order: \"desc\"},\n {id: \"ds_federated_date\", label: \"Date\", field: \"ds_federated_date\", order: \"desc\"},\n {id: \"sort_az_field\", label: \"A-Z\", field: \"ss_sort_az_field\", order: \"asc\"}\n // {id: \"sort_az_field\", label: \"A-Z\", field: \"ss_federated_title\", order: \"asc\"}\n ],\n hiddenSearchFields : [],\n // Enable highlighting in search results snippets.\n hl: {\n fl: 'tm_rendered_item', // the highlight snippet source field(s)\n usePhraseHighlighter: true // highlight phrase queries\n },\n pageStrategy: \"paginate\",\n rows: 20,\n // Hostname overridable in ./.env.local.js for testing purposes.\n hostname: window.location.hostname,\n autocomplete: false,\n filters: [],\n defaultSort: []\n };\n\n const options = Object.assign(defaults, settings);\n\n const result = options.sortFields.map( option => {\n if (option.field === options.defaultSort ) {\n option.value = option.order\n }\n })\n // Update searchFields to indicate which facets or filters should be hidden in the UI.\n // Note: these facets and filters may still be used in the query.\n // settings.hiddenSearchFields = settings.hiddenSearchFields || [];\n options.searchFields = options.searchFields.map(searchField => {\n if (settings.hiddenSearchFields?.includes(searchField.field)) {\n searchField.isHidden = true;\n }\n return searchField;\n });\n\n // Set sm_site_name default values from config\n const sm_site_name_value = settings.sm_site_name || false;\n\n\n // Logic for restricting site search based on config.\n options.siteList = [];\n if (settings.siteSearch !== undefined) {\n options.searchFields.forEach((searchField) => {\n if (searchField.field === 'sm_site_name' &&\n (searchField.isHidden || sm_site_name_value.length < 2)) {\n options.siteList = [settings.siteSearch];\n }\n });\n }\n else {\n options.siteList = sm_site_name_value;\n }\n\n options.filters.push({field: \"sm_site_name\", type: \"list-facet\", value: options.siteList});\n\n // The client class.\n const solrClient = new SolrClient({\n isD7: options.isD7,\n proxyIsDisabled: options.proxyIsDisabled,\n url: options.url,\n userpass: options.userpass,\n searchFields: options.searchFields,\n //TODO: SORT\n sortFields: options.sortFields,\n pageStrategy: options.pageStrategy,\n rows: options.rows,\n hl: options.hl,\n mainQueryField: options.mainQueryField,\n filters: options.filters,\n\n // The change handler passes the current query- and result state for render\n // as well as the default handlers for interaction with the search component\n onChange: (state, handlers) =>\n // Render the faceted search component\n ReactDOM.render(\n <FederatedSolrFacetedSearch\n {...state}\n {...handlers}\n customComponents={FederatedSolrComponentPack}\n bootstrapCss={false}\n //onSelectDoc={(doc) => console.log(doc)}\n onSelectDoc={()=>{}}\n truncateFacetListsAt={-1}\n options={options}\n />,\n document.getElementById(\"fs-root\")\n )\n });\n\n // Check if there is a querystring param search term and make initial query.\n searchFromQuerystring(solrClient, options);\n\n // Listen for browser history changes / updated querystring, make new query.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/popstate\n window.onpopstate = function() {\n searchFromQuerystring(solrClient, options);\n };\n};\n\n// If we are in the production environment (i.e. using the build compiled js)\n// @see https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-custom-environment-variables\nif (process.env.NODE_ENV === 'production') {\n // Get the root element where the app will be rendered.\n const root = document.getElementById(\"fs-root\");\n\n if (root) {\n // Get the data attribute which has the stringified configuration data json object.\n if (Object.hasOwnProperty.call(root.dataset, 'federatedSearchAppConfig')) {\n const settings = JSON.parse(root.dataset.federatedSearchAppConfig);\n init(settings);\n }\n else {\n console.error('Federated Search React | Could not find a data-federated-search-app-config attribute on div#fs-root. Please populate data-federated-search-app-config with search app configuration data.');\n }\n }\n else {\n console.error('Federated Search React | Could not find div#fs-root in which to load the search app.');\n }\n}\n// This is not production (i.e. not using the build compiled js)\nelse {\n // Get the local environment settings for the search app and initialize.\n import('./.env.local.js')\n .then(\n (settings) => {\n init(settings); // Load the app, passing in the ./.env.local.js config.\n },\n (error) => {\n console.error('Federated Search React | Could not load local configuration for search app: ', error);\n }\n );\n}\n"],"sourceRoot":""}