{"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":""}