1"use strict";(self.webpackChunkpattern_library=self.webpackChunkpattern_library||[]).push([[872],{7067(e,t,s){s.r(t),s.d(t,{JobsListing:()=>i});var r=s(/*! ../../../../core/js/utils/sequence-animation */1073);class i{constructor(e){this.container=e,this.results=[],this.totalCount=0,this.freshRequest=!0,this.skip=0,this.take=9,this.searchForm=this.container.querySelector(".js-search-form"),this.searchInput=this.container.querySelector(".js-search-input"),this.searchButton=this.container.querySelector(".js-search-button"),this.containers=this.container.querySelectorAll("[data-param]"),this.filters=this.container.querySelectorAll("[data-param] .js-filter-input"),this.clear=this.container.querySelector(".js-clear"),this.clearFilters=this.container.querySelector(".js-clear-filters"),this.resultQuery=this.container.querySelector(".js-result-query"),this.resultCount=this.container.querySelector(".js-result-count"),this.resultsContainer=this.container.querySelector(".js-results"),this.noResults=this.container.querySelector(".js-no-results"),this.loadMoreButton=this.container.querySelector(".js-load-more-button"),this.loadMore=this.container.querySelector(".js-load-more"),this.colourMap={"Cross Functional":"green","Customer Service":"purple",Development:"electric-blue",Finance:"purple","Go To Market":"green",IT:"electric-blue",Legal:"eb-test",Marketing:"dark-turquoise",Product:"lilac"},this.init()}init(){this.handleSearch(),this.handleFilters(),this.handleClearFilters(),this.handlePagination(),this.requestResults(),this.setDisplayStates()}static getCurrentParams(){const e=new URL(window.location.href),t=new URLSearchParams(e.search);return{query:t.get("query")||"",location:t.get("location")?t.get("location").split(","):[],employeeType:t.get("employeeType")?t.get("employeeType").split(","):[],timeType:t.get("timeType")?t.get("timeType").split(","):[],sort:t.get("sort")?t.get("sort").split(","):[],category:t.get("category")?t.get("
1category").split(","):[]}}cardTemplate(e){const{jobFamilies:t,locations:s,positionTimeType:r,title:i,url:a}=e;return`\n <a class="job-card__link" href="${a}">\n <p class="job-card__tags">\n ${t.map(e=>`<span class="tag eyebrow-text ${this.colourMap[e]||"charcoal"}">${e}</span>`).join("")}\n </p>\n\n <h2 class="job-card__title">\n ${i}\n </h2>\n\n <p class="job-card__timeType">\n ${r}\n </p>\n\n <p class="job-card__locations">\n ${s.map(e=>`${e}`).join(", ")}\n </p>\n </a>`}displayResults(){this.freshRequest&&(this.resultQuery.innerHTML=this.searchInput.value?`Search results for "${this.searchInput.value}" - `:"",this.resultCount.innerHTML=this.totalCount,this.resultsContainer.innerHTML="");const e=document.createDocumentFragment();(this.freshRequest?this.results:this.results.slice(this.skip,this.skip+this.take)).forEach(t=>{const s=document.createElement("div");s.classList.add("job-card"),s.innerHTML=this.cardTemplate(t),e.appendChild(s)}),this.resultsContainer.appendChild(e),this.freshRequest&&new r.A(this.resultsContainer,{wrap:!1}),this.loadMore&&this.loadMore.classList[this.totalCount>9&&this.results.length<this.totalCount?"add":"remove"]("is-active"),this.noResults&&this.noResults.classList[this.totalCount>0?"remove":"add"]("is-active")}async requestResults(e=!0){this.freshRequest=e,this.freshRequest&&(this.skip=0,this.take=9);const{query:t,location:s,employeeType:r,timeType:a,sort:n,category:o}=i.getCurrentParams(),l=`${this.container.dataset.endpoint}?skip=${this.skip}&take=${this.take}&query=${t}&location=${s}&employeeType=${r}&timeType=${a}&sort=${n}&category=${o}`;try{const e=await fetch(l),t=await e.json(),{results:s,totalCount:r}=t;this.results=this.freshRequest?s:[...this.results,...s],this.totalCount=r,this.displayResults()}catch(e){console.error(e)}}setDisplayStates(){const e=i.getCurrentParams();if(this.searchInput.value=e.query,this.filters.forEach(t=>{const s=t.closest("[data-param]");if(!s)return;const r=s.dataset.param,i=r&&e[r]&&e[r].includes(t.dataset.filter);if("INPUT"===t.nodeName){t.checked=i}else"BUTTON"===t.nodeName&&t.setAttribute("aria-pressed",i?"true":"false")}),this.containers.forEach(t=>{const s=t.querySelector(".js-count");if(s){const r=t.dataset.param,i=r&&e[r]&&e[r].length>0;s.innerHTML=i?`(${e[r].length})`:""}}),this.clear){const t=Object.keys(e),s=t.some(s=>t.includes(s)&&e[s].length);this.clear.classList[s?"add":"remove"]("is-active")}}handleQuery(e="",t="",s=!1){const r=new URL(window.location.href),i=new URLSearchParams(r.
1search),a=i.get(e)&&!s?i.get(e).split(","):[],n=(a.includes(t)?a.filter(e=>e!==t):[...a,t]).filter(e=>e&&e.trim().length);n.length?i.set(e,n.join(",")):i.delete(e),r.search=i.toString(),window.history.replaceState(null,"",r.href),this.requestResults(),this.setDisplayStates()}handleSearch(){const e=e=>{e.preventDefault(),this.handleQuery("query",this.searchInput.value.trim(),!0)};this.searchForm.addEventListener("submit",t=>e(t))}handleFilters(){const e=(e,t)=>{e.preventDefault();const s=e.target,r=Boolean("INPUT"===s.nodeName&&"radio"===s.type);this.handleQuery(t,s.dataset.filter,r)};this.filters.forEach(t=>{const s=t.closest("[data-param]");if(!s)return;const r=s.dataset.param,i="INPUT"===t.nodeName?"change":"click";t.addEventListener(i,t=>e(t,r))})}handleClearFilters(){const e=e=>{e.preventDefault();const t=new URL(window.location.href),s=new URLSearchParams(t.search);s.delete("category"),s.delete("employeeType"),s.delete("location"),s.delete("query"),s.delete("sort"),s.delete("timeType"),t.search=s.toString(),window.history.replaceState(null,"",t.href),this.requestResults(),this.setDisplayStates()};this.clearFilters&&this.clearFilters.addEventListener("click",t=>e(t))}handlePagination(){const e=e=>{e.preventDefault(),this.skip+=this.freshRequest?this.skip+this.take:this.take,this.take=3,this.requestResults(!1)};this.loadMoreButton&&this.loadMoreButton.addEventListener("click",t=>e(t))}}const a=e=>new i(e);s.dn(a),s.d(t,["default",0,a])}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.