PageSourceSearch

https://raburg.de/theme/78f1a829d5ede1ad74495877001b6b18/js/quote-…-search-quote-line-item.plugin.ts.5ada0e.js

js raburg.de collected 2026-10-10 02:20:56 UTC 11,248 bytes, 19 lines download raw bytes

1"use strict";(self.webpackChunkquote_management=self.webpackChunkquote_management||[]).push([[68060],{59(t,e,s){s.d(e,{A:()=>i});class i{static debounce(t,e){let s,i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return function(){for(var r=arguments.length,a=Array(r),n=0;n<r;n++)a[n]=arguments[n];i&&!s&&setTimeout(t.bind(t,...a),0),clearTimeout(s),s=setTimeout(t.bind(t,...a),e)}}}},60(t,e,s){s.r(e),s.d(e,{default:()=>n});var i=s(220),r=s(59),a=s(83);class n extends i.A{static #t=this.options={inputSelector:"[data-b2b-quick-search-quote-line-item-input]",inputIconSelector:".quote-manage-line-items-modal__input-icon:not([data-b2b-quick-search-quote-line-item-loading-indicator])",loadingIndicatorSelector:"[data-b2b-quick-search-quote-line-item-loading-indicator]",resultListSelector:"[data-b2b-quick-search-quote-line-item-results]",resultListClassName:"quote-manage-line-items-modal__quick-search-results",resultItemClassName:"quote-manage-line-items-modal__quick-search-result",resultTriggerClassName:"quote-manage-line-items-modal__quick-search-result-trigger",resultHighlightClassName:"quote-manage-line-items-modal__quick-search-highlight",noResultClassName:"quote-manage-line-items-modal__quick-search-empty",searchDelay:250,minSearchLength:2,searchLimit:5,scrollThreshold:24,searchProductUrl:"",addLineItemUrl:"",draftVersionId:"",noProductFoundSnippet:"",alreadyPartOfQuoteSnippet:""};init(){this._input=this.el.querySelector(this.options.inputSelector),this._inputIcon=this.el.querySelector(this.options.inputIconSelector),this._loadingIndicator=this.el.querySelector(this.options.loadingIndicatorSelector),this._currentPage=1,this._isAdding=!1,this._isLoading=!1,this._productsById=new Map,this._resultList=this.el.querySelector(this.options.resultListSelector),this._searchTerm="",this._pendingSearchTerm=null,this._selectedProductIds=new Set,this._tooltips=[],this._total=0,this._boundDropdownShow=this._handleDropdownShow.bind(this),this._boundInputKeydown=this._handleInputKeydown.bind(this),this._boundResultClick=this._handleResultClick.bind(this),this._boundResultScroll=this._handleResultScroll.bind(this),this._dropdown=this._createDropdown(),this._registerEvents()}_registerEvents(){this._input&&(this._input.addEventListener("input",r.A.debounce(this._handleInputChange.bind(this),this.options.searchDelay)),this._input.addEventListener("keydown",this._boundInputKeydown),this._input.addEventListener("show.bs.dropdown",this._boundDropdownShow),this._resultList&&this._registerResultListEvents(this._resultList))}_handleInputKeydown(t){"Enter"===t.key&&(t.preventDefault(),t.stopPropagation())}_handleInputChange(){let t=this._input?.value.trim()||"";if(t.length<this.options.minSearchLength){this._clearResults();return}this._searchProducts(t,1).catch(t=>{(0,a.F)(t)})}_handleDropdownShow(t){this._resultList?.children.length||t.preventDefault()}async _searchProducts(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,s=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=this._buildProductSearchUrl(t,e);if(i){if(this._isLoading){s||(this._pendingSearchTerm=t);return}s||(this._clearResults(),this._searchTerm=t,this._currentPage=1,this._total=0),this._isLoading=!0,this._setLoadingState(!0);try{let r=await fetch(i,{credentials:"same-origin",headers:{Accept:"application/json","X-Requested-With":"XMLHttpRequest"}});if(!r.ok)throw Error(`Quote product search failed with status ${r.status}`);let a=await r.json(),n=a.elements||[];this._currentPage=Number.isFinite(Number(a.page))?Number(a.page):e,this._total=Number.isFinite(Number(a.total))?Number(a.total):this._getRenderedResultCount()+n.length,this._renderResults(n,t,s)}finally{this._isLoading=!1,this._setLoadingState(!1)}if(null!==this._pendingSearchTerm&&this._pendingSearchTerm!==this._searchTerm){let t=this._pendingSearchTerm;this._pendingSearchTerm=null,this._searchProducts(t,1).catch(t=>{(0,a.F)(t)});return}this._loadNextPageIfNeeded()}}_setLoadingState(t){this.el.classList.toggle("is-loading",t),this._inputIcon?.classList.toggle("d-none",t),this._loadingIndicator?.classList.toggle("d-none",!t),this._setResultTriggersDisabledState(t)}_buildProductSearchUrl(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;if(!this.options.searchProductUrl)return"";let s=new URL(this.options.searchProductUrl,window.location.origin),i=(this.options.draftVersionId||"").trim(),r
1=Number.parseInt(`${this.options.searchLimit}`,10);return s.searchParams.set("search",t),s.searchParams.set("page",`${e}`),s.searchParams.delete("p"),!Number.isNaN(r)&&r>0&&s.searchParams.set("limit",`${r}`),i&&s.searchParams.set("versionId",i),`${s.pathname}${s.search}${s.hash}`}_renderResults(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=this._getResultList();if(this._disposeTooltips(),s||(this._productsById.clear(),i.innerHTML=""),0===t.length){s||this._renderEmptyResult(i),this._showDropdown(),this._setResultTriggersDisabledState(this._isLoading||this._isAdding),this._initializeTooltips();return}Object.keys(t).forEach(s=>{let r=t[s],a=r.id||"",n=this._isAlreadyPartOfQuote(r)||this._selectedProductIds.has(a);a&&this._productsById.set(a,r),i.insertAdjacentHTML("beforeend",this._createResultItemTemplate(r,e,n))}),this._showDropdown(),this._setResultTriggersDisabledState(this._isLoading||this._isAdding),this._initializeTooltips()}_renderEmptyResult(t){t.insertAdjacentHTML("beforeend",`<li class="${this.options.noResultClassName}">${this._escapeHtml(this.options.noProductFoundSnippet)}</li>`)}_getResultList(){return this._resultList||(this._resultList=document.createElement("ul"),this._resultList.classList.add("dropdown-menu",this.options.resultListClassName),this._resultList.setAttribute("role","listbox"),this._resultList.setAttribute("data-b2b-quick-search-quote-line-item-results",""),this._registerResultListEvents(this._resultList),this.el.append(this._resultList)),this._resultList}_registerResultListEvents(t){t.removeEventListener("click",this._boundResultClick),t.removeEventListener("scroll",this._boundResultScroll),t.addEventListener("click",this._boundResultClick),t.addEventListener("scroll",this._boundResultScroll)}_createDropdown(){return this._input&&"undefined"!=typeof bootstrap&&bootstrap.Dropdown?bootstrap.Dropdown.getOrCreateInstance(this._input,{autoClose:!0,display:"static"}):null}_showDropdown(){this._resultList?.children.length&&this._dropdown?.show()}_hideDropdown(){this._dropdown?.hide()}_handleResultScroll(t){let e=t.target;if(!(e instanceof HTMLUListElement)||this._isLoading||!this._hasMoreResults())return;let s=Number.parseInt(`${this.options.scrollThreshold}`,10);e.scrollHeight-e.scrollTop-e.clientHeight>(Number.isNaN(s)?0:s)||this._searchProducts(this._searchTerm,this._currentPage+1,!0).catch(t=>{(0,a.F)(t)})}_loadNextPageIfNeeded(){let t=this._resultList;t&&!this._isLoading&&this._hasMoreResults()&&!(t.clientHeight<=0)&&!(t.scrollHeight>t.clientHeight)&&this._searchProducts(this._searchTerm,this._currentPage+1,!0).catch(t=>{(0,a.F)(t)})}_createResultItemTemplate(t,e,s){let i=s?`${this.options.resultItemClassName}--already-added`:"",r=this._escapeHtml(t.id||""),a=this._highlightSearchTerm(this._getProductDisplayName(t),e),n=s?`
2                    data-bs-toggle="tooltip"
3                    data-bs-placement="top"
4                    data-bs-container="body"
5                    data-bs-title="${this._escapeHtml(this.options.alreadyPartOfQuoteSnippet)}"
6                `:"";return`
7            <li class="${this.options.resultItemClassName} ${i}" role="option">
8                <button
9                    type="button"
10                    class="${this.options.resultTriggerClassName}"
11                    data-product-id="${r}"
12                    aria-disabled="${s?"true":"false"}"
13                    ${s?'tabindex="-1"':""}
14                    ${n}
15                >
16                    <span>${a}</span>
17                </button>
18            </li>
19        `}_handleResultClick(t){let e=t.target;if(!(e instanceof Element))return;let s=e.closest(`.${this.options.resultTriggerClassName}`);if(!s||!this._resultList?.contains(s)||(t.preventDefault(),"true"===s.getAttribute("aria-disabled")||this._isAdding||this._isLoading))return;let i=this._productsById.get(s.dataset.productId||"");i&&(this._clearResults(),this._addLineItem(i).catch(t=>{(0,a.F)(t)}))}async _addLineItem(t){let e=(this.options.addLineItemUrl||"").trim(),s=(this.options.draftVersionId||"").trim(),i=(t.id||"").trim(),r=t.minPurchase||1;
19if(e&&s&&i&&!this._isAdding&&!this._isLoading){this._isAdding=!0,this._isLoading=!0,this._setLoadingState(!0),this._setInputDisabledState(!0);try{let a=await fetch(e,{method:"POST",body:this._buildAddLineItemPayload(s,i,r).toString(),credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8","X-Requested-With":"XMLHttpRequest"}});if(!a.ok)throw Error(`Quote line item add failed with status ${a.status}`);this._selectedProductIds.add(i),this._input&&(this._input.value=""),this._clearResults(),this._emitLineItemAdded(t)}finally{this._isAdding=!1,this._isLoading=!1,this._setLoadingState(!1),this._setInputDisabledState(!1)}}}_setInputDisabledState(t){this._input&&(this._input.disabled=t)}_setResultTriggersDisabledState(t){let e=this._resultList?.querySelectorAll(`.${this.options.resultTriggerClassName}`);t?this._resultList?.setAttribute("aria-busy","true"):this._resultList?.removeAttribute("aria-busy"),e?.forEach(e=>{e.disabled=t})}_buildAddLineItemPayload(t,e,s){let i=new URLSearchParams;return i.set("versionId",t),i.set("productId",e),i.set("quantity",s.toString()),i}_emitLineItemAdded(t){this.$emitter.publish("addLineItem",{product:t}),this.el.dispatchEvent(new CustomEvent("b2b-quick-search-quote-line-item-added",{bubbles:!0,detail:{product:t}}))}_clearResults(){this._productsById.clear(),this._disposeTooltips(),this._currentPage=1,this._searchTerm="",this._pendingSearchTerm=null,this._total=0,this._resultList&&(this._resultList.innerHTML=""),this._hideDropdown()}_hasMoreResults(){return""!==this._searchTerm&&this._getRenderedResultCount()<this._total}_getRenderedResultCount(){return this._resultList?.querySelectorAll(`.${this.options.resultItemClassName}`).length||0}_initializeTooltips(){"undefined"!=typeof bootstrap&&bootstrap.Tooltip&&this._resultList&&(this._tooltips=Array.from(this._resultList.querySelectorAll('[data-bs-toggle="tooltip"]')).map(t=>new bootstrap.Tooltip(t)))}_disposeTooltips(){this._tooltips.forEach(t=>t.dispose()),this._tooltips=[]}_getProductDisplayName(t){let e=t.translated?.name||t.name||t.productNumber||"";if(t.options&&t.options.length>0){let s=t.options.map(t=>{let e=t.group?.translated?.name,s=t.translated?.name;return e&&s?`${e}: ${s}`:s}).filter(t=>!!t).join(" | ");s&&(e+=` (${s})`)}return e}_isAlreadyPartOfQuote(t){let e=t.extensions?.quoteLineItem;return!!e?.id}_highlightSearchTerm(t,e){let s=this._escapeHtml(t),i=this._escapeRegExp(e.trim());return i?s.replace(RegExp(`(${i})`,"ig"),`<span class="${this.options.resultHighlightClassName}">$1</span>`):s}_escapeHtml(t){let e=document.createElement("div");return e.textContent=t,e.innerHTML}_escapeRegExp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}}}]);

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.