PageSourceSearch

https://vellinge.se/sitevision/system-resource/706c47851a9c6e84fdd…77fbc171ef52fc04ec9b767285/js/searchForm.js

js vellinge.se collected 2026-09-24 09:56:15 UTC 7,750 bytes, 2 lines download raw bytes

1"use strict";(globalThis.webpackChunk_sv_portlet=globalThis.webpackChunk_sv_portlet||[]).push([[6569],{7140(e,t,s){s.d(t,{initSearchForm:()=>r});var i=s(7834),n=s.n(i),o=s(5348);const l=new WeakMap,r=e=>{const t=e.querySelector(o.Tf),s=t?t.form||t.closest("form"):null;if(!t||!s||l.has(t))return;l.set(t,!0);const i=e.querySelector(".sv-searchform-portlet-settings"),r=((e,t,s)=>{const i={};if(s&&Object.assign(i,s.dataset),!i.fnAutoCompleteUrl&&t){const t=n().ObjectUtil.getObjectId(e.id);Object.assign(i,{fnAutoCompleteUrl:`/${n().PageContext.pageId}/${t}.json?state=autoComplete`})}return i})(e,t,i);i&&i.parentNode.removeChild(i),((e,t,s)=>{s.escapedSearchHereText&&t.value===s.escapedSearchHereText&&(t.value="",t.hasAttribute("placeholder")||t.setAttribute("placeholder",s.escapedSearchHereText))})(0,t,r),((e,t)=>{e&&e.addEventListener("submit",e=>{if(""===t.value.replace(/\s/g,""))return e.preventDefault(),!1})})(s,t),r.fnAutoCompleteUrl&&"false"!==t.dataset.useAutocomplete&&(0,o.IQ)(t,{source:r.fnAutoCompleteUrl})}},5348(e,t,s){s.d(t,{IQ:()=>a,Tf:()=>i});const i='input[type="search"], input[type="text"]',n=new WeakMap,o="sv-autocomplete-result-item",l="sv-autocomplete-result-item-active";class r{constructor(e,t){this.options=Object.assign({},t),this.element=e,this.form=e.form||e.closest("form"),this.element.id||(this.element.id=`${this.element.closest(".sv-portlet[id]")?.id}
1_sv-autocomplete`),this.list=this.createList(),this.cache={},this.requestSequence=0,this.abortController=null,this.results=[],this.activeIndex=-1,this.isOpen=!1,this.blurTimer=null,this.positionList(),this.prepareMarkup(),this.bindEvents()}createList(){const e=document.createElement("ul");return e.id=`${this.element.id}_listbox`,e.className="sv-autocomplete-search-result",e.setAttribute("role","listbox"),e.hidden=!0,document.body.insertAdjacentElement("beforeend",e),e}prepareMarkup(){["data-aria-owns","data-aria-controls","role","aria-haspopup","aria-autocomplete","aria-expanded","aria-controls","aria-owns"].forEach(e=>this.element.removeAttribute(e)),this.element.setAttribute("role","combobox"),this.element.setAttribute("aria-haspopup","listbox"),this.element.setAttribute("aria-expanded","false"),this.element.setAttribute("aria-controls",this.list.id),this.element.setAttribute("aria-autocomplete","list"),this.element.setAttribute("autocomplete","off")}handleFocus(){this.element.value.length>=2&&this.updateSuggestions(this.element.value)}handleBlur(){this.blurTimer=window.setTimeout(()=>{this.close()},150)}handleKeydown(e){switch(e.key){case"ArrowDown":return e.preventDefault(),this.isOpen?void this.moveActive(1):void this.updateSuggestions(this.element.value).then(()=>{this.isOpen&&-1===this.activeIndex&&this.moveActive(1)});case"ArrowUp":return e.preventDefault(),this.isOpen?void this.moveActive(-1):void this.updateSuggestions(this.element.value).then(()=>{this.isOpen&&-1===this.activeIndex&&this.moveActive(-1)});case"Enter":return void(this.isOpen&&this.activeIndex>=0&&(e.preventDefault(),this.select(this.activeIndex),this.moveCursorToEnd(),this.form.requestSubmit()));case"Tab":return void(this.isOpen&&this.activeIndex>=0&&(this.select(this.activeIndex),this.moveCursorToEnd()));case"Home":return void(this.isOpen&&(e.preventDefault(),this.moveToIndex(0)));case"End":return void(this.isOpen&&(e.preventDefault(),this.moveToIndex(this.results.length-1)));case"Escape":return void(this.isOpen?(e.preventDefault(),this.close()):this.element.value&&(e.preventDefault(),this.element.value=""))}}handleListMouseDown(e){window.clearTimeout(this.blurTimer),e.preventDefault()}handleListClick(e){const t=e.target.closest(`.${o}`),s=Number(t?.dataset.index);t&&!Number.isNaN(s)&&(this.select(s),this.form.requestSubmit())}handleViewportChange(){this.isOpen&&this.positionList()}bindEvents(){const e=((e,t)=>{let s=null;return(...i)=>{window.clearTimeout(s),s=window.setTimeout(()=>e(...i),t)}})(()=>{this.updateSuggestions(this.element.value)},200);this.element.addEventListener("input",e.bind(this)),this.element.addEventListener("focus",this.handleFocus.bind(this)),this.element.addEventListener("blur",this.handleBlur.bind(this)),this.element.addEventListener("keydown",this.handleKeydown.bind(this)),this.list.addEventListener("mousedown",this.handleListMouseDown.bind(this)),this.list.addEventListener("click",this.handleListClick.bind(this)),window.addEventListener("resize",this.handleViewportChange.bind(this)),window.addEventListener("scroll",this.handleViewportChange.bind(this),!0)}async updateSuggestions(e){if(e.length<2)return void this.close();
1const t=await this.getSuggestions(e);e===this.element.value&&this.renderResults(t)}async getSuggestions(e){const t=this.cache[e],s=++this.requestSequence;if(t&&t.timestamp>Date.now()-3e5)return t.value;if(!this.options.source)return[];this.abortController&&this.abortController.abort();const i=window.AbortController?new window.AbortController:null;this.abortController=i;try{const t={headers:{Accept:"application/json"}};i&&(t.signal=i.signal);const n=await window.fetch(((e,t)=>{const s=-1===e.indexOf("?")?"?":"&";return`${e}${s}term=${encodeURIComponent(t)}`})(this.options.source,e),t);if(s!==this.requestSequence||!n.ok)return[];const o=await n.json(),l=Array.isArray(o)?o.map(String):[];return this.cache[e]={value:l,timestamp:Date.now()},l}catch{return[]}finally{i&&this.abortController===i&&(this.abortController=null)}}renderResults(e){if(this.results=e,this.activeIndex=-1,this.element.removeAttribute("aria-activedescendant"),this.list.innerHTML="",!e.length)return void this.close();const t=document.createDocumentFragment();e.forEach((e,s)=>{const i=document.createElement("li");i.id=`${this.element.id}_listitem_${s}`,i.className=o,i.dataset.index=String(s),i.setAttribute("role","option"),i.setAttribute("aria-selected","false"),i.textContent=e,t.appendChild(i)}),this.list.appendChild(t),this.open()}open(){this.positionList(),this.list.hidden=!1,this.element.setAttribute("aria-expanded","true"),this.isOpen=!0}close(){this.clearActiveItem(),this.activeIndex=-1,this.list.hidden=!0,this.element.setAttribute("aria-expanded","false"),this.element.removeAttribute("aria-activedescendant"),this.isOpen=!1}clearActiveItem(){const e=this.list.querySelector(`.${l}`);e&&(e.classList.remove(l),e.setAttribute("aria-selected","false"))}moveActive(e){const t=this.list.querySelectorAll(`.${o}`);if(!t.length)return;this.clearActiveItem();let s=this.activeIndex+e;s<0?s=t.length-1:s>=t.length&&(s=0),this.moveToIndex(s)}moveToIndex(e){const t=this.list.querySelectorAll(`.${o}`);if(!t.length||e<0||e>=t.length)return;this.clearActiveItem();const s=t[e];this.element.setAttribute("aria-activedescendant",s.id),s.classList.add(l),s.setAttribute("aria-selected","true"),s.scrollIntoView({block:"nearest"}),this.activeIndex=e}select(e){e<0||e>=this.results.length||(this.element.value=this.results[e],this.close())}moveCursorToEnd(){if("function"==typeof this.element.setSelectionRange&&"string"==typeof this.element.value){const e=this.element.value.length;this.element.setSelectionRange(e,e)}}positionList(){const e=this.element.getBoundingClientRect(),t=this.list.offsetParent;let s,i;if(t&&t!==document.body&&t!==document.documentElement){const n=t.getBoundingClientRect();s=e.left-n.left+t.scrollLeft,i=e.bottom-n.top+t.scrollTop}else s=e.left+window.pageXOffset,i=e.bottom+window.pageYOffset;this.list.style.left=`${s}px`,this.list.style.top=`${i}px`,this.list.style.width=`${e.width}px`}}function a(e,t){let s;e&&e.matches&&e.matches(i)?s=e:e&&e.querySelector&&(s=e.querySelector(i));let o=s?n.get(s):null;if(o)return o;const l=s?s.form||s.closest("form"):null;return s&&l&&t&&t.source?(o=new r(s,t),n.set(s,o),o):null}}}]);
2//# sourceMappingURL=searchForm.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.