1(function($) { 2 "use strict"; 3 $(document).ready(function() { 4 let request; 5 let searchForm = $(".betterdocs-searchform"); 6 let searchField = $(".betterdocs-search-field"); 7 let searchCategory = $(".betterdocs-search-category"); 8 let popularSearch = $(".betterdocs-popular-search-keyword .popular-keyword"); 9 10 /** 11 * Store search data to sessionStorage 12 */ 13 sessionStorage.setItem("betterdocs_search_data", betterdocspublic.search_keyword); 14 15 // disable from submit on enter 16 popularSearch.on("click", function(e) { 17 e.preventDefault(); 18 let popularKeyword = $(this).text(); 19 $(this).parent('.betterdocs-popular-search-keyword').siblings('.betterdocs-searchform').find('.betterdocs-search-field').val(popularKeyword).trigger('propertychange'); 20 }); 21 22 searchForm.on("keyup keypress", function(e) { 23 searchForm.each(function() { 24 let keyCode = e.keyCode || e.which; 25 if (keyCode === 13) { 26 e.preventDefault(); 27 return false; 28 } 29 }); 30 }); 31 32 // ajax load titles on keyup to searchbox 33 searchField.on("input propertychange paste", function(e) { 34 searchField.each(function() { 35 let thisEvent = $(this); 36 let inputVal = $(this).val(); 37 let inputCat = thisEvent.parent('.betterdocs-searchform-input-wrap').siblings('.betterdocs-search-category').find(':selected').val(); 38 let resultWrapper = thisEvent.parent().parent(".betterdocs-searchform"); 39 let kbSlug = thisEvent.parent().parent('.betterdocs-searchform').find('.betterdocs-search-kbslug').val(); 40 liveSearchAction(e, thisEvent, inputVal, inputCat, resultWrapper, kbSlug); 41 }); 42 }); 43 44 $('.betterdocs-searchform .betterdocs-search-category').on("change", function(e) { 45 let thisEvent = $(this); 46 let inputVal = thisEvent.siblings('.betterdocs-searchform-input-wrap').children('.betterdocs-search-field').val(); 47 let inputCat = $(this).find(':selected').val(); 48 let resultWrapper = thisEvent.parent(".betterdocs-searchform"); 49 let kbSlug = thisEvent.parent('.betterdocs-searchform').find('.betterdocs-search-kbslug').val(); 50 liveSearchAction(e, thisEvent, inputVal, inputCat, resultWrapper, kbSlug); 51 }); 52 53 function liveSearchAction(e, thisEvent, inputVal, inputCat, resultWrapper, kbSlug) { 54 let resultList = thisEvent.parent(".betterdocs-searchform").find(".betterdocs-search-result-wrap"); 55 let searchLoader = thisEvent.parent().find(".docs-search-loader"); 56 let searchClose = thisEvent.parent().find(".docs-search-close"); 57 let search_keyword = sessionStorage.betterdocs_search_data; 58 if ( 59 e.key != "a" && 60 e.keyCode != 17 && 61 e.keyCode != 91 && 62 inputVal.length >= 3 63 ) { 64 delay(function() { 65 ajaxLoad( 66 inputVal, 67 inputCat, 68 kbSlug, 69 resultWrapper, 70 resultList, 71 searchLoader, 72 searchClose, 73 search_keyword 74 ); 75 }, 400); 76 } else if (!inputVal.length) { 77 thisEvent.parent().parent(".betterdocs-live-search").find(".betterdocs-search-result-wrap").addClass("hideArrow"); 78 thisEvent.parent().parent(".betterdocs-live-search").find(".docs-search-result").slideUp(300); 79 searchLoader.hide(); 80 searchClose.hide(); 81 } 82 } 83 84 $(".docs-search-close").on("click", function() { 85 $(this).hide(); 86 $(".betterdocs-live-search .betterdocs-search-result-wrap").addClass( 87 "hideArrow" 88 ); 89 $(".betterdocs-live-search .docs-search-result").slideUp(300); 90 searchField.val(""); 91 }); 92 93 var delay = (function() { 94 var timer = 0; 95 return function(callback, ms) { 96 clearTimeout(timer); 97 timer = setTimeout(callback, ms); 98 }; 99 })(); 100 101 function ajaxLoad( 102 inputVal, 103 inputCat, 104 kbSlug, 105 resultWrapper, 106 resultList, 107 searchLoader, 108 searchClose, 109 search_keyword 110 ) { 111 if (request) { 112 request.abort(); 113 } 114 request = $.ajax({ 115 url: betterdocspublic.ajax_url, 116 type: "post", 117 data: { 118 action: "betterdocs_get_search_result", 119 search_input: inputVal, 120 search_cat: inputCat, 121 kb_slug: kbSlug, 122 search_data: search_keyword, 123 }, 124 beforeSend: function() { 125 searchLoader.show(); 126 searchClose.hide(); 127 resultList.addClass("hideArrow"); 128 $(".betterdocs-live-search .docs-search-result").slideUp(400); 129 }, 130 success: function(response) { 131 resultList.remove(); 132 searchLoader.hide(); 133 searchClose.show(); 134 resultWrapper.append(response.data.post_lists); 135 sessionStorage.setItem("betterdocs_search_data", response.data.search_data); 136 } 137 }); 138 } 139 140 var betterdocsToc = $(".betterdocs-toc"); 141 var betterdocsSidebar = $("#betterdocs-sidebar"); 142 if (betterdocsToc.length && betterdocsSidebar.length) { 143 // create an instance of TOC 144 var stickyTocContent = $(".betterdocs-toc").clone(); 145 $(".sticky-toc-container").append(stickyTocContent); 146 147 // make sticky toc when sidebar-content scroll ends 148 $(window).on("scroll", function() { 149 var stickyToc = $(".sticky-toc-container"); 150 var tocHeight = $(".betterdocs-sidebar-content").outerHeight(); 151 var tocSidebar = document.querySelector(".betterdocs-sidebar-content"); 152 var tocSidebarRect = tocSidebar.getBoundingClientRect(); 153 var tocSidebarTop = Math.abs(tocSidebarRect.top); 154 155 if (tocSidebarRect.top < 0 && tocHeight <= tocSidebarTop) { 156 stickyToc.addClass("toc-sticky"); 157 } else { 158 stickyToc.removeClass("toc-sticky"); 159 } 160 if ( 161 $(window).scrollTop() >= 162 betterdocsSidebar.offset().top + 163 betterdocsSidebar.outerHeight() - 164 window.innerHeight && 165 !betterdocsSidebar.hasClass("betterdocs-el-single-sidebar") 166 ) { 167 stickyToc.removeClass("toc-sticky"); 168 } 169 }); 170 } 171 172 // Add smooth scrolling to links 173 $(document).on("scroll", onScroll); 174 // alert(betterdocspublic.sticky_toc_offset); 175 var toc_links = $(".betterdocs-toc .toc-list a"); 176 toc_links.on("click", function(e) { 177 e.preventDefault(); 178 $(document).off("scroll"); 179 toc_links.each(function() { 180 $(this).removeClass("active"); 181 }); 182 $(this).addClass("active"); 183 var target = this.hash, 184 $target = $(target); 185 var scrollTopOffset = $target.offset().top; 186 $("html, body") 187 .stop() 188 .animate( 189 { scrollTop: scrollTopOffset - betterdocspublic.sticky_toc_offset }, 190 "slow", 191 function() { 192 $(document).on("scroll", onScroll); 193 } 194 ); 195 }); 196 197 // function to add link active class on scroll 198 function onScroll() { 199 var scrollPos = $(document).scrollTop(); 200 $( 201 ".sticky-toc-container .betterdocs-toc .toc-list a,.betterdocs-full-sidebar-right .betterdocs-toc .toc-list a" 202 ).each(function() { 203 var currLink = $(this); 204 var refElement = $(currLink.attr("href")); 205 if ( 206 refElement.position().top <= scrollPos && 207 refElement.position().top + refElement.height() > scrollPos 208 ) { 209 $(".betterdocs-toc .toc-list a").removeClass("active"); 210 currLink.addClass("active"); 211 } 212 }); 213 } 214 215 // close sticky toc 216 $(".close-toc").on("click", function(event) { 217 event.preventDefault(); 218 $(".sticky-toc-container").remove(".sticky-toc-container"); 219 }); 220 221 // close sticky toc 222 $("body").on("click", ".betterdocs-print-btn", function(event) { 223 let entryTitle = ""; 224 if ($("#betterdocs-entry-title").length) { 225 entryTitle = document.getElementById("betterdocs-entry-title") 226 .innerHTML; 227 } 228 229 var printContents = document.getElementById("betterdocs-single-content") 230 .innerHTML; 231 var combined = document.createElement("div"); 232 combined.innerHTML = "<h1>" + entryTitle + "</h1>" + " " + printContents; 233 combined.id = "new-doc-print"; 234 var pwidth = document.getElementById("betterdocs-single-content") 235 .offsetWidth; 236 var wheight = $(window).height(); 237 var winPrint = window.open( 238 "", 239 "",
240 "left=50%,top=10%,width=" + 241 pwidth + 242 ",height=" + 243 wheight + 244 ",toolbar=0,scrollbars=0,status=0" 245 ); 246 winPrint.document.write(combined.outerHTML); 247 winPrint.document.close(); 248 winPrint.focus(); 249 winPrint.print(); 250 winPrint.close(); 251 }); 252 253 // Add accordion to sidebar category grid 254 var sidebarContent = $(".betterdocs-sidebar-content"); 255 var catList = $( 256 ".betterdocs-sidebar-content .docs-single-cat-wrap .docs-item-container" 257 ); 258 var currentCatList = $( 259 ".betterdocs-sidebar-content .docs-single-cat-wrap.current-category .docs-item-container" 260 ); 261 var catHeading = $( 262 ".betterdocs-sidebar-content .docs-single-cat-wrap .docs-cat-title-wrap" 263 ); 264 catList.hide(); 265 266 if (currentCatList.length) { 267 currentCatList.show().addClass("show"); 268 for(let child of currentCatList[0].children) { 269 //Arrow down only if selected post is from a nested sub category. This is for single post along with sidebar, and for single selected category 270 if( $(child).hasClass('docs-sub-cat') && $(child).hasClass('current-sub-cat') ) { 271 let right = child.previousElementSibling.children[0]; 272 let down = child.previousElementSibling.children[1]; 273 $(right).css('display', 'none'); 274 $(down).css('display', 'inline'); 275 } 276 } 277 } 278 279 if (currentCatList.length) { 280 currentCatList.show().addClass("show"); 281 } 282 283 catHeading.click(function(e) { 284 var $this = $(this); 285 sidebarContent.find(".active-title").removeClass("active-title"); 286 $this.toggleClass("active-title"); 287 if ($this.next(catList).hasClass("show")) { 288 $this 289 .next(catList) 290 .slideUp() 291 .removeClass("show"); 292 } else if (catList.hasClass("show")) { 293 catList.slideUp().removeClass("show"); 294 $this 295 .next(catList) 296 .slideToggle() 297 .toggleClass("show"); 298 } else { 299 $this 300 .next(catList) 301 .slideToggle() 302 .toggleClass("show"); 303 } 304 }); 305 306 var docSubCat = $(".docs-sub-cat-title, .el-betterdocs-grid-sub-cat-title"); 307 docSubCat.each(function() { 308 $(this).click(function(e) { 309 e.preventDefault(); 310 $(this) 311 .children(".toggle-arrow") 312 .toggle(); 313 $(this) 314 .next(".docs-sub-cat, .docs-sub-cat-list") 315 .slideToggle(); 316 }); 317 }); 318 319 var docTocTitle = $(".betterdocs-toc.collapsible-sm .toc-title"); 320 docTocTitle.each(function() { 321 $(this).click(function(e) { 322 e.preventDefault(); 323 $(this) 324 .children(".angle-icon") 325 .toggle(); 326 $(this) 327 .next(".toc-list") 328 .slideToggle(); 329 }); 330 }); 331 332 // single post feedback form modal 333 var formModal = $("#betterdocs-form-modal"); 334 var formModalContent = $("#betterdocs-form-modal .modal-content"); 335 336 //select all the a tag with name equal to modal 337 $("a[name=betterdocs-form-modal]").click(function(e) { 338 e.preventDefault(); 339 formModal.fadeIn(500); 340 }); 341 342 //if outside of modal content is clicked 343 $(document).mouseup(function(e) { 344 if ( 345 !formModalContent.is(e.target) && 346 formModalContent.has(e.target).length === 0 347 ) { 348 formModal.fadeOut(); 349 } 350 }); 351 352 //if close button is clicked 353 $(".betterdocs-modalwindow .close").click(function(e) { 354 e.preventDefault(); 355 formModal.fadeOut(500); 356 }); 357 358 // ajax feedback form submit 359 var feedbackForm = $("#betterdocs-feedback-form"); 360 361 var feedbackFormFields = $( 362 "#betterdocs-feedback-form input, #betterdocs-feedback-form textarea" 363 ); 364 feedbackFormFields.on("keyup", function() { 365 $(this).removeClass("val-error"); 366 $(this) 367 .siblings(".error-message") 368 .remove(); 369 }); 370 feedbackForm.on("submit", function(e) { 371 e.preventDefault(); 372 var form = $(this); 373 var message_name = $("#message_name"); 374 var message_email = $("#message_email"); 375 var message_subject = $("#message_subject"); 376 var message_text = $("#message_text"); 377 betterdocsFeedbackFormSubmit( 378 form, 379 message_name, 380 message_email, 381 message_subject, 382 message_text 383 ); 384 }); 385 function betterdocsFeedbackFormSubmit( 386 form, 387 message_name, 388 message_email, 389 message_subject, 390 message_text 391 ) { 392 if (request) { 393 request.abort(); 394 } 395 request = $.ajax({ 396 url: betterdocspublic.ajax_url, 397 type: "post", 398 data: { 399 action: "betterdocs_feedback_form_submit", 400 form: form.serializeArray(), 401 postID: betterdocspublic.post_id, 402 message_name: message_name.val(), 403 message_email: message_email.val(), 404 message_subject: message_subject.val(), 405 message_text: message_text.val(), 406 security: betterdocspublic.nonce, 407 }, 408 beforeSend: function() {}, 409 success: function(data) { 410 var data = JSON.parse(data); 411 if (data.sentStatus) { 412 if (data.sentStatus === "success") { 413 $(".response").html( 414 '<span class="success-message">' + data.sentMessage + "</span>" 415 ); 416 form[0].reset(); 417 delay(function() { 418 $(".betterdocs-modalwindow").fadeOut(500); 419 $(".response .success-message").remove(); 420 }, 3000); 421 } else { 422 $(".response").html( 423 '<span class="error-message">' + data.sentMessage + "</span>" 424 ); 425 } 426 } else { 427 if (data.nameStatus === "error") { 428 if (message_name.hasClass("val-error") == false) { 429 message_name.addClass("val-error"); 430 $(".form-name").append( 431 '<span class="error-message">' + data.nameMessage + "</span>" 432 ); 433 } 434 } 435 if (data.emailStatus === "error") { 436 if (message_email.hasClass("val-error") == false) { 437 message_email.addClass("val-error"); 438 $(".form-email").append( 439 '<span class="error-message">' + data.emailMessage + "</span>" 440 ); 441 } 442 } 443 if (data.messageStatus === "error") { 444 if (message_text.hasClass("val-error") == false) { 445 message_text.addClass("val-error"); 446 $(".form-message").append( 447 '<span class="error-message">' + 448 data.messageMessage + 449 "</span>" 450 ); 451 } 452 } 453 } 454 } 455 }); 456 } 457 458 if ($(".batterdocs-anchor").length) { 459 // tooltips 460 $(".batterdocs-anchor") 461 .hover( 462 function() { 463 var title = $(this).attr("data-title"); 464 $("<div/>", { 465 text: title, 466 class: "tooltip-box" 467 }).appendTo(this); 468 }, 469 function() { 470 // $(document).find("div.tooltip-box").remove(); 471 } 472 ) 473 .on("click", function(e) { 474 // Clipboard 475 e.preventDefault(); 476 var a = new ClipboardJS(".batterdocs-anchor"); 477 a.on("success", function(e) { 478 $(document) 479 .find("div.tooltip-box") 480 .text(betterdocspublic.copy_text); 481 e.clearSelection(), 482 $(e.trigger).addClass("copied"), 483 setTimeout(function() { 484 $(e.trigger).removeClass("copied"); 485 }, 2000); 486 }); 487 }); 488 489 (function() { 490 if (typeof self === "undefined" || !self.Prism || !self.document) { 491 return; 492 } 493 494 if (!Prism.plugins.toolbar) { 495 console.warn( 496 "Copy to Clipboard plugin loaded before Toolbar plugin." 497 ); 498 499 return; 500 } 501 502 var ClipboardJS = window.ClipboardJS || undefined; 503 504 if (!ClipboardJS && typeof require === "function") { 505 ClipboardJS = require("clipboard"); 506 } 507 508 var callbacks = []; 509 510 if (!ClipboardJS) { 511 var script = document.createElement("script"); 512 var head = document.querySelector("head"); 513 514 script.onload = function() { 515 ClipboardJS = window.ClipboardJS; 516 517 if (ClipboardJS) { 518 while (callbacks.length) { 519 callbacks.pop()(); 520 } 521 } 522 }; 523 524 script.src = 525 "https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js"; 526 head.appendChild(script); 527 } 528
529 Prism.plugins.toolbar.registerButton("copy-to-clipboard", function( 530 env 531 ) { 532 var linkCopy = document.createElement("button"); 533 linkCopy.textContent = "Copy"; 534 535 if (!ClipboardJS) { 536 callbacks.push(registerClipboard); 537 } else { 538 registerClipboard(); 539 } 540 541 return linkCopy; 542 543 function registerClipboard() { 544 var clip = new ClipboardJS(linkCopy, { 545 text: function() { 546 return env.code; 547 } 548 }); 549 550 clip.on("success", function() { 551 linkCopy.textContent = "Copied!"; 552 553 resetText(); 554 }); 555 clip.on("error", function() { 556 linkCopy.textContent = "Press Ctrl+C to copy"; 557 558 resetText(); 559 }); 560 } 561 562 function resetText() { 563 setTimeout(function() { 564 linkCopy.textContent = "Copy"; 565 }, 5000); 566 } 567 }); 568 })(); 569 } 570 }); 571})(jQuery);
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.