Disclaimer: This website requires JavaScript to function properly. Some features may not work as expected. Please enable JavaScript in your browser settings for the best experience.

HomeDev guideRecipesAPI Reference
Dev guideUser GuidesLegal TermsNuGetDev CommunityOptimizely AcademySubmit a ticketLog In
Dev guide

Apply facets to the search page

This tutorial applies facets to the search page for the Music Festival site.

Prerequisites

Tutorial

  1. Go to graphql folder (/decoupled-site/react-script/src/graphql).

  2. Open ArtistSearch.graphql file.

  3. Add the following code to the file under items, and save.

    facets {
       ArtistName(orderBy: ASC, orderType: VALUE, limit: 100){
         name
         count
       }
       StageName(orderBy: ASC, orderType: VALUE, limit: 100){
         name
         count
       }
     }
    
  4. Open OtherContentSearch.graphql, add the following code under items, and save.

    facets{
       Name(orderBy: ASC, orderType: VALUE, limit: 100){
         name
         count
       }
     }
    
  5. Go to the search page of Music Festival site (/decoupled-site/react-script/src/pages/SearchPage.tsx).

  6. Replace the whole <div className="search-panel"> with the following code, and save the changes.

    <div className="search-panel">
                     <div className="left-panel">
                         <b>Filter by: </b>
                         <div className="facets" style={filterBy == "Artist" ? {display: "inherit"}: {display: "none"}}>
                             <b>Artist Name: </b>
                             {
                                 data?.ArtistDetailsPage?.facets?.ArtistName?.map((artist) => {
                                     return (
                                         <div>
                                             <a key={artist?.name} onClick={(event) => handleFacetClick(event)}>
                                                 <span>{artist?.name}</span>
                                                 &nbsp;
                                                 <b>({artist?.count})</b>
                                             </a>
                                         </div>
                                     )
                                 })
                             }
                         </div>
                         <div className="facets" style={filterBy == "Artist" ? {display: "inherit"}: {display: "none"}}>
                             <b>Stage Name: </b>
                             {
                                 data?.ArtistDetailsPage?.facets?.StageName?.map((artist) => {
                                     return (
                                         <div>
                                             <a key={artist?.name} onClick={(event) => handleFacetClick(event)}>
                                                 <span>{artist?.name}</span>
                                                 &nbsp;
                                                 <b>({artist?.count})</b>
                                             </a>
                                         </div>
                                     )
                                 })
                             }
                         </div>
                         <div className="facets" style={filterBy == "OtherContent" ? {display: "inherit"}: {display: "none"}}>
                             <b>Content: </b>
                             {
                                 otherData?.Content?.facets?.Name?.map((content) => {
                                     return (
                                         <div>
                                             <a key={content?.name} onClick={(event) => handleFacetClick(event)}>
                                                 <span>{content?.name}</span>
                                                 &nbsp;
                                                 <b>({content?.count})</b>
                                             </a>
                                         </div>
                                     )
                                 })
                             }
                         </div>
                     </div>
                     <div className="right-panel">
                         <div className="search-description">
                             <h6>Your search for <span className="search-term">{queryString}</span> resulted in <span className="search-term">{filterBy == "Artist" ? resultNumber : otherResultNumber}</span> hits</h6>                            
                         </div>
                         <div className="search-sorting">
                             <span>Sort: </span>
                             <select onChange={e => handleChange(e)} className="Button">
                                 {
                                     options.map((option) => {
                                         return (
                                             <option key={option.key} value={option.key}>{option.value}</option>
                                         )
                                     })
                                 }
                             </select>
                         </div>
                         <div className="result-block">
                             <div style={filterBy == "Artist" ? {display: "initial"}: {display: "none"}}>
                                 <div className="search-results">
                                     {
                                         currentItems?.map((content, idx) => {
                                             return (
                                                 <div className="result" key={idx}>
                                                     <div className="card">
                                                         <div className="round">
                                                             <img className="ConditionalImage"
                                                                 src={getImageUrl(content?.ArtistPhoto ?? '')}
                                                                 alt={content?.ArtistName ?? ''} />
                                                         </div>
                                                         <div className="info">
                                                             <a href={content?.RelativePath ?? ''} className="EPiLink">
                                                                 <p className="result-name">{content?.ArtistName}</p>
                                                             </a>
                                                         </div>
                                                     </div>                             
                                                     <div>
                                                         <p className="result-description">{content?.ArtistDescription}</p>
                                                     </div>
                                                 </div>
                                             )
                                         })
                                     }
                                 </div>
                                 <div className="search-description">
                                     <h6>People also search for: </h6>
                                     <br></br>
                                     {
                                         autocompleteData?.ArtistDetailsPage?.autocomplete?.ArtistName?.map((name) => {
                                             return (
                                                 <div>
                                                     <a key={name} onClick={(event) => handleFacetClick(event)}>                                                    
                                                         <i>{name}</i>
                                                     </a>
                                                 </div>
                                             )
                                         })
                                     }
                                     {
                                         autocompleteData?.ArtistDetailsPage?.autocomplete?.StageName?.map((name) => {
                                             return (
                                                 <div>
                                                     <a key={name} onClick={(event) => handleFacetClick(event)}>                                                    
                                                         <i>{name}</i>
                                                     </a>
                                                 </div>
                                             )
                                         })
                                     }
                                 </div>
                                 <div className="search-pagination-block">
                                     <table>
                                         <tbody>
                                         <tr>
                                             <td>
                                                 <span>Items per page: </span>
                                                 <select className="Button" onChange={handleItemsChange}>
                                                     {
                                                         itemsPerPageOptions.map((option) => {
                                                             return (
                                                                 <option key={option.key} value={option.key}>{option.value}</option>
                                                             )
                                                         })
                                                     }
                                                 </select>
                                             </td>
                                             <td className="search-pagination">
                                                 <ReactPaginate
                                                     breakLabel="..."
                                                     nextLabel=">"
                                                     onPageChange={handlePageClick}
                                                     pageRangeDisplayed={5}
                                                     pageCount={pageCount}
                                                     previousLabel="<"
                                                     renderOnZeroPageCount={null}
                                                 />
                                             </td>
                                         </tr>
                                         </tbody>
                                     </table>
                                 </div>
                             </div>
                             <div style={filterBy == "OtherContent" ? {display: "initial"}: {display: "none"}}>
                                 <div className="search-results">
                                     {
                                         currentOtherItems?.map((content, idx) => {
                                             return (
                                                 <div className="result" key={idx}>
                                                     <div className="card">
                                                         <i className="fa fa-file"></i>
                                                         &nbsp;
                                                         <div className="info">
                                                             <a href={content?.RelativePath ?? ''} className="EPiLink">
                                                                 <p className="result-name">{content?.Name}</p>
                                                             </a>
                                                         </div>
                                                     </div>                             
                                                     <div>
                                                         <p className="result-description">{content?.RelativePath}</p>
                                                     </div>
                                                 </div>
                                             )
                                         })
                                     }
                                 </div>
                                 <div className="search-pagination-block">
                                     <table>
                                         <tbody>
                                         <tr>
                                             <td>
                                                 <span>Items per page: </span>
                                                 <select className="Button" onChange={handleOtherItemsChange}>
                                                     {
                                                         itemsPerPageOptions.map((option) => {
                                                             return (
                                                                 <option key={option.key} value={option.key}>{option.value}</option>
                                                             )
                                                         })
                                                     }
                                                 </select>
                                             </td>
                                             <td className="search-pagination">
                                                 <ReactPaginate
                                                     breakLabel="..."
                                                     nextLabel=">"
                                                     onPageChange={handleOtherPageClick}
                                                     pageRangeDisplayed={5}
                                                     pageCount={pageOtherCount}
                                                     previousLabel="<"
                                                     renderOnZeroPageCount={null}
                                                 />
                                             </td>
                                         </tr>
                                         </tbody>
                                     </table>
                                 </div>
                             </div>
                         </div>
                     </div>
                 </div>
    
  7. Run the site. From now on, there is a left column on the search page displaying the facets.