{"version":3,"sources":["webpack:///./src/js/react-components/cards/staff-card.js","webpack:///./src/js/utils/formats.js","webpack:///./src/js/react-components/staff/list.js","webpack:///./src/js/react-components/faculty-staff-listing/last-name-filter.js","webpack:///./src/js/react-components/faculty-staff-listing/index.js"],"names":["StaffCard","_ref","phone","normalizedPhone","id","image","Image","fullName","FullName","positions","Position","department","Department","phoneNumber","PhoneNumber","emailAddress","EmailAddress","profileUrl","ProfileUrl","emailAriaLabel","phoneAriaLabel","externalLinkText","isExternal","isExternalLink","React","createElement","className","concat","aria-labelledby","style","backgroundImage","aria-label","role","data-object-fit","src","alt","loading","height","width","href","target","rel","length","map","position","index","key","replace","_toConsumableArray","flatMap","number","array","join","xlinkHref","propTypes","string","isRequired","arrayOf","memo","List","_response$data","_response$data$StaffL","_response$data2","_response$data3","_response$data4","errorDescription","errorHeading","loadingDataLabel","response","resultsAriaLabel","error","isLoading","Loading","label","Alert","heading","description","type","data","StaffListing","Results","_ref2","Id","attributes","_objectWithoutProperties","_excluded","_extends","fetchUrl","LetterButton","isActive","onClick","ariaLabel","toUpperCase","LastNameFilter","activeFilter","buttonLabel","htmlFor","Array","from","letter","func","mobileButtonId","nanoid","contentId","FacultyStaffListing","_response$data2$Facet","_response$data3$Staff","_response$data4$Staff","clearFiltersLabel","facetsSearchLabel","filtersAriaLabel","goToPageLabel","errorNoResults","keywordQueryString","lastNameButtonLabel","lastNameId","lastNameLabel","lastNameQueryString","narrowResultsHeading","pageQueryString","paginationLabel","searchButtonLabel","searchFacetPlaceholder","searchId","searchLabel","showAllFacetsLabel","showLessFacetsLabel","filtersRef","useRef","_useState2","_slicedToArray","useState","filtersExpanded","setFiltersExpanded","_useQueryString2","useQueryString","keywordQs","setKeywordQs","_useQueryString4","lastNameQs","setLastNameQs","_useQueryString6","pageQs","setPageQs","_useState4","facetsQs","setFacetsQs","_useState6","setFiltersFocusTrap","query","_objectSpread","_defineProperty","fetchUrlWithParams","stringifyUrl","url","_useFetch","useFetch","filtersSelected","Object","entries","some","_ref5","_ref6","k","clearFilters","triggerCustomEvent","window","updateFacets","keyword","prev","getQueryStringValue","useEffect","scrollHeight","current","windowHeight","document","documentElement","clientHeight","scrollTop","body","classList","add","remove","ref","aria-expanded","filtersFocusTrap","createFocusTrap","escapeDeactivates","clickOutsideDeactivates","onActivate","onDeactivate","activate","aria-controls","Search","onSearch","value","Facets","_ref7","Name","Keyword","Options","facets","searchFacetLabel","showAllLabel","showLessLabel","parse","Pagination","currentPage","CurrentPage","onPageChange","page","scrollTo","top","behavior","totalPages","TotalPages"],"mappings":"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","file":"27.407d6c.js","sourcesContent":["import React from 'react';\r\nimport { arrayOf, string } from 'prop-types';\r\nimport { formatPhone } from '../../utils/formats';\r\nimport { isExternalLink } from '../../utils/url';\r\n\r\nfunction StaffCard({\r\n id: id,\r\n Image: image,\r\n FullName: fullName,\r\n Position: positions,\r\n Department: department,\r\n PhoneNumber: phoneNumber,\r\n EmailAddress: emailAddress,\r\n ProfileUrl: profileUrl,\r\n emailAriaLabel,\r\n phoneAriaLabel,\r\n externalLinkText\r\n}) {\r\n const isExternal = isExternalLink(profileUrl);\r\n\r\n return (\r\n <article\r\n className={`staff-card ${\r\n isExternal\r\n ? 'faculty-staff-listing__external-card faculty-staff-listing__external-card--no-image'\r\n : ''\r\n }`}\r\n aria-labelledby={id}\r\n >\r\n <div className=\"staff-card__desktop-wrapper\">\r\n {image && (\r\n <div\r\n className=\"staff-card__image\"\r\n style={{ backgroundImage: `url(${image})` }}\r\n aria-label={fullName}\r\n role=\"img\"\r\n />\r\n )}\r\n </div>\r\n <div className=\"staff-card__wrapper\">\r\n <div className=\"staff-card__info\">\r\n <div className=\"staff-card__mobile-wrapper\">\r\n {image && (\r\n <img\r\n className=\"staff-card__image\"\r\n data-object-fit=\"cover\"\r\n src={image}\r\n alt={fullName}\r\n loading=\"lazy\"\r\n height=\"80\"\r\n width=\"80\"\r\n />\r\n )}\r\n <div className=\"staff-card__personal-info\">\r\n <h2 className=\"staff-card__fullname\">\r\n <a\r\n className={\r\n isExternal ? 'faculty-staff-listing__external-link' : null\r\n }\r\n href={profileUrl}\r\n target={isExternal ? '_blank' : null}\r\n rel={isExternal ? 'noopener noreferrer' : null}\r\n >\r\n {isExternal && (\r\n <span className=\"visually-hidden\">{externalLinkText}</span>\r\n )}\r\n <span id={id}>{fullName}</span>\r\n </a>\r\n </h2>\r\n {positions?.length > 0 &&\r\n positions.map((position, index) => (\r\n <h3\r\n className={`staff-card__position ${\r\n index ? 'staff-card__position--hidden' : ''\r\n }`}\r\n key={position}\r\n >\r\n {position}\r\n </h3>\r\n ))}\r\n {department && (\r\n <h4 className=\"staff-card__department\">{department}</h4>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n {(phoneNumber || emailAddress) && (\r\n <ul className=\"staff-card__additional-info\">\r\n {phoneNumber && (\r\n <li className=\"staff-card__additional-info-item\">\r\n <a\r\n aria-label={`${phoneAriaLabel} ${formatPhone(phoneNumber)}`}\r\n href={`tel:${phoneNumber}`}\r\n >\r\n <svg>\r\n <use xlinkHref=\"#phone-outline\" />\r\n </svg>\r\n {phoneNumber}\r\n </a>\r\n </li>\r\n )}\r\n {emailAddress && (\r\n <li className=\"staff-card__additional-info-item\">\r\n <a\r\n aria-label={`${emailAriaLabel} ${emailAddress}`}\r\n href={`mailto:${emailAddress}`}\r\n >\r\n <svg>\r\n <use xlinkHref=\"#envelope-outline\" />\r\n </svg>\r\n {emailAddress}\r\n </a>\r\n </li>\r\n )}\r\n </ul>\r\n )}\r\n </div>\r\n </article>\r\n );\r\n}\r\n\r\nStaffCard.propTypes = {\r\n emailAriaLabel: string,\r\n phoneAriaLabel: string,\r\n id: string.isRequired,\r\n Image: string.isRequired,\r\n FullName: string.isRequired,\r\n Position: arrayOf(string.isRequired).isRequired,\r\n Department: string.isRequired,\r\n PhoneNumber: string.isRequired,\r\n EmailAddress: string.isRequired,\r\n externalLinkText: string.isRequired\r\n};\r\n\r\nexport default React.memo(StaffCard);\r\n","export function formatPhone(phone) {\r\n const normalizedPhone = phone.replace(/\\D/g, '');\r\n\r\n /* eslint-disable indent */\r\n return normalizedPhone.length === 10\r\n ? [...normalizedPhone]\r\n .flatMap((number, index, array) => {\r\n if (index === 2 || index === 5) {\r\n return [`${number}`, '. '];\r\n }\r\n if (index !== array.length - 1) {\r\n return [`${number}`, ' '];\r\n }\r\n return `${number}`;\r\n })\r\n .join('')\r\n : phone;\r\n /* eslint-enable indent */\r\n}\r\n","import React from 'react';\r\nimport { string } from 'prop-types';\r\n\r\nimport StaffCard from '../cards/staff-card';\r\nimport Alert from '../alert';\r\nimport Loading from '../loading';\r\n\r\nfunction List({\r\n emailAriaLabel,\r\n errorDescription,\r\n errorHeading,\r\n loadingDataLabel,\r\n phoneAriaLabel,\r\n response,\r\n resultsAriaLabel,\r\n error,\r\n isLoading,\r\n externalLinkText\r\n}) {\r\n if (isLoading) return <Loading label={loadingDataLabel} />;\r\n\r\n if (error)\r\n return (\r\n <Alert\r\n heading={errorHeading}\r\n description={errorDescription}\r\n type=\"error\"\r\n />\r\n );\r\n\r\n return response?.data?.StaffListing?.length > 0 ? (\r\n <section className=\"staff-list\" aria-label={resultsAriaLabel}>\r\n <p className=\"staff-list__description\">{response?.data?.Results}</p>\r\n <div className=\"staff-list__list\">\r\n {response?.data?.StaffListing.map(({ Id, ...attributes }) => (\r\n <StaffCard\r\n key={Id}\r\n id={Id}\r\n emailAriaLabel={emailAriaLabel}\r\n phoneAriaLabel={phoneAriaLabel}\r\n externalLinkText={externalLinkText}\r\n {...attributes}\r\n />\r\n ))}\r\n </div>\r\n </section>\r\n ) : (\r\n <span className=\"text-lg\">{response?.data?.Results}</span>\r\n );\r\n}\r\n\r\nList.propTypes = {\r\n emailAriaLabel: string,\r\n errorDescription: string.isRequired,\r\n errorHeading: string.isRequired,\r\n externalLinkText: string.isRequired,\r\n fetchUrl: string.isRequired,\r\n loadingDataLabel: string.isRequired,\r\n phoneAriaLabel: string,\r\n resultsAriaLabel: string.isRequired\r\n};\r\n\r\nexport default React.memo(List);\r\n","import React from 'react';\r\nimport { string, func } from 'prop-types';\r\n\r\nconst ALPHABET = 'abcdefghijklmnopqrstuvwxyz';\r\n\r\nfunction LetterButton({ isActive, label, onClick, ariaLabel }) {\r\n return (\r\n <button\r\n className={`letter-button ${isActive ? 'letter-button--active' : ''}`}\r\n onClick={onClick}\r\n aria-label={`${ariaLabel} ${label}`}\r\n >\r\n {label.toUpperCase()}\r\n </button>\r\n );\r\n}\r\n\r\nfunction LastNameFilter({ activeFilter, buttonLabel, id, label, onClick }) {\r\n return (\r\n <div className=\"faculty-staff-listing__letter-buttons\">\r\n <label\r\n className=\"faculty-staff-listing__letter-buttons-label\"\r\n htmlFor={id}\r\n >\r\n {label}\r\n </label>\r\n <div className=\"faculty-staff-listing__letter-buttons-wrapper\" id={id}>\r\n {Array.from(ALPHABET).map((letter) => (\r\n <LetterButton\r\n isActive={letter === activeFilter}\r\n key={letter}\r\n label={letter}\r\n onClick={() => onClick(letter)}\r\n ariaLabel={buttonLabel}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nLastNameFilter.propTypes = {\r\n activeFilter: string.isRequired,\r\n buttonLabel: string.isRequired,\r\n id: string.isRequired,\r\n label: string.isRequired,\r\n onClick: func.isRequired\r\n};\r\n\r\nexport default LastNameFilter;\r\n","import React, { useState, useRef, useEffect } from 'react';\r\nimport { string } from 'prop-types';\r\nimport { nanoid } from 'nanoid';\r\nimport parse from 'html-react-parser';\r\n\r\nimport useFetch from '../../react-hooks/use-fetch';\r\nimport useQueryString from '../../react-hooks/use-query-string';\r\nimport { stringifyUrl, getQueryStringValue } from '../../utils/url';\r\nimport Facets from '../facets';\r\nimport LastNameFilter from './last-name-filter';\r\nimport List from '../staff/list';\r\nimport Search from '../search';\r\nimport Pagination from '../pagination';\r\nimport { triggerCustomEvent } from '../../utils/events';\r\nimport { createFocusTrap } from 'focus-trap';\r\n\r\nconst mobileButtonId = `id-${nanoid()}`;\r\nconst contentId = `id-${nanoid()}`;\r\n\r\nfunction FacultyStaffListing({\r\n emailAriaLabel,\r\n clearFiltersLabel,\r\n facetsSearchLabel,\r\n fetchUrl,\r\n filtersAriaLabel,\r\n goToPageLabel,\r\n errorDescription,\r\n errorHeading,\r\n errorNoResults,\r\n heading,\r\n keywordQueryString,\r\n lastNameButtonLabel,\r\n lastNameId,\r\n lastNameLabel,\r\n lastNameQueryString,\r\n loadingDataLabel,\r\n narrowResultsHeading,\r\n pageQueryString,\r\n paginationLabel,\r\n phoneAriaLabel,\r\n resultsAriaLabel,\r\n searchButtonLabel,\r\n searchFacetPlaceholder,\r\n searchId,\r\n searchLabel,\r\n showAllFacetsLabel,\r\n showLessFacetsLabel,\r\n externalLinkText\r\n}) {\r\n const filtersRef = useRef(null);\r\n const [filtersExpanded, setFiltersExpanded] = useState(false);\r\n const [keywordQs, setKeywordQs] = useQueryString(keywordQueryString);\r\n const [lastNameQs, setLastNameQs] = useQueryString(lastNameQueryString);\r\n const [pageQs, setPageQs] = useQueryString(pageQueryString);\r\n const [facetsQs, setFacetsQs] = useState({});\r\n const [filtersFocusTrap, setFiltersFocusTrap] = useState();\r\n const query = {\r\n ...(keywordQs && { [keywordQueryString]: keywordQs }),\r\n ...(pageQs && { [pageQueryString]: pageQs }),\r\n ...(lastNameQs && { [lastNameQueryString]: lastNameQs }),\r\n ...facetsQs\r\n };\r\n const fetchUrlWithParams = stringifyUrl({\r\n url: fetchUrl,\r\n query\r\n });\r\n const { response, error, isLoading } = useFetch(fetchUrlWithParams);\r\n const filtersSelected = Object.entries(query).some(\r\n ([k, v]) => v && k !== keywordQueryString\r\n );\r\n\r\n function clearFilters() {\r\n setPageQs('');\r\n setLastNameQs('');\r\n setKeywordQs('');\r\n setFacetsQs({});\r\n triggerCustomEvent(window, 'clearFacets');\r\n }\r\n\r\n function updateFacets(keyword) {\r\n setFacetsQs((prev) => ({\r\n ...prev,\r\n [keyword]: getQueryStringValue(keyword)\r\n }));\r\n setPageQs('');\r\n setFiltersExpanded(false);\r\n }\r\n\r\n function toggleLastNameQs(letter) {\r\n setLastNameQs(lastNameQs === letter ? '' : letter);\r\n setPageQs('');\r\n setFiltersExpanded(false);\r\n }\r\n\r\n function onSearch(keyword) {\r\n setKeywordQs(keyword);\r\n setPageQs('');\r\n setFiltersExpanded(false);\r\n }\r\n\r\n function onPageChange(page) {\r\n setPageQs(page);\r\n window.scrollTo({ top: 0, behavior: 'smooth' });\r\n }\r\n\r\n function onFiltersExpanded() {\r\n const filtersFocusTrap = createFocusTrap(filtersRef.current, {\r\n escapeDeactivates: true,\r\n clickOutsideDeactivates: true,\r\n onActivate: () => {\r\n setFiltersExpanded(true);\r\n },\r\n onDeactivate: () => {\r\n setFiltersExpanded(false);\r\n }\r\n });\r\n setFiltersFocusTrap(filtersFocusTrap);\r\n filtersFocusTrap.activate();\r\n\r\n setFiltersExpanded(!filtersExpanded);\r\n }\r\n\r\n useEffect(() => {\r\n if (filtersExpanded && filtersRef) {\r\n const { scrollHeight } = filtersRef.current;\r\n const windowHeight = window.document.documentElement.clientHeight;\r\n\r\n if (scrollHeight > windowHeight) {\r\n filtersRef.current.scrollTop = windowHeight - scrollHeight;\r\n }\r\n }\r\n }, [filtersExpanded, filtersRef]);\r\n\r\n useEffect(() => {\r\n const body = window.document.body;\r\n\r\n if (filtersExpanded) {\r\n body.classList.add('noscroll');\r\n } else {\r\n body.classList.remove('noscroll');\r\n }\r\n }, [filtersExpanded]);\r\n\r\n return (\r\n <div className=\"faculty-staff-listing\">\r\n {heading && <h1>{heading}</h1>}\r\n <div className=\"faculty-staff-listing__wrapper\">\r\n <section\r\n className={`faculty-staff-listing__filters ${\r\n filtersExpanded ? 'faculty-staff-listing__filters--expanded' : ''\r\n }`}\r\n ref={filtersRef}\r\n aria-label={filtersAriaLabel}\r\n >\r\n <span\r\n className={`faculty-staff-listing__filters-mobile-header ${\r\n filtersExpanded\r\n ? 'faculty-staff-listing__filters-mobile-header--expanded'\r\n : ''\r\n }`}\r\n >\r\n <button\r\n aria-expanded={filtersExpanded}\r\n className=\"faculty-staff-listing__filters-mobile-header-button\"\r\n onClick={onFiltersExpanded}\r\n id={mobileButtonId}\r\n aria-controls={contentId}\r\n >\r\n <span>\r\n {filtersExpanded && response\r\n ? response.data?.Results\r\n : narrowResultsHeading}\r\n </span>\r\n <svg>\r\n <use xlinkHref=\"#chevron-down-outline\" />\r\n </svg>\r\n </button>\r\n </span>\r\n <div\r\n className=\"faculty-staff-listing__filters-content\"\r\n role=\"region\"\r\n id={contentId}\r\n aria-labelledby={mobileButtonId}\r\n >\r\n <div className=\"faculty-staff-listing__filters-content-header\">\r\n <span className=\"faculty-staff-listing__narrow-results-heading\">\r\n {narrowResultsHeading}\r\n </span>\r\n {(filtersSelected || keywordQs) && (\r\n <button className=\"btn-label\" onClick={clearFilters}>\r\n <span>{clearFiltersLabel}</span>\r\n </button>\r\n )}\r\n </div>\r\n <Search\r\n buttonLabel={searchButtonLabel}\r\n id={searchId}\r\n label={searchLabel}\r\n onSearch={onSearch}\r\n value={keywordQs}\r\n />\r\n <LastNameFilter\r\n activeFilter={lastNameQs}\r\n buttonLabel={lastNameButtonLabel}\r\n id={lastNameId}\r\n label={lastNameLabel}\r\n onClick={toggleLastNameQs}\r\n />\r\n {response?.data?.Facets?.length > 0 &&\r\n response.data.Facets.map(({ Name, Keyword, Options }) => {\r\n const length = Options.length;\r\n\r\n return (\r\n <Facets\r\n key={Keyword}\r\n keyword={Keyword}\r\n heading={`${Name} ${length > 10 ? `(${length})` : ''}`}\r\n facets={Options}\r\n searchFacetPlaceholder={searchFacetPlaceholder}\r\n searchFacetLabel={facetsSearchLabel.replace(\r\n '{{category}}',\r\n Name\r\n )}\r\n showAllLabel={showAllFacetsLabel}\r\n showLessLabel={showLessFacetsLabel}\r\n updateFacets={updateFacets}\r\n />\r\n );\r\n })}\r\n <div className=\"faculty-staff-listing__clear-filters-mobile\">\r\n {filtersSelected && (\r\n <button className=\"btn-label\" onClick={clearFilters}>\r\n <span>{clearFiltersLabel}</span>\r\n </button>\r\n )}\r\n </div>\r\n </div>\r\n </section>\r\n <div className=\"faculty-staff-listing__list\">\r\n {!isLoading && response?.data?.StaffListing?.length === 0 && (\r\n <div className=\"rte\">{parse(errorNoResults)}</div>\r\n )}\r\n <List\r\n resultsAriaLabel={resultsAriaLabel}\r\n emailAriaLabel={emailAriaLabel}\r\n phoneAriaLabel={phoneAriaLabel}\r\n fetchUrl={fetchUrlWithParams}\r\n errorDescription={errorDescription}\r\n errorHeading={errorHeading}\r\n loadingDataLabel={loadingDataLabel}\r\n response={response}\r\n error={error}\r\n isLoading={isLoading}\r\n externalLinkText={externalLinkText}\r\n />\r\n {!isLoading && response?.data?.StaffListing?.length > 0 && (\r\n <Pagination\r\n label={paginationLabel}\r\n currentPage={response.data.CurrentPage}\r\n goToPageLabel={goToPageLabel}\r\n onPageChange={onPageChange}\r\n totalPages={response.data.TotalPages}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nFacultyStaffListing.propTypes = {\r\n clearFiltersLabel: string.isRequired,\r\n facetsSearchLabel: string.isRequired,\r\n filtersAriaLabel: string.isRequired,\r\n goToPageLabel: string.isRequired,\r\n emailAriaLabel: string.isRequired,\r\n errorDescription: string.isRequired,\r\n errorHeading: string.isRequired,\r\n errorNoResults: string.isRequired,\r\n externalLinkText: string.isRequired,\r\n fetchUrl: string.isRequired,\r\n heading: string.isRequired,\r\n keywordQueryString: string.isRequired,\r\n lastNameButtonLabel: string.isRequired,\r\n lastNameId: string.isRequired,\r\n lastNameLabel: string.isRequired,\r\n lastNameQueryString: string.isRequired,\r\n loadingDataLabel: string.isRequired,\r\n narrowResultsHeading: string.isRequired,\r\n pageQueryString: string.isRequired,\r\n paginationLabel: string.isRequired,\r\n phoneAriaLabel: string.isRequired,\r\n resultsAriaLabel: string.isRequired,\r\n searchButtonLabel: string.isRequired,\r\n searchFacetPlaceholder: string.isRequired,\r\n searchId: string.isRequired,\r\n searchLabel: string.isRequired,\r\n showAllFacetsLabel: string.isRequired,\r\n showLessFacetsLabel: string.isRequired\r\n};\r\n\r\nexport default FacultyStaffListing;\r\n"],"sourceRoot":""}