{"version":3,"file":"index-CBdao850.js","sources":["../../src/scripts/modules/react-modules/Listings/ProgramsAndCertificatesListing/useGetProgramsAndCertsListing.ts","../../src/scripts/modules/react-modules/Listings/ProgramsAndCertificatesListing/index.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { GraphQLClient } from 'graphql-request';\nimport { useEffect, useState, useMemo } from 'react';\nimport {\n  ProgramListingDocument,\n  ProgramListingQuery,\n  ProgramDetailPageOutput\n} from '../../../../../codegenGenerated/optigraphql/generated';\nimport { getEnvGQLUrl } from '../../../../helpers';\nimport { ListingParams } from '../types';\nimport { getFacetValueById } from '../utils';\n\nconst graphQLClient = new GraphQLClient(getEnvGQLUrl());\n\nexport enum ProgramsAndCertificatesFacetTypes {\n  ProgramTypeFacet = 'ProgramTypeFacet',\n  AreaOfStudyFacet = 'AreaOfStudyFacet',\n  CollegeOrSchoolFacet = 'CollegeOrSchoolFacet',\n  CampusLocationFacet = 'CampusLocationFacet',\n  LocationFacet = 'LocationFacet'\n}\n\ntype ProgramDetailItem = NonNullable<ProgramDetailPageOutput['items']>[number];\n\nexport const useGetProgramsAndCertsListing = (params?: ListingParams) => {\n  const [accumulatedResults, setAccumulatedResults] = useState<ProgramDetailItem[]>([]);\n  const [totalCount, setTotalCount] = useState(0);\n\n  const { orderBy, pagination, searchTerm, facets } = params || {};\n\n  const orderByValue = useMemo(() => {\n    if (!orderBy) return {};\n    if (searchTerm !== '') return { _ranking: 'SEMANTIC' };\n\n    switch (orderBy) {\n      case 'RELEVANCE':\n        return { _ranking: 'SEMANTIC' };\n      case 'ASC':\n        return { StartPublish: 'ASC', _ranking: 'SEMANTIC' };\n      case 'DESC':\n        return { StartPublish: 'DESC', _ranking: 'SEMANTIC' };\n      case 'A-Z':\n        return { ProgramSortableName: 'ASC', _ranking: 'SEMANTIC' };\n      default:\n        return {};\n    }\n  }, [orderBy, searchTerm]);\n\n  const queryKey = useMemo(\n    () => ['programs', facets, pagination?.skip, pagination?.limit, orderBy, searchTerm],\n    [facets, pagination?.skip, pagination?.limit, orderBy, searchTerm]\n  );\n\n  const { isLoading, error, data } = useQuery({\n    queryKey,\n    queryFn: async () =>\n      graphQLClient.request(ProgramListingDocument, {\n        orderBy: orderByValue,\n        numberOfResults: pagination?.limit,\n        skip: pagination?.skip,\n        searchTerm: searchTerm === '' ? null : searchTerm,\n        searchTermBoost: searchTerm ? `%${searchTerm}%` : null,\n        programTypeFacet: facets\n          ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.ProgramTypeFacet)\n          : null,\n        areaOfStudyFacet: facets\n          ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.AreaOfStudyFacet)\n          : null,\n        collegeOrSchoolFacet: facets\n          ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.CollegeOrSchoolFacet)\n          : null,\n        campusLocationFacet: facets\n          ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.CampusLocationFacet)\n          : null,\n        locationFacet: facets\n          ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.LocationFacet)\n          : null\n      }) as ProgramListingQuery,\n    refetchOnWindowFocus: false\n  });\n\n  useEffect(() => {\n    if (data?.ProgramDetailPage?.items) {\n      const newItems = data.ProgramDetailPage.items.filter(\n        (item): item is ProgramDetailItem => item !== null\n      );\n\n      // Reset results if any parameter except pagination.skip has changed\n      const shouldReset = !pagination?.skip || pagination.skip === 0;\n\n      if (shouldReset) {\n        setAccumulatedResults(newItems);\n      } else {\n        setAccumulatedResults((prev: ProgramDetailItem[]) => [...prev, ...newItems]);\n      }\n\n      // Update total count when we get new data\n      const total = data.ProgramDetailPage.total;\n      if (typeof total === 'number') {\n        setTotalCount(total);\n      }\n    }\n  }, [data, pagination?.skip]);\n\n  return {\n    status: error ? 'error' : isLoading ? 'loading' : 'success',\n    error: error as Error,\n    results: accumulatedResults,\n    total: totalCount,\n    facets: data?.ProgramDetailPage?.facets ?? {}\n  };\n};\n","import React, { useEffect, useState } from 'react';\nimport {\n  FilterCategoryModelFacet,\n  ResourceDetailPage\n} from '../../../../../codegenGenerated/optigraphql/generated';\nimport { PaginationType } from '../../../../components/react-components/Pagination';\nimport Facets from '../Facets/Facets';\nimport FacetsMobile from '../Facets/FacetsMobile';\nimport { Listing } from '../Listing';\nimport Search from '../Search';\nimport SearchTags from '../SearchTags';\nimport {\n  FacetProps,\n  FacetPropsItems,\n  ListingCommonProps,\n  ListingTypes,\n  SortOptions\n} from '../types';\nimport { transformToFacetPropsItems } from '../utils';\nimport { useGetProgramsAndCertsListing } from './useGetProgramsAndCertsListing';\nimport { FacetData } from '../Facets/FacetAccordion';\n\ninterface OwnProps extends ListingCommonProps {\n  facets: string;\n  filterLabelProgramType: string;\n  filterLabelAreaOfStudy: string;\n  filterLabelCollegeOrSchool: string;\n  filterLabelLocation: string;\n  filterLabelLocationOnCampusId: string;\n  filterLabelLearnMore: string;\n  applyLabelFallback: string;\n  applyLinkFallback: string;\n  certificateId: string;\n  modeOfStudyLabel: string;\n  programTypeLabel: string;\n  degreesOfferLabel: string;\n  departmentOfferLabel: string;\n  schoolLabel: string;\n  defaultFilter: string;\n}\n\nconst ProgramAndCertificatesListingModule = ({\n  facets,\n  noResultsLabel,\n  clearAllLabel,\n  tagsNoResultsLabel,\n  searchPlaceholder,\n  resultsNumberLabel,\n  resultsNumber,\n  mobileShowResultsLabel,\n  mobileFilterNarrowLabel,\n  mobileAppliedFiltersLabel,\n  filterLabelProgramType,\n  showAllPaginationLabel,\n  filterLabelAreaOfStudy,\n  filterLabelCollegeOrSchool,\n  filterLabelLocation,\n  filterLabelLocationOnCampusId,\n  filterLabelLearnMore,\n  applyLabelFallback,\n  applyLinkFallback,\n  certificateId,\n  modeOfStudyLabel,\n  programTypeLabel,\n  degreesOfferLabel,\n  departmentOfferLabel,\n  schoolLabel,\n  defaultFilter\n}: OwnProps) => {\n  const [isFirstLoad, setIsFirstLoad] = useState(true);\n  const [additionalProps, setAdditionalProps] = useState({});\n  const [prevProgramTypeFacet, setPrevProgramTypeFacet] = useState<FacetPropsItems[]>([]);\n\n  // Get URL params and validate\n  const urlParams = new URLSearchParams(window.location.search);\n  const searchTermUrl = urlParams.get('search-term');\n  const sortUrl = urlParams.get('sort') as SortOptions;\n  const skipUrl = parseInt(urlParams.get('skip') || '0');\n  const limitUrl = parseInt(urlParams.get('limit') || resultsNumber);\n\n  // Initialize state\n  const [searchTerm, setSearchTerm] = useState(searchTermUrl || '');\n  const [orderBy, setOrderBy] = useState<SortOptions>(sortUrl || SortOptions.AZ);\n  const [pagination, setPagination] = useState({\n    skip: skipUrl,\n    limit: limitUrl,\n    total: 0\n  });\n\n  // Parse initial facets from props\n  useEffect(() => {\n    setPrevProgramTypeFacet(JSON.parse(facets));\n  }, [facets]);\n\n  const initialFacets = [\n    {\n      id: 'ProgramTypeFacet',\n      type: 'custom-radio',\n      title: filterLabelProgramType,\n      items: prevProgramTypeFacet,\n      value: defaultFilter ? [defaultFilter] : null\n    },\n    {\n      id: 'AreaOfStudyFacet',\n      type: 'custom-select',\n      title: filterLabelAreaOfStudy,\n      items: [],\n      value: null\n    },\n    {\n      id: 'CollegeOrSchoolFacet',\n      type: 'custom-select',\n      title: filterLabelCollegeOrSchool,\n      items: [],\n      value: null\n    },\n    {\n      id: 'CampusLocationFacet',\n      type: 'custom-select',\n      title: filterLabelLocationOnCampusId,\n      items: [],\n      value: null\n    },\n    {\n      id: 'LocationFacet',\n      type: 'custom-select',\n      title: filterLabelLocation,\n      items: [],\n      value: null\n    }\n  ];\n\n  const [facetsStore, setFacetsStore] = useState<FacetProps[]>(initialFacets);\n\n  // Clean up URL parameters on mount and when validation changes\n  useEffect(() => {\n    const cleanParams: {\n      sort?: SortOptions;\n      skip?: number;\n      limit?: number;\n      searchTerm?: string;\n    } = {};\n\n    // Clean up invalid sort\n    if (sortUrl && !Object.values(SortOptions).includes(sortUrl)) {\n      cleanParams.sort = SortOptions.AZ;\n    }\n\n    // Clean up invalid pagination\n    if (skipUrl < 0) {\n      cleanParams.skip = 0;\n    }\n    if (limitUrl <= 0) {\n      cleanParams.limit = +resultsNumber;\n    }\n\n    // If any parameter needs cleaning, update the URL\n    if (Object.keys(cleanParams).length > 0) {\n      const newUrlParams = new URLSearchParams(window.location.search);\n\n      if (cleanParams.sort !== undefined) {\n        cleanParams.sort === SortOptions.AZ\n          ? newUrlParams.delete('sort')\n          : newUrlParams.set('sort', cleanParams.sort);\n      }\n      if (cleanParams.skip !== undefined) {\n        cleanParams.skip > 0\n          ? newUrlParams.set('skip', cleanParams.skip.toString())\n          : newUrlParams.delete('skip');\n      }\n      if (cleanParams.limit !== undefined) {\n        cleanParams.limit === +resultsNumber\n          ? newUrlParams.delete('limit')\n          : newUrlParams.set('limit', cleanParams.limit.toString());\n      }\n\n      window.history.replaceState(\n        {},\n        '',\n        `${window.location.pathname}${newUrlParams.toString() ? '?' + newUrlParams.toString() : ''}`\n      );\n    }\n  }, [sortUrl, skipUrl, limitUrl, resultsNumber]);\n\n  // Update URL when state changes\n  const updateUrl = (params: {\n    searchTerm?: string;\n    sort?: SortOptions;\n    skip?: number;\n    limit?: number;\n  }) => {\n    const urlParams = new URLSearchParams(window.location.search);\n\n    if (params.searchTerm !== undefined) {\n      params.searchTerm\n        ? urlParams.set('search-term', params.searchTerm)\n        : urlParams.delete('search-term');\n    }\n    if (params.sort !== undefined) {\n      params.sort !== SortOptions.AZ\n        ? urlParams.set('sort', params.sort)\n        : urlParams.delete('sort');\n    }\n    if (params.skip !== undefined) {\n      params.skip > 0 ? urlParams.set('skip', params.skip.toString()) : urlParams.delete('skip');\n    }\n    if (params.limit !== undefined) {\n      params.limit !== +resultsNumber\n        ? urlParams.set('limit', params.limit.toString())\n        : urlParams.delete('limit');\n    }\n\n    window.history.replaceState(\n      {},\n      '',\n      `${window.location.pathname}${urlParams.toString() ? '?' + urlParams.toString() : ''}`\n    );\n  };\n\n  // Handlers\n  const handleSearchTermChange = (newSearchTerm: string) => {\n    setSearchTerm(newSearchTerm);\n    setPagination(prev => ({ ...prev, skip: 0 }));\n    updateUrl({ searchTerm: newSearchTerm, skip: 0 });\n  };\n\n  const handleFacetsChange = (newFacets: FacetProps[]) => {\n    setFacetsStore(newFacets);\n    setPagination(prev => ({ ...prev, skip: 0 }));\n\n    // Update URL with facet selections\n    const urlParams = new URLSearchParams(window.location.search);\n\n    // Clear existing facet params\n    Array.from(urlParams.keys()).forEach(key => {\n      if (key.endsWith('-facet')) {\n        urlParams.delete(key);\n      }\n    });\n\n    // Add new facet params\n    newFacets.forEach(facet => {\n      if (facet.value && Array.isArray(facet.value) && facet.value.length > 0) {\n        urlParams.set(`${facet.id.toLowerCase()}-facet`, facet.value.join(','));\n      }\n    });\n\n    updateUrl({\n      searchTerm: searchTerm,\n      sort: orderBy,\n      skip: 0,\n      limit: pagination.limit\n    });\n\n    window.history.replaceState(\n      {},\n      '',\n      `${window.location.pathname}${urlParams.toString() ? '?' + urlParams.toString() : ''}`\n    );\n  };\n\n  const handleOrderByChange = (newOrderBy: string) => {\n    setOrderBy(newOrderBy as SortOptions);\n    setPagination(prev => ({ ...prev, skip: 0 }));\n    updateUrl({ sort: newOrderBy as SortOptions, skip: 0 });\n  };\n\n  const handlePaginationChange = (newPagination: typeof pagination) => {\n    setPagination(newPagination);\n    updateUrl({ skip: newPagination.skip, limit: newPagination.limit });\n  };\n\n  const {\n    status,\n    results,\n    error,\n    facets: facetsData,\n    total\n  } = useGetProgramsAndCertsListing({\n    pagination: isFirstLoad ? { skip: 0, limit: 0, total: 0 } : pagination,\n    orderBy: !isFirstLoad ? orderBy : undefined,\n    searchTerm: !isFirstLoad ? searchTerm : '',\n    facets: !isFirstLoad ? facetsStore : []\n  });\n\n  // Update total when it changes\n  useEffect(() => {\n    if (total !== pagination.total) {\n      setPagination(prev => ({ ...prev, total }));\n    }\n  }, [total]);\n\n  useEffect(() => {\n    if (!facetsData || !isFirstLoad) return;\n\n    let hasChanges = false;\n    let campusLocationFacetItems: FacetPropsItems[] = [];\n\n    const updatedFacets = facetsStore.map(facet => {\n      const facetData = facetsData[facet.id as keyof typeof facetsData];\n      if (facetData) {\n        const items = transformToFacetPropsItems(facetData as FilterCategoryModelFacet);\n\n        // Get value from URL params if available\n        const urlValue = new URLSearchParams(window.location.search).get(\n          `${facet.id.toLowerCase()}-facet`\n        );\n        let validatedValue = urlValue ? urlValue.split(',') : facet.value;\n\n        // Validate existing selections against new items\n        if (validatedValue && Array.isArray(validatedValue)) {\n          const validValues = validatedValue.filter(val =>\n            items.some(item => item.id === val || item.value === val)\n          );\n          validatedValue = validValues.length ? validValues : null;\n        }\n\n        if (JSON.stringify(facet.items) !== JSON.stringify(items)) {\n          hasChanges = true;\n          return { ...facet, items, value: validatedValue };\n        }\n        return { ...facet, value: validatedValue };\n      }\n      return facet;\n    });\n\n    if (hasChanges) {\n      const locationFacet = updatedFacets.find(facet => facet.id === 'LocationFacet');\n      const campusLocationFacet = updatedFacets.find(facet => facet.id === 'CampusLocationFacet');\n      const programTypeFacet = updatedFacets.find(facet => facet.id === 'ProgramTypeFacet');\n\n      if (campusLocationFacet) {\n        campusLocationFacetItems = [\n          ...campusLocationFacet.items.map(item => ({\n            ...item,\n            id: `on-campus-${item.id}`\n          }))\n        ] as FacetPropsItems[];\n      }\n\n      if (locationFacet) {\n        const { items } = locationFacet;\n        let onCampusLabel: string | undefined;\n        const onCampusIdLabel = filterLabelLocationOnCampusId.split('|');\n\n        locationFacet.items = items.reduce(\n          (acc, item) => {\n            if (item.id === onCampusIdLabel[0]) {\n              onCampusLabel = item.value;\n            } else {\n              acc.push(item);\n            }\n            return acc;\n          },\n          [] as typeof items\n        );\n\n        const shouldDisplayOnCampus = campusLocationFacetItems.length > 0 && !onCampusLabel;\n\n        if (onCampusLabel || shouldDisplayOnCampus) {\n          campusLocationFacetItems.unshift({\n            id: 'on-campus-all',\n            value: onCampusLabel ? onCampusLabel : onCampusIdLabel[1],\n            count: 0\n          });\n        }\n      }\n\n      if (programTypeFacet) {\n        programTypeFacet.items = prevProgramTypeFacet;\n        if (defaultFilter && !programTypeFacet.value) {\n          programTypeFacet.value = [defaultFilter];\n        }\n      }\n\n      if (locationFacet) {\n        locationFacet.items = [...campusLocationFacetItems, ...locationFacet.items];\n      }\n\n      setFacetsStore(updatedFacets);\n      setIsFirstLoad(false);\n    }\n  }, [facetsData, isFirstLoad, prevProgramTypeFacet, defaultFilter, filterLabelLocationOnCampusId]);\n\n  // Update additional props\n  useEffect(() => {\n    if (facetsStore && facetsStore.length > 0) {\n      const programTypeFacet = facetsStore.find(facet => facet.id === 'ProgramTypeFacet');\n      let selected = '';\n      if (\n        programTypeFacet?.value &&\n        Array.isArray(programTypeFacet.value) &&\n        programTypeFacet.value.length > 0\n      ) {\n        const selectedId = programTypeFacet.value[0];\n        const filteredItems = programTypeFacet.items.filter(item => item.id === selectedId);\n        selected = filteredItems.length > 0 ? filteredItems[0].value : '';\n      }\n      setAdditionalProps(prev => ({\n        ...prev,\n        listingHeadingTitle: `${selected} ${filterLabelProgramType}`,\n        learnMore: filterLabelLearnMore,\n        applyLabelFallback: applyLabelFallback,\n        applyLinkFallback: applyLinkFallback,\n        certificateId: certificateId\n      }));\n    }\n  }, [\n    facetsStore,\n    filterLabelProgramType,\n    filterLabelLearnMore,\n    applyLabelFallback,\n    applyLinkFallback,\n    certificateId\n  ]);\n\n  return (\n    <>\n      <div className=\"listing-heading\">\n        <div className=\"listing-heading__single-row\">\n          <Search\n            searchPlaceholder={searchPlaceholder}\n            setStoreSearchTerm={handleSearchTermChange}\n            searchTerm={searchTerm}\n            pagination={pagination}\n            setPagination={handlePaginationChange}\n            ariaLabel=\"Enter Keyword for Programs and Certificates\"\n          />\n        </div>\n\n        <div className=\"listing__facets listing__facets--programs\">\n          {facetsStore.map(({ id, type, items, title, value }) => {\n            let selectedCount = 0;\n            if (id === 'LocationFacet') {\n              const campusLocationFacet = facetsStore.find(\n                facet => facet.id === 'CampusLocationFacet'\n              );\n\n              const locationFacetValuesLength = value?.length || 0;\n              const campusLocationFacetValuesLength = campusLocationFacet?.value?.length || 0;\n\n              selectedCount = locationFacetValuesLength + campusLocationFacetValuesLength;\n            } else {\n              selectedCount = value?.length || 0;\n            }\n\n            return (\n              <Facets\n                key={id}\n                id={id}\n                type={type}\n                items={items}\n                title={title}\n                isMobile={false}\n                facets={facetsStore}\n                setFilters={handleFacetsChange}\n                pagination={pagination}\n                setPagination={handlePaginationChange}\n                selectedCount={selectedCount}\n                listingType={ListingTypes.PROGRAMS_CERTS_LISTING}\n                defaultValue={defaultFilter}\n              />\n            );\n          })}\n        </div>\n\n        <div className=\"listing-heading__results\">\n          <SearchTags\n            resultsNumberLabel={resultsNumberLabel}\n            tagsNoResultsLabel={tagsNoResultsLabel}\n            resultsNumber={results ? results.length : 0}\n            pagination={pagination}\n            facets={facetsStore}\n            setFilters={handleFacetsChange}\n            clearAllLabel={clearAllLabel}\n            setPagination={handlePaginationChange}\n            defaultFilter={defaultFilter}\n            isFirstLoad={isFirstLoad}\n          />\n        </div>\n      </div>\n\n      <Listing\n        id=\"programs-certs-listing\"\n        noResultsLabel={noResultsLabel}\n        resultsNumber={resultsNumber}\n        status={status}\n        results={results as ResourceDetailPage[]}\n        error={error}\n        searchTerm={searchTerm}\n        imgFallback=\"\"\n        showAllPaginationLabel={showAllPaginationLabel}\n        setPagination={handlePaginationChange}\n        pagination={pagination}\n        paginationType={PaginationType.ShowMore}\n        additionalProps={additionalProps}\n        modeOfStudyLabel={modeOfStudyLabel}\n        programTypeLabel={programTypeLabel}\n        degreesOfferLabel={degreesOfferLabel}\n        departmentOfferLabel={departmentOfferLabel}\n        schoolLabel={schoolLabel}\n        listingType={ListingTypes.PROGRAMS_CERTS_LISTING}\n      />\n\n      <FacetsMobile\n        facetsData={facetsData as FacetData}\n        mobileFilterNarrowLabel={mobileFilterNarrowLabel}\n        mobileAppliedFiltersLabel={mobileAppliedFiltersLabel}\n        mobileShowResultsLabel={mobileShowResultsLabel}\n        facets={facetsStore}\n        setFilters={handleFacetsChange}\n        setOrderBy={handleOrderByChange}\n        orderBy={orderBy}\n        pagination={pagination}\n        sortOptions={null}\n        defaultSortValue={SortOptions.AZ}\n        clearAllLabel={clearAllLabel}\n        setPagination={handlePaginationChange}\n        listingType={ListingTypes.PROGRAMS_CERTS_LISTING}\n        searchPlaceholder={searchPlaceholder}\n        setSearchTerm={handleSearchTermChange}\n        searchTerm={searchTerm}\n        defaultFilter={defaultFilter}\n        isFirstLoad={isFirstLoad}\n      />\n    </>\n  );\n};\n\nexport default ProgramAndCertificatesListingModule;\n"],"names":["graphQLClient","GraphQLClient","getEnvGQLUrl","useGetProgramsAndCertsListing","params","accumulatedResults","setAccumulatedResults","useState","totalCount","setTotalCount","orderBy","pagination","searchTerm","facets","orderByValue","useMemo","queryKey","isLoading","error","data","useQuery","ProgramListingDocument","getFacetValueById","useEffect","_a","newItems","item","shouldReset","prev","total","ProgramAndCertificatesListingModule","noResultsLabel","clearAllLabel","tagsNoResultsLabel","searchPlaceholder","resultsNumberLabel","resultsNumber","mobileShowResultsLabel","mobileFilterNarrowLabel","mobileAppliedFiltersLabel","filterLabelProgramType","showAllPaginationLabel","filterLabelAreaOfStudy","filterLabelCollegeOrSchool","filterLabelLocation","filterLabelLocationOnCampusId","filterLabelLearnMore","applyLabelFallback","applyLinkFallback","certificateId","modeOfStudyLabel","programTypeLabel","degreesOfferLabel","departmentOfferLabel","schoolLabel","defaultFilter","isFirstLoad","setIsFirstLoad","additionalProps","setAdditionalProps","prevProgramTypeFacet","setPrevProgramTypeFacet","urlParams","searchTermUrl","sortUrl","skipUrl","limitUrl","setSearchTerm","setOrderBy","SortOptions","setPagination","initialFacets","facetsStore","setFacetsStore","cleanParams","newUrlParams","updateUrl","handleSearchTermChange","newSearchTerm","handleFacetsChange","newFacets","key","facet","handleOrderByChange","newOrderBy","handlePaginationChange","newPagination","status","results","facetsData","hasChanges","campusLocationFacetItems","updatedFacets","facetData","items","transformToFacetPropsItems","urlValue","validatedValue","validValues","val","locationFacet","campusLocationFacet","programTypeFacet","onCampusLabel","onCampusIdLabel","acc","shouldDisplayOnCampus","selected","selectedId","filteredItems","React","Search","id","type","title","value","selectedCount","locationFacetValuesLength","campusLocationFacetValuesLength","Facets","ListingTypes","SearchTags","Listing","PaginationType","FacetsMobile"],"mappings":"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"}