Spaces:
Running
Running
/** | |
* Search for settings that match the search string and highlight them. | |
*/ | |
async function searchSettings() { | |
removeHighlighting(); // Remove previous highlights | |
const searchString = String($('#settingsSearch').val()); | |
const searchableText = $('#user-settings-block-content'); // Get the HTML block | |
if (searchString.trim() !== '') { | |
highlightMatchingElements(searchableText[0], searchString); // Highlight matching elements | |
} | |
} | |
/** | |
* Check if the element is a child of a header element | |
* @param {HTMLElement | Text | Document | Comment} element Settings block HTML element | |
* @returns {boolean} True if the element is a child of a header element, false otherwise | |
*/ | |
function isParentHeader(element) { | |
return $(element).closest('h4, h3').length > 0; | |
} | |
/** | |
* Recursively highlight elements that match the search string | |
* @param {HTMLElement | Text | Document | Comment} element Settings block HTML element | |
* @param {string} searchString Search string | |
*/ | |
function highlightMatchingElements(element, searchString) { | |
$(element).contents().each(function () { | |
const isTextNode = this.nodeType === Node.TEXT_NODE; | |
const isElementNode = this.nodeType === Node.ELEMENT_NODE; | |
if (isTextNode && this.nodeValue.trim() !== '' && !isParentHeader(this)) { | |
const parentElement = $(this).parent(); | |
const elementText = this.nodeValue; | |
if (elementText.toLowerCase().includes(searchString.toLowerCase())) { | |
parentElement.addClass('highlighted'); // Add CSS class to highlight matched elements | |
} | |
} else if (isElementNode && !$(this).is('h4')) { | |
highlightMatchingElements(this, searchString); | |
} | |
}); | |
} | |
/** | |
* Remove highlighting from previously highlighted elements. | |
*/ | |
function removeHighlighting() { | |
$('.highlighted').removeClass('highlighted'); // Remove CSS class from previously highlighted elements | |
} | |
jQuery(() => { | |
$('#settingsSearch').on('input change', searchSettings); | |
}); | |