-
Notifications
You must be signed in to change notification settings - Fork 605
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add search (filter) for an specific Integration on Homepage's Integrations section #1837
Closed
Closed
Changes from 2 commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,83 +1,151 @@ | ||
<div class="integrations-heading" style="padding-top: 2rem;"> | ||
<style> | ||
.search-container-wrapper { | ||
display: flex; | ||
justify-content: center; | ||
margin: 20px 0; | ||
} | ||
|
||
#search-container { | ||
display: flex; | ||
align-items: center; | ||
position: relative; | ||
width: 100%; | ||
max-width: 500px; | ||
background-color: #fff; | ||
border: 1px solid #ddd; | ||
border-radius: 5px; | ||
overflow: hidden; | ||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); | ||
} | ||
|
||
.search-icon { | ||
right: 10px; | ||
padding: 0 10px; | ||
font-size: 20px; | ||
color: #000; | ||
pointer-events: none; | ||
} | ||
|
||
#search { | ||
flex-grow: 1; | ||
height: 40px; | ||
padding: 10px 40px 10px 10px; | ||
border: none; | ||
font-size: 16px; | ||
box-sizing: border-box; | ||
outline: none; | ||
border-radius: 5px 0 0 5px; | ||
background-color: #fff; | ||
} | ||
|
||
#search:focus { | ||
background-color: #f0f0f0; | ||
} | ||
|
||
@media (max-width: 506px) { | ||
#search-container { | ||
max-width: 100%; | ||
} | ||
} | ||
|
||
#integContainer { | ||
column-gap: max(2vh, 2vw); | ||
row-gap: 1.5rem; | ||
display: flex; | ||
flex-wrap: wrap; | ||
padding-bottom: 3.5rem; | ||
} | ||
</style> | ||
|
||
|
||
<div class="integrations-heading"> | ||
<div class="parallel-left"></div> | ||
<div class="parallel-right"></div> | ||
<h1 id="integration-heading"></h1> | ||
<h2> | ||
for your Cloud Native Infrastructure and Apps | ||
</h2> | ||
<p style="margin: auto 10vw;"> | ||
<h2>for your Cloud Native Infrastructure and Apps</h2> | ||
<p> | ||
Meshery seamlessly integrates with every CNCF project, your existing tools, multiple Clouds and Kubernetes clusters. | ||
</p> | ||
</div> | ||
<div id="integContainer" class="integrations-container container" | ||
style="column-gap: max(2vh, 2vw); row-gap: 1.5rem; display: flex; flex-wrap: wrap; padding-bottom: 3.5rem;"> | ||
</div> | ||
<div class="integrations-3d-link"> | ||
<div class="button-container" style="display: flex; align-items: center; justify-content: center; row-gap: 18px; column-gap: 32px; flex-wrap: wrap;"> | ||
<a class="highlight show-all-button toggle-text" | ||
style="display: inline-block; width: fit-content; cursor:pointer;">Show More | ||
Integrations</a> | ||
<a class="highlight show-all-button" href="/integrations" | ||
style="display: inline-block; width: fit-content;">View | ||
Integrations in 3D</a> | ||
|
||
<div class="search-container-wrapper"> | ||
<div id="search-container"> | ||
<input type="text" id="search" placeholder="Search..." /> | ||
<span class="search-icon"><i class="fas fa-search"></i></span> | ||
</div> | ||
</div> | ||
</div> | ||
|
||
<script type="module"> | ||
// integrations.js | ||
import data from '../../integrations/data.js'; | ||
|
||
const integHeading = document.getElementById("integration-heading"); | ||
const roundedIntegNumber = Math.floor(data.length / 10) * 10; | ||
integHeading.textContent = `${roundedIntegNumber}+ Built-In Integrations`; | ||
|
||
const integContainer = document.getElementById("integContainer"); | ||
|
||
let allDataShown = false; | ||
|
||
function renderIntegrationCards(data, showAll) { | ||
const cardsToShow = showAll ? data.length : 40; | ||
return data.slice(0, cardsToShow).map(item => { | ||
const iconURL = item.color.split('/').slice(1).join('/'); | ||
|
||
return ` | ||
<a href="${item.permalink}" class="integrations-card"> | ||
<div class="integrations-card-inner"> | ||
<div class="card-front"> | ||
<img src="${iconURL}" loading="lazy" id="logo-dark-light" | ||
data-logo-for-dark="${iconURL}" | ||
data-logo-for-light="${iconURL}" /> | ||
</div> | ||
<div class="card-back"> | ||
<p> ${item.name} </p> | ||
</div> | ||
</div> | ||
</a>`; | ||
}).join(''); | ||
} | ||
<div id="integContainer" class="integrations-container container"></div> | ||
|
||
<div class="integrations-3d-link"> | ||
<div class="button-container"> | ||
<a class="highlight show-all-button toggle-text">Show More Integrations</a> | ||
<a class="highlight show-all-button" href="/integrations">View Integrations in 3D</a> | ||
</div> | ||
</div> | ||
|
||
<script type="module"> | ||
// integrations.js | ||
import data from '../../integrations/data.js'; | ||
|
||
const scrollOptions = { behavior: "smooth" }; | ||
const integHeading = document.getElementById("integration-heading"); | ||
const roundedIntegNumber = Math.floor(data.length / 10) * 10; | ||
integHeading.textContent = `${roundedIntegNumber}+ Built-In Integrations`; | ||
|
||
integContainer.innerHTML = renderIntegrationCards(data, allDataShown); | ||
const integContainer = document.getElementById("integContainer"); | ||
|
||
document.querySelector('.show-all-button').addEventListener('click', () => { | ||
allDataShown = !allDataShown; | ||
let allDataShown = false; | ||
|
||
const button = document.querySelector('.toggle-text'); | ||
|
||
if (allDataShown) { | ||
button.textContent = 'See Less Integrations'; // Change button text when allDataShown is true | ||
} else { | ||
button.textContent = 'See All Integrations'; // Change button text when allDataShown is false | ||
function renderIntegrationCards(data, showAll) { | ||
const cardsToShow = showAll ? data.length : 40; | ||
return data.slice(0, cardsToShow).map(item => { | ||
const iconURL = item.color.split('/').slice(1).join('/'); | ||
|
||
return ` | ||
<a href="${item.permalink}" class="integrations-card"> | ||
<div class="integrations-card-inner"> | ||
<div class="card-front"> | ||
<img src="${iconURL}" loading="lazy" id="logo-dark-light" | ||
data-logo-for-dark="${iconURL}" | ||
data-logo-for-light="${iconURL}" /> | ||
</div> | ||
<div class="card-back"> | ||
<p> ${item.name} </p> | ||
</div> | ||
</div> | ||
</a>`; | ||
}).join(''); | ||
} | ||
|
||
const scrollOptions = { behavior: "smooth" }; | ||
|
||
integContainer.innerHTML = renderIntegrationCards(data, allDataShown); | ||
|
||
// Scroll to the <h2> tag | ||
if (!allDataShown) { | ||
const h2Tag = document.querySelector('h2'); | ||
h2Tag.scrollIntoView(scrollOptions); | ||
} | ||
}); | ||
</script> | ||
document.querySelector(".show-all-button").addEventListener("click", () => { | ||
allDataShown = !allDataShown; | ||
|
||
const button = document.querySelector(".toggle-text"); | ||
|
||
if (allDataShown) { | ||
button.textContent = "See Less Integrations"; | ||
} else { | ||
button.textContent = "Show More Integrations"; | ||
} | ||
|
||
integContainer.innerHTML = renderIntegrationCards(data, allDataShown); | ||
|
||
if (!allDataShown) { | ||
const h2Tag = document.querySelector("h2"); | ||
h2Tag.scrollIntoView(scrollOptions); | ||
} | ||
}); | ||
|
||
document.getElementById("search").addEventListener("input", function () { | ||
var searchValue = this.value.toLowerCase(); | ||
var filteredData = data.filter((item) => | ||
item.name.toLowerCase().includes(searchValue) | ||
); | ||
|
||
integContainer.innerHTML = renderIntegrationCards(filteredData, allDataShown); | ||
}); | ||
</script> | ||
</div> |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@shubhusion why the existing search bar that is in catalog page is being not reused? Why we have to create new component and styles? Please reuse that
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@shubhusion i didn't heard from you...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@sudhanshutech I will make the necessary changes, but I'm a bit busy this week. Please give me some time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@shubhusion
The styles from the existing search bar on the catalog page were duplicated and adapted for the new search bar on the home page. Some modifications were made to ensure it fits well on the home page.
To reuse the same styles, I will need to create a shared .css file that is accessible to both pages.