[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