1/** 2 * Simple Job Board Core Front-end JS File - V 2.10.0 3 * 4 * @author PressTigers <[email protected]>, 2016 5 * 6 * Actions List 7 * - Job Application Submission Callbacks 8 * - Date Picker Initialization 9 * - Validate Email 10 * - Initialize TelInput Plugin 11 * - Validate Phone Number 12 * - Allowable Uploaded File's Extensions 13 * - Validate Required Inputs ( Attachment, Phone & Email ) 14 * - Checkbox Group Required Attribute Callbacks 15 * - Custom Styling of File Upload Button 16 */ 17(function ($) { 18 "use strict"; 19 20 $(document).ready(function () { 21 var jobpost_submit_button = $(".app-submit"); 22 23 var jobpost_form_status = $("#jobpost_form_status"); 24 25 $(document).ready(function () { 26 27 /* Add custom validation method for file extensions */ 28 $.validator.addMethod( 29 "filetype", 30 function (value, element, param) { 31 return this.optional(element) || param.test(value.toLowerCase()); 32 }, 33 application_form.jquery_alerts["invalid_extension"] 34 ); 35 36 /* Initialize validation on the form */ 37 $(".jobpost-form").validate({ 38 ignore: [], /* Ensure hidden fields are also validated */ 39 errorPlacement: function (error, element) { 40 /* Customize error messages */ 41 error.insertAfter(element); 42 }, 43 submitHandler: function (form) { 44 45 /* Add your submission function here */ 46 var formObj = $("#sjb-application-form"); 47 var datastring = new FormData(formObj[0]); 48 submitForm(datastring); 49 }, 50 }); 51 52 53 /* Add rules for required fields with class 'sjb-required' */ 54 $(".sjb-required").each(function () { 55 let fieldName = $(this).attr("name"); 56 /* Check if fieldName exists and is a string */ 57 if (typeof fieldName === "string") { 58 fieldName = fieldName.replace(/^jobapp_/, ""); 59 60 /* Replace underscores with spaces and capitalize each word */ 61 var fieldLabel = $(this).data("label") || fieldName.replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); 62 $(this).css("color", "black"); 63 if(fieldLabel == 'Tc' || fieldLabel == 'Pp'){ 64 $(this).rules("add", { 65 required: true, 66 messages: { 67 required: application_form.jquery_alerts["sjb_application_input_required"], 68 }, 69 }); 70 }else{ 71 $(this).rules("add", { 72 required: true, 73 messages: { 74 required: fieldLabel + ' ' + application_form.is_required, 75 }, 76 }); 77 } 78 } 79 }); 80 81 /* Add email validation for fields with class 'sjb-email-address' */ 82 $(".sjb-email-address").each(function () { 83 let fieldName = $(this).attr("name"); /* Get the field name */ 84 85 86 if (typeof fieldName === "string") { 87 fieldName = fieldName.replace(/^jobapp_/, ""); 88 var fieldLabel = $(this).data("label") || fieldName.charAt(0).toUpperCase() + fieldName.slice(1); 89 fieldLabel = fieldLabel.replace('_', ' '); 90 91 92 $(this).css("color", "black"); /* Set text color to black */ 93 $(this).rules("add", { 94 required: true, 95 email: true, 96 messages: { 97 required: fieldLabel + ' ' + application_form.is_required, 98 email: application_form.jquery_alerts["sjb_application_enter_valid"] + fieldLabel, 99 }, 100 }); 101 } 102 }); 103 var allowed_file_exts = Array.isArray(application_form.setting_extensions) 104 ? application_form.setting_extensions.filter(ext => typeof ext === "string").join(",") 105 : ""; 106 if(allowed_file_exts == ''){ 107 allowed_file_exts = application_form.allowed_extensions.filter(ext => typeof ext === "string").join(",") 108 } 109 var fileTypePattern = new RegExp( 110 `(\\.${allowed_file_exts.replace(/,/g, "|")})$`, 111 "i" 112 ); 113 114 /* File type validation for applicant resume */ 115 if (!$("#applicant-resume").hasClass("sjb-not-required")) { 116 $("#applicant-resume").rules("add", { 117 required: true, 118 filetype: fileTypePattern, 119 messages: { 120 required: 121 application_form.jquery_alerts["sjb_application_resume_required"] + application_form.is_required, 122 filetype: application_form.jquery_alerts["invalid_extension"], 123 }, 124 }); 125 } 126 }); 127 128 129 function initializePopupValidation() { 130 /* Reapply validation to dynamically added popup form */ 131 const popupForm = $(".jobpost-form"); 132 133 134 popupForm.validate({ 135 ignore: [], /* Ensure hidden fields are also validated */ 136 errorPlacement: function (error, element) { 137 error.insertAfter(element); 138 }, 139 submitHandler: function (form) { 140 /* Custom submission logic */ 141 const formObj = $(form); 142 const datastring = new FormData(formObj[0]); 143 submitForm(datastring); 144 }, 145 }); 146 147 /* Add rules for required fields with class 'sjb-required' */ 148 popupForm.find(".sjb-required").each(function () { 149 let fieldName = $(this).attr("name"); 150 if (typeof fieldName === "string") { 151 fieldName = fieldName.replace(/^jobapp_/, ""); 152 var fieldLabel = $(this).data("label") || fieldName.replace(/_/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()); 153 $(this).css("color", "black"); 154 if(fieldLabel == 'Tc' || fieldLabel == 'Pp'){ 155 $(this).rules("add", { 156 required: true, 157 messages: { 158 required: application_form.jquery_alerts["sjb_application_input_required"], 159 }, 160 }); 161 }else{ 162 $(this).rules("add", { 163 required: true, 164 messages: { 165 required: fieldLabel + ' ' + application_form.is_required, 166 }, 167 }); 168 } 169 } 170 }); 171 172 /* Add email validation for fields with class 'sjb-email-address' */ 173 popupForm.find(".sjb-email-address").each(function () { 174 let fieldName = $(this).attr("name"); 175 if (typeof fieldName === "string") { 176 fieldName = fieldName.replace(/^jobapp_/, ""); 177 var fieldLabel = $(this).data("label") || fieldName.charAt(0).toUpperCase() + fieldName.slice(1); 178 fieldLabel = fieldLabel.replace('_', ' '); 179 180 $(this).css("color", "black"); 181 $(this).rules("add", { 182 required: true, 183 email: true, 184 messages: { 185 required: fieldLabel + ' ' + application_form.is_required, 186 email: application_form.jquery_alerts["sjb_application_enter_valid"] + fieldLabel, 187 }, 188 }); 189 } 190 }); 191 192 /* File type validation for applicant resume */ 193 var allowed_file_exts = Array.isArray(application_form.setting_extensions) 194 ? application_form.setting_extensions.filter(ext => typeof ext === "string").join(",") 195 : ""; 196 197 if(allowed_file_exts == ''){ 198 allowed_file_exts = application_form.allowed_extensions.filter(ext => typeof ext === "string").join(",") 199 } 200 const fileTypePattern = new RegExp(`(\\.${allowed_file_exts.replace(/,/g, "|")})$`, "i"); 201 setTimeout(function() { 202 if (!popupForm.find("#applicant-resume").hasClass("sjb-not-required")) { 203 popupForm.find("#applicant-resume").rules("add", { 204 required: true, 205 filetype: fileTypePattern, 206 messages: { 207 required: application_form.jquery_alerts["sjb_application_resume_required"]+ application_form.is_required, 208 filetype: application_form.jquery_alerts["invalid_extension"], 209 }, 210 }); 211 } 212 }, 500); 213 } 214 215 function submitForm(datastring) { 216 217 const jobpost_form_status = $("#jobpost_form_status"); 218 const jobpost_submit_button = $(".jobpost-form .app-submit"); 219 220 $(".sjb-loading").show(); 221 $.ajax({
222 url: application_form.ajaxurl, 223 type: "POST", 224 dataType: "json", 225 data: datastring, 226 async: true, 227 cache: false, 228 contentType: false, 229 processData: false, 230 statusCode: { 231 500: function (responseObject, textStatus, jqXHR) { 232 alert( 233 "505: Server internal error occurred while processing application. Please try again." 234 ); 235 $(".sjb-loading").hide(); 236 237 /* Translation Ready String Through Script Localization */ 238 jobpost_form_status.html( 239 responseObject.responseJSON["error"] + 240 " " + 241 application_form.jquery_alerts["application_not_submitted"] + 242 "</div>" 243 ); 244 }, 245 503: function (responseObject, textStatus, errorThrown) { 246 alert("503: Service Unavailable. Please try again."); 247 $(".sjb-loading").hide(); 248 249 /* Translation Ready String Through Script Localization */ 250 jobpost_form_status.html( 251 responseObject.responseJSON["error"] + 252 " " + 253 application_form.jquery_alerts["application_not_submitted"] + 254 "</div>" 255 ); 256 }, 257 }, 258 beforeSend: function () { 259 jobpost_submit_button.attr("disabled", "disabled"); 260 }, 261 success: function (response) { 262 if (response["success"] == true) { 263 $(".jobpost-form").slideUp(); 264 265 /* Translation Ready String Through Script Localization */ 266 jobpost_form_status.html(response["success_alert"]); 267 } 268 269 if (response["success"] == false) { 270 /* Translation Ready String Through Script Localization */ 271 jobpost_form_status.html( 272 response["error"] + 273 " " + 274 application_form.jquery_alerts["application_not_submitted"] + 275 "</div>" 276 ); 277 278 $(".sjb-loading").hide(); 279 280 jobpost_submit_button.removeAttr("disabled"); 281 } 282 }, 283 }); 284 } 285 286 287 /** 288 * Initialize Datepicker 289 * 290 * @since 2.10.0 291 */ 292 function initialize_date() { 293 /* Date Picker */ 294 295 $(".sjb-datepicker").datepicker({ 296 dateFormat: application_form.sjb_date_format, 297 changeMonth: true, 298 changeYear: true, 299 yearRange: "-100:+50", 300 }); 301 } 302 initialize_date(); 303 304 /** 305 * Application Form -> On Input Email Validation 306 * 307 * @since 2.2.0 308 */ 309 $(document).on("input", ".sjb-email-address", function () { 310 var input = $(this); 311 var re = 312 /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; 313 var is_email = re.test(input.val()); 314 var error_element = $(this).next(); 315 if (is_email) { 316 input.removeClass("invalid").addClass("valid"); 317 error_element.hide(); 318 } else { 319 input.removeClass("valid").addClass("invalid"); 320 } 321 }); 322 323 /** 324 * Initialize TelInput Plugin 325 * 326 * @since 2.2.0 327 */ 328 function initialize_tel() { 329 if ($(".sjb-phone-number").length) { 330 var telInput_id = $(".sjb-phone-number") 331 .map(function () { 332 return this.id; 333 }) 334 .get(); 335 336 for (var input_ID in telInput_id) { 337 var telInput = $("#" + telInput_id[input_ID]); 338 // Check if the intlTelInput function exists (i.e., the library is loaded) 339 if (typeof $.fn.intlTelInput === 'undefined') { 340 // If the intlTelInput library is not loaded or missing, exit the function 341 return; 342 } 343 telInput.intlTelInput({ 344 initialCountry: "auto", 345 geoIpLookup: function (callback) { 346 $.get("https://ipinfo.io", function () {}, "jsonp").always( 347 function (resp) { 348 var countryCode = resp && resp.country ? resp.country : ""; 349 callback(countryCode); 350 } 351 ); 352 }, 353 }); 354 } 355 } 356 } 357 if(application_form.isPhoneFormattingdisabled !='yes'){ 358 initialize_tel(); 359 } 360 361 /** 362 * Application Form -> Phone Number Validation 363 * 364 * @since 2.2.0 365 */ 366 $(document).on("input", ".sjb-phone-number", function () { 367 var telInput = $(this); 368 var telInput_id = $(this).attr("id"); 369 var error_element = $("#" + telInput_id + "-invalid-phone"); 370 error_element.hide(); 371 372 /* Validate Phone Number */ 373 if ($.trim(telInput.val())) { 374 if (typeof telInput.intlTelInput === "function" && telInput.intlTelInput("isValidNumber")) {
375 telInput.removeClass("invalid").addClass("valid"); 376 error_element.hide(); 377 } else { 378 telInput.removeClass("valid").addClass("invalid"); 379 } 380 } 381 }); 382 383 384 /** 385 * Stop Form Submission -> On Required Attachments 386 * 387 * @since 2.3.0 388 */ 389 function sjb_is_attachment(event) { 390 var error_free = true; 391 $(".sjb-attachment").each(function () { 392 var element = $("#" + $(this).attr("id")); 393 var valid = element.hasClass("valid"); 394 var is_required_class = element.hasClass("sjb-not-required"); 395 396 /* Set Error Indicator on Invalid Attachment */ 397 if (!valid) { 398 if (!(is_required_class && 0 === element.get(0).files.length)) { 399 error_free = false; 400 } 401 } 402 403 /* Stop Form Submission */ 404 if (!error_free) { 405 event.preventDefault(); 406 } 407 }); 408 409 return error_free; 410 } 411 412 /** 413 * Stop Form Submission -> On Invalid Email/Phone 414 * 415 * @since 2.2.0 416 */ 417 function sjb_is_valid_input(event, input_type, input_class) { 418 var jobpost_form_inputs = $("." + input_class).serializeArray(); 419 var error_free = true; 420 421 for (var i in jobpost_form_inputs) { 422 var element = $("#" + jobpost_form_inputs[i]["name"]);
423 var valid = element.hasClass("valid"); 424 var is_required_class = element.hasClass("sjb-not-required"); 425 if (!(is_required_class && "" === jobpost_form_inputs[i]["value"])) { 426 if ("email" === input_type) { 427 var error_element = $("span", element.parent()); 428 } else if ("phone" === input_type) { 429 var error_element = $( 430 "#" + jobpost_form_inputs[i]["name"] + "-invalid-phone" 431 ); 432 } 433 434 /* Set Error Indicator on Invalid Input */ 435 if (!valid) { 436 error_element.show(); 437 error_free = false; 438 } else { 439 error_element.hide(); 440 } 441 442 /* Stop Form Submission */ 443 if (!error_free) { 444 event.preventDefault(); 445 } 446 } 447 } 448 return error_free; 449 } 450 451 /** 452 * Remove Required Attribute from Checkbox Group -> When one of the option is selected. 453 * 454 * Add Required Attribute from Checkboxes Group -> When none of the option is selected. 455 * 456 * @since 2.3.0 457 */ 458 function initialize_checkbox() { 459 var requiredCheckboxes = $(":checkbox[required]"); 460 requiredCheckboxes.on("change", function () { 461 var checkboxGroup = requiredCheckboxes.filter( 462 '[name="' + $(this).attr("name") + '"]' 463 ); 464 var isChecked = checkboxGroup.is(":checked"); 465 checkboxGroup.prop("required", !isChecked); 466 }); 467 } 468 initialize_checkbox(); 469 470 /* Accept Numbers Input Only */ 471 function initialize_keypress() { 472 $(".sjb-numbers-only").keypress(function (evt) { 473 evt = evt ? evt : window.event; 474 var charCode = evt.which ? evt.which : evt.keyCode; 475 if (charCode > 31 && (charCode < 48 || charCode > 57)) { 476 return false; 477 } 478 return true; 479 }); 480 } 481 initialize_keypress(); 482 483 /* 484 * Custom Styling of Upload Field Button 485 * 486 * @since 2.4.0 487 */ 488 var file = { 489 maxlength: 20, /* maximum length of filename before it's trimmed */ 490 491 convert: function () { 492 /* Convert all file type inputs. */ 493 $("input[type=file].sjb-attachment").each(function () { 494 $(this).wrap('<div class="file" />'); 495 $(this) 496 .parent() 497 .prepend("<div>" + application_form.file["browse"] + "</div>"); 498 $(this) 499 .parent() 500 .prepend( 501 "<span>" + application_form.file["no_file_chosen"] + "</span>" 502 ); 503 $(this).fadeTo(0, 0); 504 $(this).attr("size", "50"); /* Use this to adjust width for FireFox. */ 505 }); 506 }, 507 update: function (x) { 508 /* Update the filename display. */ 509 var filename = x.val().replace(/^.*\\/g, ""); 510 if (filename.length > $(this).maxlength) { 511 trim_start = $(this).maxlength / 2 - 1; 512 trim_end = trim_start + filename.length - $(this).maxlength + 1; 513 filename = 514 filename.substr(0, trim_start) + 515 "…" + 516 filename.substr(trim_end); 517 } 518 519 if (filename == "") filename = application_form.file["no_file_chosen"]; 520 x.siblings("span").html(filename); 521 }, 522 }; 523 524 file.convert(); 525 $(document).on("change", "input[type=file].sjb-attachment", function () { 526 file.update($(this)); 527 }); 528 529 $(document).on("click", "body #quick-apply-btn", function (e) { 530 e.preventDefault(); 531 532 var obj = $(this); 533 var job_id = obj.attr("job_id"); 534 if (obj.data("loading")) { 535 return; 536 } 537 obj.data("loading", true); 538 $.ajax({
539 url: application_form.ajaxurl, 540 type: "POST", 541 data: { 542 action: "fetch_quick_job", 543 job_id: job_id, 544 }, 545 success: function (response) { 546 $(".sjb-page").append(response); 547 $(".sjb-page").find(".popup-outer").fadeIn(); 548 file.convert(); 549 initialize_date(); 550 initialize_tel(); 551 initialize_checkbox(); 552 initialize_keypress(); 553 initializePopupValidation(); 554 $(".popup-outer .sjb-page .sjb-detail") 555 .prepend(`<div class="sjb-quick-apply-modal-close-btn"> 556 <span class="close">x</span> 557 </div>`); 558 }, 559 complete: function () { 560 obj.data("loading", false); 561 }, 562 error: function () { 563 obj.data("loading", false); 564 }, 565 }); 566 }); 567 568 $(document).on("click", ".sjb-quick-apply-modal-close-btn", function () { 569 if (confirm(application_form.jquery_alerts.sjb_quick_job_close)) { 570 $(".sjb-page .popup-outer").fadeOut(); 571 $(".sjb-page .popup-outer").remove(); 572 } 573 }); 574 575 $(".sjb_view_more_btn").on("click", function () { 576 var post_id = $(this).data("id"); 577 $("#sjb_more_content_" + post_id).css("display", "block"); 578 $("#sjb_less_content_" + post_id).css("display", "none"); 579 $("#sjb_view_less_btn_" + post_id).css("display", "inline"); 580 }); 581 582 $(".sjb_view_less_btn").on("click", function () { 583 var post_id = $(this).data("id"); 584 $("#sjb_more_content_" + post_id).css("display", "none"); 585 $("#sjb_less_content_" + post_id).css("display", "block"); 586 $("#sjb_view_less_btn_" + post_id).css("display", "none"); 587 }); 588 var filess = { 589 maxlength: 20, /* maximum length of filename before it's trimmed */ 590 591 update: function (x) { 592 /* Update the filename display. */ 593 var files = x.prop("files"); 594 var fileList = ""; 595 var count = 0; 596 for (var i = 0; i < files.length; i++) { 597 fileList += "<p>" + files[i].name + "</p>"; 598 count++; 599 } 600 601 if (count > 1) { 602 x.siblings("span").html(count + "" + " Files Selected"); 603 } else if (count == 1) { 604 x.siblings("span").html(files[0].name); 605 } 606 }, 607 }; 608 /* Update the resume field value */ 609 $(document).on("change", "input[name='applicant_resume[]']", function () { 610 filess.update($(this)); 611 }); 612 613 /* Tags in Search filter */ 614 $(".sjb-tags-search").on("click", function (event) { 615 event.preventDefault(); /* Prevent default link behavior */ 616 617 if ($(this).hasClass("tag-active")) { 618 $(this).removeClass("tag-active"); 619 } else { 620 $(this).addClass("tag-active"); 621 } 622 623 var linkValue = $(".tag-active") 624 .map(function () { 625 return $(this).data("value"); 626 }) 627 .get(); 628 629 $("#selected_tag").val(linkValue); 630 $(".filters-form").submit(); /* Submit the form */ 631 }); 632 633 /** 634 * Initialize Select2 for Multi-Select Filters with Checkboxes 635 * 636 * @since 2.14.5 637 */ 638 function initialize_multiselect_filters() { 639 if ($.fn.select2 && $(".sjb-multiselect-filter").length) { 640 641 $(".sjb-multiselect-filter").each(function () { 642 var $select = $(this); 643 var placeholderText = $select.find("option[value='-1'], option[value='']").first().text() || ""; 644 645 // Clean any placeholder -1 or "" from current initial value 646 var currentVal = $select.val(); 647 if (Array.isArray(currentVal)) { 648 var cleanedVal = currentVal.filter(function(v) { return String(v) !== "-1" && String(v) !== ""; }); 649 if (cleanedVal.length !== currentVal.length) { 650 $select.val(cleanedVal.length ? cleanedVal : null); 651 } 652 } else if (currentVal === "-1" || currentVal === "") { 653 $select.val(null); 654 } 655 656 function syncCheckboxes() { 657 var rawVal = $select.val(); 658 var selectedValues = []; 659 if (Array.isArray(rawVal)) { 660 selectedValues = rawVal.map(function(v) { return String(v); }).filter(function(v) { return v !== "-1" && v !== ""; }); 661 } else if (rawVal !== null && rawVal !== undefined && rawVal !== "" && String(rawVal) !== "-1") { 662 selectedValues = [String(rawVal)]; 663 } 664 665 var $container = $select.data("select2") && $select.data("select2").$dropdown 666 ? $select.data("select2").$dropdown 667 : $(".select2-dropdown"); 668 669 $container.find(".sjb-select2-checkbox").each(function () { 670 var val = String($(this).attr("data-val")); 671 var isChecked = selectedValues.indexOf(val) !== -1; 672 $(this).prop("checked", isChecked); 673 }); 674 } 675 676 $select.select2({ 677 placeholder: placeholderText, 678 allowClear: true, 679 closeOnSelect: false, 680 width: "100%", 681 templateResult: function (state) { 682 if (!state.id || state.id === "-1" || state.id === "") { 683 return null; 684 } 685 var isSelected = $(state.element).is(":selected"); 686 var $elem = $( 687 '<span class="sjb-select2-item">' + 688 '<input type="checkbox" class="sjb-select2-checkbox" data-val="' + state.id + '" ' + 689 (isSelected ? 'checked="checked"' : '') + 690 ' style="margin-right:8px; pointer-events:none;" /> ' + 691 '<span class="sjb-select2-text">' + 692 state.text + 693 "</span>" + 694 "</span>" 695 ); 696 return $elem; 697 }, 698 templateSelection: function (state) { 699 if (!state.id || state.id === "-1" || state.id === "") { 700 return state.text; 701 } 702 return state.text; 703 } 704 }); 705 706 /* Prevent selecting placeholder if somehow triggered */ 707 $select.on("select2:selecting", function (e) { 708 var id = e.params.args && e.params.args.data ? String(e.params.args.data.id) : ""; 709 if (!id || id === "-1" || id === "") { 710 e.preventDefault(); 711 } 712 }); 713 714 /* Prevent dropdown from opening when removing an item or clearing all */ 715 $select.on("select2:opening", function (e) { 716 if ($select.data("prevent-open")) { 717 e.preventDefault(); 718 $select.data("prevent-open", false); 719 } 720 }); 721 722 /* Ensure clearing selection resets completely to null without auto-selecting first option */ 723 $select.on("select2:clearing", function () { 724 setTimeout(function () { 725 $select.val(null); 726 syncCheckboxes(); 727 }, 0); 728 }); 729 730 /* Synchronize checkbox states when options are opened, toggled, or cleared */ 731 $select.on("change select2:select select2:unselect select2:open select2:clear", function () { 732 setTimeout(syncCheckboxes, 0); 733 }); 734 }); 735 736 /* Set prevent-open flag and stop propagation when clicking remove all or individual choice remove icons */ 737 $(document).on("mousedown touchstart pointerdown click", ".select2-selection__clear, .select2-selection__choice__remove", function (e) { 738 e.stopPropagation(); 739 var $container = $(this).closest(".select2-container"); 740 var $select = $container.prev(".sjb-multiselect-filter"); 741 if (!$select.length) { 742 $select = $container.parent().find(".sjb-multiselect-filter"); 743 } 744 if ($select.length) { 745 $select.data("prevent-open", true); 746 setTimeout(function () { 747 $select.data("prevent-open", false); 748 }, 200); 749 } 750 }); 751 752 /* Global fallback when clicking anywhere in dropdown results */ 753 $(document).on("click", ".select2-results__option", function () { 754 setTimeout(function () { 755 $(".sjb-multiselect-filter").each(function () { 756 var $select = $(this); 757 var rawVal = $select.val(); 758 var selectedValues = []; 759 if (Array.isArray(rawVal)) { 760 selectedValues = rawVal.map(function(v) { return String(v); }).filter(function(v) { return v !== "-1" && v !== ""; }); 761 } else if (rawVal !== null && rawVal !== undefined && rawVal !== "" && String(rawVal) !== "-1") { 762 selectedValues = [String(rawVal)]; 763 } 764 765 var $container = $select.data("select2") && $select.data("select2").$dropdown 766 ? $select.data("select2").$dropdown 767 : $(".select2-dropdown"); 768 769 $container.find(".sjb-select2-checkbox").each(function () { 770 var val = String($(this).attr("data-val")); 771 var isChecked = selectedValues.indexOf(val) !== -1; 772 $(this).prop("checked", isChecked); 773 }); 774 }); 775 }, 0); 776 }); 777 } 778 } 779 initialize_multiselect_filters(); 780 });
781 782 $(document).on('click', '.btn-app-modal-close', function(e) { 783 e.preventDefault(); 784 $('.sjb-quick-apply-modal-close-btn').trigger('click'); 785 }); 786 787 })(jQuery); 788
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.