1const SALUT_QA_MONTHS=["ian","feb","mar","apr","mai","iun","iul","aug","sep","oct","noi","dec"],SALUT_QA_VISIBLE_BLOCKS=2;function salutQaEscape(value){return String(value??"").replace(/[&<>"']/g,character=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[character])}function salutQaParse(element){if(!element)return null;try{return JSON.parse(element.textContent)}catch{return null}}function salutQaDate(value){const parts=String(value).split("-");if(parts.length!==3)return"";const month=SALUT_QA_MONTHS[Number(parts[1])-1]||"";return`${Number(parts[2])} ${month} ${parts[0]}`}function salutQaAnswer(question){const answer=question&&question.answer;return!answer||typeof answer!="object"?null:answer.text?answer:null}function salutQaAnswered(questions){return questions.filter(question=>salutQaAnswer(question))}class SalutQa extends HTMLElement{connectedCallback(){this.labels=salutQaParse(this.querySelector("[data-salut-qa-labels]"))||{},this.perPage=Number(this.labels.per_page)||3,this.state={expanded:!1,aiExpanded:!1},this.list=this.querySelector("[data-list]"),this.extra=this.querySelector("[data-extra]"),this.extraList=this.querySelector("[data-extra-list]"),this.moreButton=this.querySelector("[data-more]"),this.countRoot=this.querySelector("[data-count]"),this.aiBody=this.querySelector("[data-ai-body]"),this.aiExtra=this.querySelector("[data-ai-extra]"),this.aiExtraBody=this.querySelector("[data-ai-extra-body]"),this.aiMore=this.querySelector("[data-ai-more]"),this.aiCard=this.querySelector(".salut-qa__ai"),this.dialog=this.querySelector("[data-dialog]"),this.helpTemplate=this.querySelector("[data-icon-help]"),this.chevronTemplate=this.querySelector("[data-icon-chevron-down]"),this.closeTemplate=this.querySelector("[data-icon-close]"),this.load().then(data=>{this.questions=salutQaAnswered(Array.isArray(data&&data.questions)?data.questions:[]),this.overview=data&&data.overview||{},this.renderOverview(),this.bind(),this.render()})}endpoints(){const raw=(this.dataset.endpoint||"").trim();if(!raw)return null;const[base,existingQuery]=raw.split("?"),clean=base.replace(/\/+$/,""),params=new URLSearchParams(existingQuery||""),product=this.dataset.product||"";product&¶ms.set("product",product);const locale=(document.documentElement.lang||"").trim();locale&¶ms.set("locale",locale);const query=params.toString();return{list:query?`${clean}?${query}`:clean,submit:clean}}load(){const urls=this.endpoints();return urls?fetch(urls.list).then(response=>response.json()).catch(()=>({questions:[],overview:{}})):Promise.resolve(salutQaParse(this.querySelector("[data-salut-qa]"))||{})}blockMarkup(block){return` 2 <div class="salut-qa__ai-block"> 3 <span class="salut-qa__ai-heading">${salutQaEscape(block.heading)}</span> 4 <p class="salut-qa__ai-text">${salutQaEscape(block.text)}</p> 5 </div> 6 `}renderOverview(){const blocks=Array.isArray(this.overview.blocks)?this.overview.blocks:[];this.aiCard&&(this.aiCard.hidden=blocks.length===0),this.aiBody&&(this.aiBody.innerHTML=blocks.slice(0,2).map(block=>this.blockMarkup(block)).join("")),this.aiExtraBody&&(this.aiExtraBody.innerHTML=blocks.slice(2).map(block=>this.blockMarkup(block)).join("")),this.aiMore&&(this.aiMore.hidden=blocks.length<=2),this.syncOverview()}syncOverview(){if(this.aiExtra&&this.aiExtra.setAttribute("data-expanded",String(this.state.aiExpanded)),!this.aiMore)return;this.aiMore.classList.toggle("salut-qa__ai-more--open",this.state.aiExpanded),this.aiMore.setAttribute("aria-expanded",String(this.state.aiExpanded));const label=this.aiMore.querySelector("[data-ai-more-label]");label&&(label.textContent=this.state.aiExpanded?this.labels.ai_less:this.labels.ai_more)}visibleQuestions(){return this.questions.slice().sort((first,second)=>{const helpful=(Number(second.helpful)||0)-(Number(first.helpful)||0);return helpful||String(second.date).localeCompare(String(first.date))})}renderCount(){if(!this.countRoot)return;const count=this.questions.length,word=count===1?this.labels.count_one:this.labels.count_many;this.countRoot.textContent=`${count} ${word||""}`.trim()}rowMarkup(question){const icon=this.helpTemplate?this.helpTemplate.innerHTML:"",answer=salutQaAnswer(question);return` 7 <article class="salut-qa__row"> 8 <div class="salut-qa__question">
9 <span class="salut-qa__question-icon">${icon}</span> 10 <h3 class="salut-qa__question-text">${salutQaEscape(question.question)}</h3> 11 </div> 12 <p class="salut-qa__answer">${salutQaEscape(answer.text)}</p> 13 <span class="salut-qa__by">\u2014 ${salutQaEscape(answer.author)}${answer.role?` \xB7 ${salutQaEscape(answer.role)}`:""}</span> 14 </article> 15 `}render(){this.renderCount();const list=this.visibleQuestions();if(list.length?this.list.innerHTML=list.slice(0,this.perPage).map(question=>this.rowMarkup(question)).join(""):this.list.innerHTML=`<p class="salut-qa__empty">${salutQaEscape(this.labels.empty)}</p>`,this.extraList&&(this.extraList.innerHTML=list.slice(this.perPage).map(question=>this.rowMarkup(question)).join("")),this.extra&&this.extra.setAttribute("data-expanded",String(this.state.expanded)),this.moreButton){this.moreButton.hidden=list.length<=this.perPage,this.moreButton.classList.toggle("salut-qa__more--open",this.state.expanded),this.moreButton.setAttribute("aria-expanded",String(this.state.expanded));const label=this.moreButton.querySelector("[data-more-label]");label&&(label.textContent=this.state.expanded?this.labels.show_less:this.labels.show_all)}}bind(){this.addEventListener("click",event=>{if(event.target.closest("[data-more]")){this.state.expanded=!this.state.expanded,this.render();return}if(event.target.closest("[data-ai-more]")){this.state.aiExpanded=!this.state.aiExpanded,this.syncOverview();return}event.target.closest("[data-ask]")&&this.openDialog(event.target.closest("[data-ask]"))})}categories(){return String(this.labels.form_categories||"").split(",").map(item=>item.trim()).filter(Boolean)}openDialog(opener){if(!this.dialog)return;this.form={category:"",question:"",menu:!1,submitted:!1},this.dialogOpener=opener||null,this.renderDialog(),this.dialog.showModal(),document.body.classList.add("salut-qa-locked");const inner=this.dialog.querySelector(".salut-qa__form");inner&&inner.focus(),this.dialogBound||this.bindDialog()}bindDialog(){this.dialogBound=!0,this.dialog.addEventListener("click",event=>{if(event.target.closest("[data-close]")||event.target===this.dialog){this.dialog.close();return}if(event.target.closest("[data-menu-toggle]")){this.form.menu?this.closeMenu():this.openMenu();return}const option=event.target.closest("[data-category]");if(option){this.setCategory(option.dataset.category);return}const submitButton=event.target.closest("[data-submit]");if(submitButton){submitButton.disabled||this.submitDialog();return}this.form.menu&&this.closeMenu()}),this.dialog.addEventListener("keydown",event=>{event.key==="Escape"&&this.form.menu&&(event.preventDefault(),this.closeMenu())}),this.dialog.addEventListener("input",event=>{event.target.matches("[data-question]")&&(this.form.question=event.target.value,this.syncDialog())}),this.dialog.addEventListener("close",()=>{document.body.classList.remove("salut-qa-locked"),this.dialogOpener&&this.dialogOpener.isConnected&&this.dialogOpener.focus(),this.dialogOpener=null})}openMenu(){this.form.menu=!0;const select=this.dialog.querySelector(".salut-qa__form-select"),menu=this.dialog.querySelector(".salut-qa__form-menu"),trigger=this.dialog.querySelector("[data-menu-toggle]");select&&select.classList.add("salut-qa__form-select--open"),menu&&(menu.hidden=!1),trigger&&trigger.setAttribute("aria-expanded","true")}setCategory(value){this.form.category=value,this.closeMenu();const label=this.dialog.querySelector("[data-menu-toggle] span");label&&(label.textContent=value),this.dialog.querySelectorAll("[data-category]").forEach(option=>{option.setAttribute("aria-selected",String(option.dataset.category===value))});const error=this.dialog.querySelector("[data-error-category]");error&&(error.hidden=!0),this.syncDialog()}closeMenu(){this.form.menu=!1;const select=this.dialog.querySelector(".salut-qa__form-select"),menu=this.dialog.querySelector(".salut-qa__form-menu"),trigger=this.dialog.querySelector("[data-menu-toggle]");select&&select.classList.remove("salut-qa__form-select--open"),menu&&(menu.hidden=!0),trigger&&trigger.setAttribute("aria-expanded","fal
15se")}submitDialog(){if(this.form.submitted=!0,!this.form.category||!this.form.question.trim()){this.renderDialog();return}const submit=this.dialog.querySelector("[data-submit]"),previous=this.dialog.querySelector("[data-form-error]");previous&&previous.remove();const fail=message=>{submit&&(submit.disabled=!1,submit.classList.remove("salut-qa__form-submit--busy"));const notice=document.createElement("p");notice.className="salut-qa__form-error salut-qa__form-error--server",notice.setAttribute("data-form-error",""),notice.setAttribute("role","alert"),notice.textContent=message||this.labels.form_error,submit&&submit.before(notice)},urls=this.endpoints();if(!urls){fail();return}submit&&(submit.disabled=!0,submit.classList.add("salut-qa__form-submit--busy"));const payload=new FormData;payload.set("product",this.dataset.product||""),payload.set("category",this.form.category),payload.set("question",this.form.question.trim()),payload.set("locale",(document.documentElement.lang||"").trim()),fetch(urls.submit,{method:"POST",body:payload}).then(response=>response.json().catch(()=>null).then(data=>({ok:response.ok,status:response.status,data}))).then(({ok,status,data})=>{if(ok&&data&&data.ok){this.renderThanks();return}fail(status===429?this.labels.form_error_rate:this.labels.form_error)}).catch(()=>fail())}renderThanks(){this.dialog.innerHTML=` 16 <div class="salut-qa__form salut-qa__form--thanks"> 17 <p class="salut-qa__form-thanks">${salutQaEscape(this.labels.form_thanks)}</p> 18 <button class="salut-qa__form-submit salut-qa__form-submit--ready" type="button" data-close>${salutQaEscape(this.labels.form_close)}</button> 19 </div> 20 `}syncDialog(){const serverError=this.dialog.querySelector("[data-form-error]");serverError&&serverError.remove();const submit=this.dialog.querySelector("[data-submit]");if(!submit)return;const ready=!!this.form.category&&!!this.form.question.trim();submit.classList.toggle("salut-qa__form-submit--ready",ready);const error=this.dialog.querySelector("[data-error-question]");error&&(error.hidden=!this.form.submitted||!!this.form.question.trim())}renderDialog(){const ready=!!this.form.category&&!!this.form.question.trim(),categoryError=this.form.submitted&&!this.form.category,questionError=this.form.submitted&&!this.form.question.trim();this.dialog.innerHTML=` 21 <div class="salut-qa__form" tabindex="-1"> 22 <div class="salut-qa__form-head"> 23 <h3 class="salut-qa__form-title">${salutQaEscape(this.labels.form_title)}</h3> 24 <button class="salut-qa__form-close" type="button" data-close aria-label="${salutQaEscape(this.labels.form_cancel)}">${this.closeTemplate?this.closeTemplate.innerHTML:""}</button> 25 </div> 26 <div class="salut-qa__form-body"> 27 <div class="salut-qa__form-field"> 28 <div class="salut-qa__form-select${this.form.menu?" salut-qa__form-select--open":""}"> 29 <button 30 class="salut-qa__form-trigger" 31 type="button" 32 data-menu-toggle 33 aria-expanded="${this.form.menu}" 34 aria-haspopup="listbox" 35 > 36 <span>${salutQaEscape(this.form.category||this.labels.form_category)}</span> 37 <span class="salut-qa__form-chevron">${this.chevronTemplate?this.chevronTemplate.innerHTML:""}</span> 38 </button> 39 <div class="salut-qa__form-menu" role="listbox" ${this.form.menu?"":"hidden"}> 40 ${this.categories().map(item=>`<button class="salut-qa__form-option" type="button" role="option" aria-selected="${item===this.form.category}" data-category="${salutQaEscape(item)}">${salutQaEscape(item)}</button>`).join("")} 41 </div> 42 </div> 43 <span class="salut-qa__form-error" data-error-category ${categoryError?"":"hidden"}>${salutQaEscape(this.labels.form_error_category)}</span> 44 </div> 45 <div class="salut-qa__form-field"> 46 <textarea 47 class="salut-qa__form-question" 48 data-question 49 rows="2" 50 placeholder="${salutQaEscape(this.labels.form_question)}" 51 aria-label="${salutQaEscape(this.labels.form_question)}" 52 >${salutQaEscape(this.form.question)}</textarea>
53 <span class="salut-qa__form-error" data-error-question ${questionError?"":"hidden"}>${salutQaEscape(this.labels.form_error_question)}</span> 54 </div> 55 </div> 56 <button class="salut-qa__form-submit${ready?" salut-qa__form-submit--ready":""}" type="button" data-submit>${salutQaEscape(this.labels.form_submit)}</button> 57 </div> 58 `}}customElements.get("salut-qa")||customElements.define("salut-qa",SalutQa); 59//# sourceMappingURL=/cdn/shop/t/2/assets/salut-qa.js.map?v=153742213961590312281790507768
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.