1(function (Drupal, $) { 2 "use strict"; 3 4 let feedbackPrepared = false; 5 6 // Fire after BigPipe 7 Drupal.behaviors.feedbackBehavior = { 8 attach(context, settings) { 9 if ( 10 (context === document || context === document?.querySelector("#block-feedbackformblock")) && 11 !feedbackPrepared 12 ) { 13 _prepareFeedbackForm(); 14 } 15 }, 16 }; 17 18 $.fn.storageCommand = function (type, label, data) { 19 const storage = type === "session" ? sessionStorage : localStorage; 20 setTimeout(storage.setItem(label, JSON.stringify(data)), 100); 21 }; 22 23 /** 24 * Sets up interaction for the feedback form. 25 */ 26 function _prepareFeedbackForm() { 27 const form = document.querySelector(".c--feedback-form"); 28 if (form === null) { 29 return; 30 } 31 const formOptions = { 32 modalButtonText: "Help improve this site", 33 formId: "4bf6443e", 34 elementSelector: "touchpoints-survey", 35 }; 36 const touchpointForm4bf6443e = new window.FBAform(document, window).init(formOptions); 37 const formLink = form.querySelector(".c--feedback-link"); 38 const formButton = form.querySelector(".c--feedback-heading button"); 39 const closeButton = form.querySelector(".c--feedback-closer"); 40 if (_feedbackNullOrExpired()) { 41 feedbackPrepared = true; 42 // const touchpointForm4bf6443e = new window.FBAform(document, window).init(formOptions); 43 formButton.addEventListener("click", (e) => { 44 e.stopPropagation(); 45 if (formButton.getAttribute("aria-expanded") === "true") { 46 _hideFeedback(); 47 } else { 48 formButton.setAttribute("aria-expanded", "true"); 49 window.addEventListener("click", _hideFeedback); 50 const submitBtn = form.querySelector("button[type='submit']"); 51 submitBtn?.addEventListener("click", _dateFeedback); 52 } 53 }); 54 closeButton.addEventListener("click", (e) => { 55 _eliminateFeedback(); 56 _dateFeedback(); 57 }); 58 formLink.addEventListener("click", (e) => { 59 e.preventDefault(); 60 formButton.setAttribute("aria-expanded", "true"); 61 }); 62 } else { 63 _eliminateFeedback(); 64 } 65 } 66 67 function _feedbackNullOrExpired() { 68 if (!localStorage.getItem("feedbackClosed") || localStorage.getItem("feedbackClosed") === "true") { 69 return true; 70 } 71 const current = parseInt(_prepareTimeString(), 10); 72 const past = parseInt(localStorage.getItem("feedbackClosed"), 10); 73 if (current - past > 60000) { 74 localStorage.removeItem("feedbackClosed"); 75 return true; 76 } 77 return false; 78 } 79 80 function _dateFeedback() { 81 localStorage.setItem("feedbackClosed", _prepareTimeString()); 82 } 83 84 function _prepareTimeString() { 85 const string = Math.floor(Date.now() / 86400).toString(10); 86 return string; 87 } 88 89 /** 90 * Sets the display of the feeback form to none. 91 */ 92 function _eliminateFeedback() { 93 const form = document.querySelector(".c--feedback-form"); 94 form.style.display = "none"; 95 } 96 97 /** 98 * Minimizes the feedback form. 99 * @param {Event} e - The triggering event 100 */ 101 function _hideFeedback(e) { 102 const form = document.querySelector(".c--feedback-form"); 103 if (!e || !form.contains(e.target)) { 104 form.querySelector(".c--feedback-heading button").setAttribute("aria-expanded", "false"); 105 window.removeEventListener("click", _hideFeedback); 106 } 107 } 108 109 /** 110 * Checks if the user is approaching the character limit 111 * @param {Event} e - The associated input event 112 */ 113 function _characterCount(e) { 114 const description = document.querySelector("#edit-text--description"); 115 if (this.value.length >= 1000) { 116 const message = document.querySelector("#feedback-message"); 117 description.textContent = `(${1200 - this.value.length} characters remaining)`; 118 if (!message.textContent) { 119 message.innerHTML = 120 'You can also send an email at <a href="mailto:[email protected]">[email protected]</a>.'; 121 } 122 } else if (this.value.length < 1000 && description.textContent !== "(1200 characters max)") { 123 description.textContent = "(1200 characters max)"; 124 } 125 } 126})(window.Drupal, window.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.