PageSourceSearch

https://salut.md/cdn/shop/t/2/assets/salut-qa.js?v=153742213961590312281790507768

js salut.md collected 2026-10-02 12:40:44 UTC 13,272 bytes, 59 lines download raw bytes

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=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[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&&params.set("product",product);const locale=(document.documentElement.lang||"").trim();locale&&params.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.