PageSourceSearch

https://vuslon.ru/build/assets/CommentForm-6187ef6d.js

js vuslon.ru collected 2026-10-02 20:49:40 UTC 11,677 bytes, 1 lines download raw bytes

1class C{constructor(e){var n;if(!e){console.error("CommentManager: Не передан rootElement");return}e.dataset.commentManagerInitialized||(e.dataset.commentManagerInitialized="true",this.rootElement=e,this.csrfToken=((n=document.querySelector('meta[name="csrf-token"]'))==null?void 0:n.getAttribute("content"))||"",this.selectors={commentForm:".comment_form",writeCommentBtn:".write-comment__button",allCommentsButton:".allcomments__button",commentsList:"#comment-item",commentsCounter:".comments_counter",paginationForm:".paginationForm",formAllComments:".formAllComments",template:"#add-comments",commentsSection:".comments-section"},this.elements={commentForm:this.rootElement.querySelector(this.selectors.commentForm),writeCommentBtn:this.rootElement.querySelector(this.selectors.writeCommentBtn),allCommentsButton:this.rootElement.querySelector(this.selectors.allCommentsButton),commentsList:this.rootElement.querySelector(this.selectors.commentsList),commentsCounter:this.rootElement.querySelector(this.selectors.commentsCounter),paginationForm:this.rootElement.querySelector(this.selectors.paginationForm),formAllComments:this.rootElement.querySelector(this.selectors.formAllComments),commentsSection:this.rootElement.querySelector(this.selectors.commentsSection)||this.rootElement,template:document.querySelector(this.selectors.template)},this.state={commentArray:[],totalComments:0,loadedCount:0,commentsPerPage:3},(this.elements.commentsList||this.elements.commentForm)&&this.init())}init(){this.bindEvents(),this.bindTextareaValidation(),this.fetchInitialData()}bindEvents(){this.elements.commentForm&&this.elements.commentForm.addEventListener("submit",e=>this.handleMainSubmit(e)),this.elements.writeCommentBtn&&this.elements.writeCommentBtn.addEventListener("click",()=>this.toggleMainForm()),this.elements.allCommentsButton&&this.elements.allCommentsButton.addEventListener("click",()=>this.loadMoreComments()),this.elements.commentsList&&(this.elements.commentsList.addEventListener("click",e=>this.handleListClick(e)),this.elements.commentsList.addEventListener("submit",e=>{e.target.matches(".replies_comment_form")&&this.handleReplySubmit(e)}))}async _fetch(e,n={}){var s;const o={Accept:"application/json","X-Requested-With":"XMLHttpRequest",...n.headers};this.csrfToken&&((s=n.method)==null?void 0:s.toUpperCase())==="POST"&&(o["X-CSRF-TOKEN"]=this.csrfToken);try{const t=await fetch(e,{credentials:"same-origin",headers:o,...n});if(!t.ok){const r=await t.text();throw new Error(`HTTP ${t.status}: ${r}`)}return await t.json()}catch(t){throw console.error("Fetch error:",t),t}}async fetchInitialData(){var s,t;const e=this.elements.formAllComments;if(!e)return;const n=(s=e.querySelector(".model_name"))==null?void 0:s.value,o=(t=e.querySelector(".model_id"))==null?void 0:t.value;if(!(!n||!o))try{const r=`${e.action}?name=${encodeURIComponent(n)}&id=${encodeURIComponent(o)}`,l=await this._fetch(r,{method:"GET"});if(l.data&&Array.isArray(l.data)){this.state.commentArray=l.data,this.state.totalComments=l.data.length,this.elements.commentsCounter&&(this.elements.commentsCounter.textContent=this.state.totalComments);const u=this.elements.commentsList.querySelectorAll(":scope > .one_comment");this.state.loadedCount=u.length,this.elements.allCommentsButton&&this.state.totalComments<=5&&(this.elements.allCommentsButton.disabled=!0,this.elements.allCommentsButton.textContent="Все комментарии показаны",this.elements.allCommentsButton.classList.add("hidden"))}}catch(r){console.error("Ошибка загрузки данных комментариев:",r)}}handleMainSubmit(e){e.preventDefault();const n=e.target,o=n.querySelector(".comment_form_submit-btn"),s=n.querySelector(".comment_textarea"),t=n.querySelector(".happy_message"),r=n.querySelector(".comment_input-name");if(!s.value.trim())return;o.disabled=!0,o.textContent="Отправка...";const l=new FormData(n);if(r&&r.value.trim()){const u=l.get("text"),c=`${r.value.trim()} | ${u}`;l.set("text",c)}this._fetch(n.action,{method:"POST",body:l}).then(u=>{if(t&&(t.style.display="block",t.textContent=u.message||"Комментарий появится после успешной премодерации — обычно это занимает несколько минут",t.style.color=""),o.disabled=!1,o.textContent="Отправить",n.reset(),this.updateSubmitButtonState(n),u.data&&(this.renderComment(u.data,this.elements.commentsList,!1),this.elements.commentsCounter)){const c=parseInt(this.elements.commentsCounter.textContent)||0;this.elements.commentsCounter.textContent=c+1}}).catch(u=>{console.error("Ошибка отправки комментария:",u),o.disabled=!1,o.textContent="Отправить",t&&(t.style.display="block",t.textContent="Произошла ошибка при отправке",t.style.color="red")})}handleReplySubmit(e){e.preventDefault();const n=e.target;if(!n||!n.classList.contains("replies_comment_form"))return;const o=n.querySelector(".comment_form_submit-btn"),s=n.querySelector(".comment_textarea"),t=n.closest(".one_comment"),r=n.querySelector(".happy_message"),l=n.querySelector(".comment_input-name");if(!t){console.error("Ошибка JS: не найден родительский элемент комментария (.one_comment)");return}const u=t.dataset.id;if(!s||!s.value.trim()){s&&s.focus();return}o.disabled=!0,o.textContent="Отправка...";const c=new FormData(n);if(c.append("parent_id",u),l&&l.value.trim()){const i=c.get("text"),m=`${l.value.trim()} | ${i}`;c.set("text",m)}this._fetch(n.action,{method:"POST",body:c}).then(i=>{if(r&&(r.style.display="block",r.textContent=i.message||"Ответ успешно добавлен",r.style.color=""),o.disabled=!1,o.textContent="Отправить",n.reset(),this.updateSubmitButtonState(n),i.data&&t){const m=t.querySelector(".replies_comments");if(m){this.renderComment(i.data,m,!0),m.classList.remove("replies_comments_hidden");const d=t.querySelector(".show_replies_button");if(d){const a=m.children.length;d.textContent=`${a} ${C.getNoun(a,"ответ","ответа","ответов")}`,d.style.display="inline-block",d.classList.add("active")}}}}).catch(i=>{console.error("Ошибка отправки ответа:",i),o.disabled=!1,o.textContent="Отправить",r&&(r.style.display="block",r.textContent="Произошла ошибка. Проверьте консоль (F12).",r.style.color="red")})}toggleMainForm(){this.elements.commentForm&&this.elements.commentForm.classList.add("comment_form_active"),this.elements.writeCommentBtn&&this.elements.writeCommentBtn.classList.add("write-comment__button_active")}loadMoreComments(){const e=this.state.commentsPerPage,n=this.state.loadedCount,o=n+e,s=this.state.commentArray.slice(n,o);s.length>0&&(s.forEach(t=>{this.renderComment(t,this.elements.commentsList,!1)}),this.state.loadedCount+=s.length),this.state.loadedCount>=this.state.commentArray.length&&this.elements.allCommentsButton&&(this.elements.allCommentsButton.disabled=!0,this.elements.allCommentsButton.textContent="Все комментарии показаны",this.elements.allCommentsButton.classList.add("hidden"))}updateSubmitButtonState(e){const n=e.querySelector(".comment_textarea"),o=e.querySelector(".comment_form_submit-btn");if(!n||!o)return;const s=!n.value.trim();o.disabled=s,o.classList.toggle("btn-disabled",s)}bindTextareaValidation(){[this.elements.commentForm,this.elements.commentsList].filter(
1Boolean).forEach(n=>{n.addEventListener("input",o=>{const s=o.target;if(!s.matches(".comment_textarea"))return;const t=s.closest(".comment_form, .replies_comment_form");t&&this.updateSubmitButtonState(t)})}),this.initExistingTextareas()}initExistingTextareas(){this.rootElement.querySelectorAll(".comment_textarea").forEach(n=>{const o=n.closest(".comment_form, .replies_comment_form");o&&this.updateSubmitButtonState(o)})}static getNoun(e,n,o,s){let t=Math.abs(e);return t%=100,t>=5&&t<=20?s:(t%=10,t===1?n:t>=2&&t<=4?o:s)}renderComment(e,n,o=!1){var _;const s=this.elements.template;if(!s)return;const t=s.content.querySelector(".one_comment").cloneNode(!0);t.dataset.name=e.name||"",t.dataset.id=e.id||"";let r="Без имени",l=e.text||"";if(e.text&&e.text.includes(" | ")){const f=e.text.split(" | ");f.length>=2&&(r=f[0].trim(),l=f.slice(1).join(" | ").trim())}const u=t.querySelector(".one_comment_author");u&&(u.textContent=((_=e.user)==null?void 0:_.name)||r);const c=t.querySelector(".one_comment_text");c&&(c.textContent=l);const i=t.querySelector(".comment_author_count_likes");i&&(i.textContent=e.likes_count||0);const m=t.querySelector(".comment_author_count_red");if(m&&(m.textContent=e.dislikes_count||0),o){const f=t.querySelector(".answer_button");f&&(f.style.display="none")}const d=t.querySelector(".show_replies_button");d&&(e.replies_count>0?(d.textContent=`${e.replies_count} ${C.getNoun(e.replies_count,"ответ","ответа","ответов")}`,d.style.display="inline-block"):d.style.display="none");const a=t.querySelector(".allRepliesForCommentRoute");if(a&&this.elements.commentsSection){const f=this.elements.commentsSection.dataset.repliesBaseUrl||"";f&&(a.action=f.replace(":id",e.id))}const h=t.querySelector(".replies_comment_form");h&&this.updateSubmitButtonState(h),n.appendChild(t)}handleListClick(e){const n=e.target,o=n.closest(".one_comment");
1if(!o||!this.rootElement.contains(o))return;const s=o.dataset.id,t=o.dataset.name,r=n.closest(".comment_dislike_red");if(r){e.preventDefault();const i=o.querySelector(".dislikeForm");if(!i)return;r.disabled=!0;const m=o.querySelector(".comment_author_count_red"),d=Number(m==null?void 0:m.textContent)||0;this._fetch(`${i.action}?name=${encodeURIComponent(t)}&id=${encodeURIComponent(s)}`,{method:"POST"}).then(a=>{var h;m&&(m.textContent=((h=a.data)==null?void 0:h.dislikes_count)??d+1)}).catch(a=>console.error("Ошибка дизлайка:",a)).finally(()=>{r.disabled=!1});return}const l=n.closest(".comment__green_like");if(l){e.preventDefault();const i=o.querySelector(".likeCommentForm");if(!i)return;l.disabled=!0;const m=o.querySelector(".comment_author_count_likes"),d=Number(m==null?void 0:m.textContent)||0;this._fetch(`${i.action}?name=${encodeURIComponent(t)}&id=${encodeURIComponent(s)}`,{method:"POST"}).then(a=>{var h;m&&(m.textContent=((h=a.data)==null?void 0:h.likes_count)??d+1)}).catch(a=>console.error("Ошибка лайка:",a)).finally(()=>{l.disabled=!1});return}if(n.closest(".answer_button")){const i=o.querySelector(".replies_comment_form");i&&i.classList.toggle("replies_comment_form_active");return}const c=n.closest(".show_replies_button");if(c){const i=o.querySelector(".replies_comments");if(!i)return;const m=i.classList.contains("replies_comments_hidden"),d=o.querySelector(".allRepliesForCommentRoute");if(!m&&i.children.length>0){i.classList.add("replies_comments_hidden"),c.classList.remove("active");const a=i.children.length;c.textContent=`${a} ${C.getNoun(a,"ответ","ответа","ответов")}`}else if(m&&i.children.length>0)i.classList.remove("replies_comments_hidden"),c.classList.add("active"),c.textContent="Скрыть ответы";else if(d){const a=c.textContent;c.textContent="Загрузка...",this._fetch(`${d.action}?id=${encodeURIComponent(s)}`,{method:"GET"}).then(h=>{c.textContent="Скрыть ответы",c.classList.add("active"),i.classList.remove("replies_comments_hidden"),h.data&&Array.isArray(h.data)&&h.data.forEach(_=>this.renderComment(_,i,!0))}).catch(h=>{console.error("Ошибка загрузки ответов:",h),c.textContent=a||"Показать ответы"})}return}}}export{C};

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.