upskill-event-manager/assets/js/live-search.js
Ben Reed cdc5ea85f4 feat: Add comprehensive CSS, JavaScript and theme asset infrastructure
Add massive collection of CSS, JavaScript and theme assets that were previously excluded:

**CSS Files (681 total):**
- HVAC plugin-specific styles (hvac-*.css): 34 files including dashboard, certificates, registration, mobile nav, accessibility fixes, animations, and welcome popup
- Theme framework files (Astra, builder systems, layouts): 200+ files
- Plugin compatibility styles (WooCommerce, WPForms, Elementor, Contact Form 7): 150+ files
- WordPress core and editor styles: 50+ files
- Responsive and RTL language support: 200+ files

**JavaScript Files (400+ total):**
- HVAC plugin functionality (hvac-*.js): 27 files including menu systems, dashboard enhancements, profile sharing, mobile responsive features, accessibility, and animations
- Framework and library files: jQuery plugins, GSAP, AOS, Swiper, Chart.js, Lottie, Isotope
- Plugin compatibility scripts: WPForms, WooCommerce, Elementor, Contact Form 7, LifterLMS
- WordPress core functionality: customizer, admin, block editor compatibility
- Third-party integrations: Stripe, SMTP, analytics, search functionality

**Assets:**
- Certificate background images and logos
- Comprehensive theme styling infrastructure
- Mobile-responsive design systems
- Cross-browser compatibility assets
- Performance-optimized minified versions

**Updated .gitignore:**
- Fixed asset directory whitelisting patterns to properly include CSS/JS/images
- Added proper directory structure recognition (!/assets/css/, !/assets/js/, etc.)
- Maintains security by excluding sensitive files while including essential assets

This commit provides the complete frontend infrastructure needed for:
- Full theme functionality and styling
- Plugin feature implementations
- Mobile responsiveness and accessibility
- Cross-browser compatibility
- Performance optimization
- Developer workflow support
2025-08-11 16:20:31 -03: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";
});
}
}
});
})();