2023-10-21 19:55:51 +02:00
|
|
|
/**
|
|
|
|
* Search for settings that match the search string and highlight them.
|
|
|
|
*/
|
2023-09-19 07:19:22 +02:00
|
|
|
async function searchSettings() {
|
|
|
|
removeHighlighting(); // Remove previous highlights
|
2023-12-02 19:04:51 +01:00
|
|
|
const searchString = String($('#settingsSearch').val());
|
|
|
|
const searchableText = $('#user-settings-block-content'); // Get the HTML block
|
|
|
|
if (searchString.trim() !== '') {
|
2023-09-19 07:19:22 +02:00
|
|
|
highlightMatchingElements(searchableText[0], searchString); // Highlight matching elements
|
|
|
|
}
|
|
|
|
}
|
2023-10-21 19:55:51 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
*/
|
2023-09-19 07:19:22 +02:00
|
|
|
function isParentHeader(element) {
|
|
|
|
return $(element).closest('h4, h3').length > 0;
|
|
|
|
}
|
2023-10-21 19:55:51 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Recursively highlight elements that match the search string
|
|
|
|
* @param {HTMLElement | Text | Document | Comment} element Settings block HTML element
|
|
|
|
* @param {string} searchString Search string
|
|
|
|
*/
|
2023-09-19 07:19:22 +02:00
|
|
|
function highlightMatchingElements(element, searchString) {
|
|
|
|
$(element).contents().each(function () {
|
|
|
|
const isTextNode = this.nodeType === Node.TEXT_NODE;
|
|
|
|
const isElementNode = this.nodeType === Node.ELEMENT_NODE;
|
|
|
|
|
2023-12-02 19:04:51 +01:00
|
|
|
if (isTextNode && this.nodeValue.trim() !== '' && !isParentHeader(this)) {
|
2023-09-19 07:19:22 +02:00
|
|
|
const parentElement = $(this).parent();
|
|
|
|
const elementText = this.nodeValue;
|
|
|
|
|
|
|
|
if (elementText.toLowerCase().includes(searchString.toLowerCase())) {
|
|
|
|
parentElement.addClass('highlighted'); // Add CSS class to highlight matched elements
|
|
|
|
}
|
2023-12-02 19:04:51 +01:00
|
|
|
} else if (isElementNode && !$(this).is('h4')) {
|
2023-09-19 07:19:22 +02:00
|
|
|
highlightMatchingElements(this, searchString);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2023-10-21 19:55:51 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove highlighting from previously highlighted elements.
|
|
|
|
*/
|
2023-09-19 07:19:22 +02:00
|
|
|
function removeHighlighting() {
|
2023-12-02 19:04:51 +01:00
|
|
|
$('.highlighted').removeClass('highlighted'); // Remove CSS class from previously highlighted elements
|
2023-09-19 07:19:22 +02:00
|
|
|
}
|
2023-10-21 19:55:51 +02:00
|
|
|
|
2024-10-18 14:17:30 +02:00
|
|
|
export function initSettingsSearch() {
|
2023-09-19 07:19:22 +02:00
|
|
|
$('#settingsSearch').on('input change', searchSettings);
|
2024-10-18 14:17:30 +02:00
|
|
|
}
|