oont-contents/themes/astra/assets/js/unminified/live-search.js
2025-02-08 15:10:23 +01:00

164 lines
5 KiB
JavaScript

/**
* Astra's Live Search
*
* @package Astra
* @since x.x.x
*/
(function () {
function decodeHTMLEntities(string) {
var doc = new DOMParser().parseFromString(string, "text/html");
return doc.documentElement.textContent;
}
function getSearchResultPostMarkup(resultsData) {
let processedHtml = "";
Object.entries(resultsData).forEach(([postType, postsData]) => {
let postTypeLabel = astra_search.search_post_types_labels[postType]
? astra_search.search_post_types_labels[postType]
: postType + "s";
processedHtml += `<label class="ast-search--posttype-heading"> ${postTypeLabel} </label>`;
postsData.forEach((post) => {
const searchPostTitle = decodeHTMLEntities(post.title.rendered);
const headerCoverSearch = document.getElementById("ast-search-form");
const fullScreenSearch = document.getElementById("ast-seach-full-screen-form");
if (fullScreenSearch || headerCoverSearch) {
processedHtml += `<a class="ast-search-item" role="option" target="_self" href="${post.link}" tabindex="1"> <span> ${searchPostTitle} </span> </a>`;
} else {
processedHtml += `<a class="ast-search-item" role="option" target="_self" href="${post.link}"> <span> ${searchPostTitle} </span> </a>`;
}
});
});
return processedHtml;
}
window.addEventListener("load", function (e) {
const searchInputs = document.querySelectorAll(".search-field");
searchInputs.forEach((searchInput) => {
searchInput.addEventListener("input", function (event) {
const searchForm = searchInput.closest("form.search-form");
const searchTerm = event.target.value.trim();
const postTypes = astra_search.search_page_condition ? astra_search.search_page_post_types : astra_search.search_post_types;
const searchResultsWrappers = document.querySelectorAll(
".ast-live-search-results"
);
if (searchResultsWrappers) {
searchResultsWrappers.forEach(function (wrap) {
wrap.parentNode.removeChild(wrap);
});
}
try {
const restRequest = `${
astra_search.rest_api_url
}wp/v2/posts${
astra_search.rest_api_url.indexOf("?") > -1 ? "&" : "?"
}_embed=1&post_type=ast_queried:${postTypes.join(
":"
)}&per_page=${
astra_search.search_posts_per_page
}&search=${searchTerm}${
astra_search.search_language
? `&lang=${astra_search.search_language}`
: ""
}`;
var xhr = new XMLHttpRequest();
xhr.open("GET", restRequest, true);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
const postsData = JSON.parse(xhr.responseText);
let resultsContainer = "";
if (postsData.length > 0) {
let formattedPostsData = {};
postsData.forEach((post) => {
if (post.type in formattedPostsData) {
formattedPostsData[post.type].push(
post
);
} else {
formattedPostsData[post.type] = [post];
}
});
let searchResultMarkup =
getSearchResultPostMarkup(
formattedPostsData
);
resultsContainer = `
<div
class="ast-live-search-results"
role="listbox"
aria-label="Search results"
style="top: ${parseInt(searchForm.offsetHeight) + 10}px;"
>
${searchResultMarkup}
</div>
`;
} else {
resultsContainer = `
<div
class="ast-live-search-results"
role="listbox"
aria-label="Search results"
style="top: ${parseInt(searchForm.offsetHeight) + 10}px;"
>
<label class="ast-search--no-results-heading"> ${
astra_search.no_live_results_found
} </label>
</div>
`;
}
const searchResultsWrappers =
document.querySelectorAll(
".ast-live-search-results"
);
if (searchResultsWrappers) {
searchResultsWrappers.forEach(function (wrap) {
wrap.parentNode.removeChild(wrap);
});
}
searchForm.insertAdjacentHTML(
"beforeend",
resultsContainer
);
}
};
xhr.send();
} catch (error) {
console.error("Error while fetching data:", error);
}
});
});
});
// Add a click event listener to the document.
document.addEventListener("click", function (event) {
const searchForm = event.target.closest("form.search-form");
// Check if the clicked element is the search bar or the results dropdown
if (null !== searchForm) {
// Clicked inside the search bar or dropdown, do nothing
if (searchForm.querySelector(".ast-live-search-results")) {
searchForm.querySelector(
".ast-live-search-results"
).style.display = "block";
}
} else {
// Clicked outside the search bar and dropdown, hide the dropdown
const searchResultsWrappers = document.querySelectorAll(
".ast-live-search-results"
);
if (searchResultsWrappers) {
searchResultsWrappers.forEach(function (wrap) {
wrap.style.display = "none";
});
}
}
});
})();