PageSourceSearch

https://pennyengineering.com/assets/js/ProductSearch.8b30de009ab1dc0c1d0d.js

js pennyengineering.com collected 2026-10-09 21:40:01 UTC 11,335 bytes, 2 lines download raw bytes

1"use strict";(globalThis.webpackChunkpenny_engineering_frontend=globalThis.webpackChunkpenny_engineering_frontend||[]).push([[912],{4676:(e,a,l)=>{l.d(a,{i:()=>n});const t=(e,a)=>{("object"==typeof e?e:document.querySelector(e)).classList.add(a)},r=(e,a)=>{("object"==typeof e?e:document.querySelector(e)).classList.remove(a)},u=(e,a)=>("object"==typeof e?e:document.querySelector(e)).classList.contains(a),n=()=>{let e=document.querySelectorAll("[data-float-labels]");for(let a of[...e]){let e=a.dataset.floatLabelsClassPrefix||"field",l=["[type=text]","[type=email]","[type=password]","[type=tel]","textarea","select","[data-float-label]"],t=a.querySelectorAll(l.join(","));i(e,t)}},i=(e,a)=>{for(let l of a){let a=l.parentElement;u(a,e)&&(t(a,`${e}--floated-label`),s(l)?t(a,`${e}--floated-label-dirty`):r(a,`${e}--floated-label-dirty`),l.addEventListener("input",()=>{s(l)?t(a,`${e}--floated-label-dirty`):r(a,`${e}--floated-label-dirty`)}),l.placeholder="")}},s=e=>null!==e.value&&void 0!==e.value&&""!==e.value;n()},8489:(e,a,l)=>{l.r(a),l.d(a,{default:()=>T});var t=l(1425),r=l(4676);const u={class:"product-search"},n={class:"product-search__inner"},i={"data-float-labels":"","data-float-labels-class-prefix":"form-field",class:"product-search__controls"},s={class:"form-field"},o=["onKeydown"],c={class:"form-field"},v=["value"],d={key:0,class:"form-field"},p=["value","data-level"],f={for:"category"},m={class:"mt-2"},y={key:0},h={key:2},g={key:3,class:"search-results__summary"},k={key:0},b={key:0},_={key:0,class:"product-card-list mt-2"},E=["href","title"],L={class:"product-card__image"},C=["src","alt"],w=["innerHTML","title"],P={class:"product-card__price"},S="productSearch",K="productCategory",R="productType",T=Object.assign({name:"ProductSearch"},{__name:"ProductSearch",props:{rootId:{type:Number},initialItems:{type:Array,default:()=>[]},initialSearchTerm:{type:String,default:""},initialTotalPages:{type:Number,default:1},initialTotalResults:{type:Number,default:0},currency:{type:String,default:"GBP"},categories:{type:Array,default:()=>[]}},setup(e){const a=e=>(e||"").toString().trim().toLowerCase().replace(/[\s_]+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,""),T=(e="")=>String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;"),Q=e,W=[{value:"Spare Part",label:"Spare Parts"},{value:"Accessory",label:"Accessories"}],X=(0,t.KR)(""),I=(0,t.EW)(()=>(X.value||"").trim()||""),$=(0,t.EW)(()=>{const e=(J.value||"").trim(),a=I.value;return e&&a?`${e} (${a})`:e||(a||"")}),F=(0,t.EW)(()=>(Q.categories||[]).filter(e=>e&&"number"==typeof e.id)),N=(0,t.EW)(()=>F.value.find(e=>null==e.parentId)||null),x=(0,t.EW)(()=>{if(!N.value)return[];const e=N.value.id;return F.value.filter(a=>a.parentId===e).map(e=>({id:e.id,key:String(e.id),name:e.name,indentLevel:0}))}),j=(0,t.EW)(()=>"Category"),q=(0,t.KR)(""),A=(0,t.EW)(()=>{if(!q.value)return null;const e=parseInt(q.value,10);return Number.isNaN(e)?null:e}),U=(0,t.EW)(()=>{if(!N.value)return"";if(A.value){const e=F.value.find(e=>e.id===A.value);if(e)return e.name}return N.value.name}),B=(0,t.KR)(null),V=(0,t.KR)(Q.initialSearchTerm),Y=(0,t.KR)([...Q.initialItems]),M=(0,t.KR)(Q.initialTotalPages||1),H=(0,t.KR)(Y.value.length?1:0),O=(0,t.KR)(!1),z=(0,t.KR)(Q.initialTotalResults||Y.value.length||0),G=(0,t.EW)(()=>V.value.trim().length),D=(0,t.EW)(()=>{const e=G.value;return e>0&&e<3}),J=(0,t.KR)(Q.initialSearchTerm||""),Z=(0,t.KR)(!1),ee=(0,t.KR)(!1),ae=(0,t.KR)(!1),le=(0,t.KR)(!1),te=(0,t.KR)("none"),re=(0,t.EW)(()=>{const e=!!N.value||!!A.value,a=!!X.value;return e||a}),ue=(e,l,t)=>{try{const r=new URL(window.location.href),u=(e||"").trim();let n="";if(l){const e=parseInt(l,10);if(!Number.isNaN(e)){const l=F.value.find(a=>a.id===e);l?.name&&(n=a(l.name))}}u&&u.length>=3?r.searchParams.set(S,u):r.searchParams.delete(S),n?r.searchParams.set(K,n):r.searchParams.delete(K);const i=t?a(t):"";i?r.searchParams.set(R,i):r.searchParams.delete(R),window.history.replaceState({},"",r)}catch{}},ne=(0,t.KR)(null);let ie=null;const se=(0,t.EW)(()=>!Z.value&&Y.value.length>0&&H.value<M.value),oe=()=>{ne.value&&se.value?(ie&&ie.disconnect(),ie=new IntersectionObserver(e=>
1{e.forEach(e=>{e.isIntersecting&&se.value&&me()})},{root:null,threshold:.25}),ie.observe(ne.value)):ie&&(ie.disconnect(),ie=null)},ce=e=>{if("number"!=typeof e)return e;try{return new Intl.NumberFormat("en-GB",{style:"currency",currency:Q.currency}).format(e)}catch{return`£${e.toFixed(2)}`}},ve=e=>{const a=J.value.trim(),l=e||"";if(!a||a.length<3||!l)return T(l);const t=T(l),r=new RegExp(`(${((e="")=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"))(a)})`,"gi");return t.replace(r,'<span class="search-result__highlight">$1</span>')},de=async()=>{B.value||(B.value=await Promise.all([l.e(83),l.e(295)]).then(l.bind(l,1324)).then(e=>e.default))},pe=async(e=1,a,l=!1)=>{if(Z.value)return;const r=((a??V.value)||"").trim();if(!r&&!l)return;const u=0===r.length;O.value=!0,Z.value=!0;try{await de();const a={query:r,page:e,root:Q.rootId||1252},l=(()=>{if(N.value)return A.value?A.value.toString():N.value.id.toString()})();l&&(a.categories=l);const n=(X.value||"").trim()||void 0;n&&(a.productType=n);const{data:i}=await B.value.get("/api/search/products",{params:a}),s=i.items||i.Items||[],o=i.totalPages??i.TotalPages??1,c=i.totalResults??i.TotalResults??0,v=(i.searchTerm??i.SearchTerm??r)||"";1===e?Y.value=s:Y.value.push(...s),M.value=o,H.value=e,z.value=c,u?(J.value="",te.value="filters"):(J.value=v,te.value="text",ee.value=!0,V.value=v,await(0,t.dY)(),ee.value=!1),ue(u?"":v,q.value||"",X.value||""),await(0,t.dY)(),oe()}catch{}finally{Z.value=!1}},fe=()=>{const e=V.value.trim();!e||e.length<3||pe(1,e,!1)},me=()=>{if(!se.value)return;const e=(J.value||"").trim(),a=0===e.length;pe(H.value+1,e,a)};let ye=null;return(0,t.wB)(()=>V.value,e=>{if(ee.value)return;ye&&clearTimeout(ye);const a=e.trim();if(!a||a.length<3)return O.value=!0,J.value="",re.value?"filters"!==te.value?pe(1,"",!0):ue
1("",q.value||"",X.value||""):("none"!==te.value&&(Y.value=[...Q.initialItems],z.value=Q.initialTotalResults||Q.initialItems.length||0,M.value=Q.initialTotalPages||1,H.value=Y.value.length?1:0,te.value="none"),ue("","","")),void(ie&&(ie.disconnect(),ie=null));ye=setTimeout(()=>{a!==J.value&&pe(1,a,!1)},300)}),(0,t.wB)(()=>q.value,()=>{if(ae.value)return;const e=V.value.trim();!e||e.length<3?pe(1,"",!0):pe(1,e,!1)}),(0,t.wB)(()=>X.value,()=>{if(le.value)return;const e=V.value.trim();!e||e.length<3?pe(1,"",!0):pe(1,e,!1)}),(0,t.wB)([se,ne],()=>{(0,t.dY)().then(()=>oe())}),(0,t.sV)(async()=>{let e=(Q.initialSearchTerm||"").trim(),l="",u="";try{const t=new URL(window.location.href),r=(t.searchParams.get(S)||"").trim(),n=(t.searchParams.get(K)||"").trim(),i=(t.searchParams.get(R)||"").trim();if(r&&(e=r),n){const e=a(n),t=F.value.find(l=>a(l.name)===e);t&&(l=String(t.id))}if(i){const e=a(i),l=W.find(l=>a(l.value)===e);l&&(u=l.value)}}catch{}ae.value=!0,le.value=!0,l&&(q.value=l),u&&(X.value=u),ae.value=!1,le.value=!1,e&&e.length>=3?(ee.value=!0,V.value=e,await(0,t.dY)(),ee.value=!1,await pe(1,e,!1)):l||u?await pe(1,"",!0):te.value="none",await(0,t.dY)(),(0,r.i)()}),(0,t.$u)(()=>{(0,r.i)()}),(0,t.hi)(()=>{ie&&(ie.disconnect(),ie=null),ye&&clearTimeout(ye),Z.value=!1}),(e,a)=>((0,t.uX)(),(0,t.CE)("section",u,[(0,t.Lk)("div",n,[(0,t.Q3)(" Search input + filters "),(0,t.Lk)("div",i,[(0,t.Q3)(" Search term "),(0,t.Lk)("div",s,[(0,t.bo)((0,t.Lk)("input",{id:"product-search",type:"text","onUpdate:modelValue":a[0]||(a[0]=e=>V.value=e),onKeydown:(0,t.jR)((0,t.D$)(fe,["prevent"]),["enter"]),autocomplete:"off"},null,40,o),[[t.Jo,V.value]]),a[3]||(a[3]=(0,t.Lk)("label",{for:"product-search"},"Search for products",-1))]),(0,t.Q3)(" Product Type "),(0,t.Lk)("div",c,[(0,t.bo)((0,t.Lk)("select",{id:"product-type","onUpdate:modelValue":a[1]||(a[1]=e=>X.value=e),"data-float-label":""},[a[4]||(a[4]=(0,t.Lk)("option",{value:""},null,-1)),((0,t.uX)(),(0,t.CE)(t.FK,null,(0,t.pI)(W,e=>(0,t.Lk)("option",{key:`ptype-${e.value}`,value:e.value},(0,t.v_)(e.label),9,v)),64))],512),[[t.u1,X.value]]),a[5]||(a[5]=(0,t.Lk)("label",{for:"product-type"},"Product Type",-1))]),(0,t.Q3)(" Category filter "),x.value.length?((0,t.uX)(),(0,t.CE)("div",d,[(0,t.bo)((0,t.Lk)("select",{id:"category","onUpdate:modelValue":a[2]||(a[2]=e=>q.value=e),"data-float-label":""},[a[6]||(a[6]=(0,t.Lk)("option",{value:""},null,-1)),((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(x.value,e=>((0,t.uX)(),(0,t.CE)("option",{key:`category-${e.id}`,value:e.key,"data-level":e.indentLevel,class:(0,t.C4)({"category-option--top":0===e.indentLevel,"category-option--child":e.indentLevel>0})},(0,t.v_)((e=>e.name)(e)),11,p))),128))],512),[[t.u1,q.value]]),(0,t.Lk)("label",f,(0,t.v_)(j.value),1)])):(0,t.Q3)("v-if",!0)]),(0,t.Lk)("div",m,[(0,t.Q3)(" No term yet "),O.value||Z.value||0!==Y.value.length||0!==G.value?D.value&&!Z.value?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.Q3)(" User started typing but is under MIN_CHARS "),(0,t.Lk)("p",{class:"search-results__hint"}," Type at least "+(0,t.v_)(3)+" characters to search for products. ")],2112)):(0,t.Q3)("v-if",!0):((0,t.uX)(),(0,t.CE)("p",y," Start typing at least "+(0,t.v_)(3)+" characters to search for products. ")),(0,t.Q3)(" No results for a valid search "),O.value&&!Z.value&&0===Y.value.length?((0,t.uX)(),(0,t.CE)("p",h," No products found. ")):(0,t.Q3)("v-if",!0),(0,t.Q3)(" Result count "),z.value>0&&!Z.value&&($.value.trim()||U.value)?((0,t.uX)(),(0,t.CE)("p",g,[$.value.trim()?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.eW)((0,t.v_)(z.value)+" product",1),1!==z.value?((0,t.uX)(),(0,t.CE)("span",k,"s")):(0,t.Q3)("v-if",!0),(0,t.eW)(" for “"+(0,t.v_)($.value)+"” ",1),U.value?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)(" in "+(0,t.v_)(U.value),1)],64)):(0,t.Q3)("v-if",!0),a[7]||(a[7]=(0,t.eW)(". ",-1))],64)):U.value?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)((0,t.v_)(z.value)+" product",1),1!==z.value?((0,t.uX)(),(0,t.CE)("span",b,"s")):(0,t.Q3)("v-if",!0),(0,t.eW)(" in "+(0,t.v_)(U.value)+". ",1)],64)):(0,t.Q3)("v-if",!0)])):(0,t.Q3)("v-if",!0)]),(0,t.Q3)(" Product results grid "),Y.value.length?((0,t.uX)(),(0,t.CE)("div",_,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(Y.value,(e,l)=>((0,t.uX)(),(0,t.CE)("a",{key:e.url||l,href:e.url,class:"product-card product-card--boxed",title:`Click to see more information regarding our ${e.name}`},[(0,t.Lk)("div",L,[(0,t.Lk)("img",{src:e.imageUrl||"/assets/images/search-placeholder.jpg",alt:e.name||"Product image",loading:"lazy"},null,8,C)]),(0,t.Lk)("h3",{innerHTML:ve(e.name),class:"product-card__title",title:e.name},null,8,w),(0,t.Lk)("span",P,[e.isQuoteOnlyProduct?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.eW)(" Contact For Price ")],64)):e.hasChildVariants?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.eW)(" From "+(0,t.v_)(ce(e.displayPrice)),1)],64)):((0,t.uX)(),(0,t.CE)(t.FK,{key:2},[(0,t.eW)((0,t.v_)(ce(e.displayPrice)),1)],64))]),a[8]||(a[8]=(0,t.Lk)("p",{class:"product-card__link"},"View Product",-1))],8,E))),128))])):(0,t.Q3)("v-if",!0),(0,t.Q3)(" Infinite scroll sentinel "),se.value?((0,t.uX)(),(0,t.CE)("div",{key:1,ref_key:"loadMoreTrigger",ref:ne,class:"product-search__sentinel","aria-hidden":"true"},null,512)):(0,t.Q3)("v-if",!0)])]))}})}}]);
2//# sourceMappingURL=ProductSearch.8b30de009ab1dc0c1d0d.js.map

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.