[WebHost] Add search filter and collapse button to Supported Games page (#2215)
* Add search filter and collapse button to Supported Games page * Autofocus search input, fix bug with arrow display when searching * Add "Expand All" and "Collapse All" buttons. Buttons respect visible games.
This commit is contained in:
parent
98d61b32af
commit
974bab2b24
|
@ -0,0 +1,83 @@
|
||||||
|
window.addEventListener('load', () => {
|
||||||
|
const gameHeaders = document.getElementsByClassName('collapse-toggle');
|
||||||
|
Array.from(gameHeaders).forEach((header) => {
|
||||||
|
const gameName = header.getAttribute('data-game');
|
||||||
|
header.addEventListener('click', () => {
|
||||||
|
const gameArrow = document.getElementById(`${gameName}-arrow`);
|
||||||
|
const gameInfo = document.getElementById(gameName);
|
||||||
|
if (gameInfo.classList.contains('collapsed')) {
|
||||||
|
gameArrow.innerText = '▼';
|
||||||
|
gameInfo.classList.remove('collapsed');
|
||||||
|
} else {
|
||||||
|
gameArrow.innerText = '▶';
|
||||||
|
gameInfo.classList.add('collapsed');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle game filter input
|
||||||
|
const gameSearch = document.getElementById('game-search');
|
||||||
|
gameSearch.value = '';
|
||||||
|
|
||||||
|
gameSearch.addEventListener('input', (evt) => {
|
||||||
|
if (!evt.target.value.trim()) {
|
||||||
|
// If input is empty, display all collapsed games
|
||||||
|
return Array.from(gameHeaders).forEach((header) => {
|
||||||
|
header.style.display = null;
|
||||||
|
const gameName = header.getAttribute('data-game');
|
||||||
|
document.getElementById(`${gameName}-arrow`).innerText = '▶';
|
||||||
|
document.getElementById(gameName).classList.add('collapsed');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop over all the games
|
||||||
|
Array.from(gameHeaders).forEach((header) => {
|
||||||
|
const gameName = header.getAttribute('data-game');
|
||||||
|
const gameArrow = document.getElementById(`${gameName}-arrow`);
|
||||||
|
const gameInfo = document.getElementById(gameName);
|
||||||
|
|
||||||
|
// If the game name includes the search string, display the game. If not, hide it
|
||||||
|
if (gameName.toLowerCase().includes(evt.target.value.toLowerCase())) {
|
||||||
|
header.style.display = null;
|
||||||
|
gameArrow.innerText = '▼';
|
||||||
|
gameInfo.classList.remove('collapsed');
|
||||||
|
} else {
|
||||||
|
console.log(header);
|
||||||
|
header.style.display = 'none';
|
||||||
|
gameArrow.innerText = '▶';
|
||||||
|
gameInfo.classList.add('collapsed');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
document.getElementById('expand-all').addEventListener('click', expandAll);
|
||||||
|
document.getElementById('collapse-all').addEventListener('click', collapseAll);
|
||||||
|
});
|
||||||
|
|
||||||
|
const expandAll = () => {
|
||||||
|
const gameHeaders = document.getElementsByClassName('collapse-toggle');
|
||||||
|
// Loop over all the games
|
||||||
|
Array.from(gameHeaders).forEach((header) => {
|
||||||
|
const gameName = header.getAttribute('data-game');
|
||||||
|
const gameArrow = document.getElementById(`${gameName}-arrow`);
|
||||||
|
const gameInfo = document.getElementById(gameName);
|
||||||
|
|
||||||
|
if (header.style.display === 'none') { return; }
|
||||||
|
gameArrow.innerText = '▼';
|
||||||
|
gameInfo.classList.remove('collapsed');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const collapseAll = () => {
|
||||||
|
const gameHeaders = document.getElementsByClassName('collapse-toggle');
|
||||||
|
// Loop over all the games
|
||||||
|
Array.from(gameHeaders).forEach((header) => {
|
||||||
|
const gameName = header.getAttribute('data-game');
|
||||||
|
const gameArrow = document.getElementById(`${gameName}-arrow`);
|
||||||
|
const gameInfo = document.getElementById(gameName);
|
||||||
|
|
||||||
|
if (header.style.display === 'none') { return; }
|
||||||
|
gameArrow.innerText = '▶';
|
||||||
|
gameInfo.classList.add('collapsed');
|
||||||
|
});
|
||||||
|
};
|
|
@ -18,6 +18,16 @@
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#games h2 .collapse-arrow{
|
||||||
|
font-size: 20px;
|
||||||
|
vertical-align: middle;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#games p.collapsed{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
#games a{
|
#games a{
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
@ -31,3 +41,13 @@
|
||||||
line-height: 25px;
|
line-height: 25px;
|
||||||
margin-bottom: 7px;
|
margin-bottom: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#games #page-controls{
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#games #page-controls button{
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
}
|
||||||
|
|
|
@ -4,16 +4,27 @@
|
||||||
<title>Supported Games</title>
|
<title>Supported Games</title>
|
||||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename="styles/markdown.css") }}" />
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename="styles/markdown.css") }}" />
|
||||||
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename="styles/supportedGames.css") }}" />
|
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename="styles/supportedGames.css") }}" />
|
||||||
|
<script type="application/ecmascript" src="{{ url_for('static', filename="assets/supportedGames.js") }}"></script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block body %}
|
||||||
{% include 'header/oceanHeader.html' %}
|
{% include 'header/oceanHeader.html' %}
|
||||||
<div id="games" class="markdown">
|
<div id="games" class="markdown">
|
||||||
<h1>Currently Supported Games</h1>
|
<h1>Currently Supported Games</h1>
|
||||||
|
<div>
|
||||||
|
<label for="game-search">Search for your game below!</label><br />
|
||||||
|
<div id="page-controls">
|
||||||
|
<input id="game-search" placeholder="Search by title..." autofocus />
|
||||||
|
<button id="expand-all">Expand All</button>
|
||||||
|
<button id="collapse-all">Collapse All</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% for game_name in worlds | title_sorted %}
|
{% for game_name in worlds | title_sorted %}
|
||||||
{% set world = worlds[game_name] %}
|
{% set world = worlds[game_name] %}
|
||||||
<h2>{{ game_name }}</h2>
|
<h2 class="collapse-toggle" data-game="{{ game_name }}">
|
||||||
<p>
|
<span id="{{ game_name }}-arrow" class="collapse-arrow">▶</span> {{ game_name }}
|
||||||
|
</h2>
|
||||||
|
<p id="{{ game_name }}" class="collapsed">
|
||||||
{{ world.__doc__ | default("No description provided.", true) }}<br />
|
{{ world.__doc__ | default("No description provided.", true) }}<br />
|
||||||
<a href="{{ url_for("game_info", game=game_name, lang="en") }}">Game Page</a>
|
<a href="{{ url_for("game_info", game=game_name, lang="en") }}">Game Page</a>
|
||||||
{% if world.web.tutorials %}
|
{% if world.web.tutorials %}
|
||||||
|
|
Loading…
Reference in New Issue