Spaces:
Running
Running
File size: 2,785 Bytes
ab5fa2c 2ba5ab4 91147de 2ba5ab4 138a7ca 91147de 2ba5ab4 91147de 2ba5ab4 5cbcd9d 2ba5ab4 91147de 2ba5ab4 91147de 2ba5ab4 91147de |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
const RESULTS_PER_PAGE = 20;
let allResults = [];
let currentPage = 0;
var board = Chessboard("board", {
draggable: true,
dropOffBoard: "trash",
sparePieces: true,
pieceTheme: "/static/img/chesspieces/wikipedia/{piece}.png",
onSnapEnd: updateInfo,
});
function updateInfo() {
document.getElementById('fen').value = board.fen();
let pos = board.position();
let pieces = Object.keys(pos).length;
}
function search() {
let pos = board.position();
if (Object.keys(pos).length < 3) {
document.getElementById("results").innerHTML =
"<p>Add at least 3 pieces to search.</p>";
return;
}
document.getElementById("results").innerHTML = "<p>Searching...</p>";
fetch("/search", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ fen: board.fen() }),
})
.then((r) => r.json())
.then((data) => {
allResults = data.results;
window.searchTimeMs = data.time_ms;
currentPage = 0;
displayPage();
});
}
function displayPage() {
const start = currentPage * RESULTS_PER_PAGE,
end = start + RESULTS_PER_PAGE,
pageResults = allResults.slice(start, end),
totalPages = Math.ceil(allResults.length / RESULTS_PER_PAGE);
const paginationHtml = allResults.length > 0 ? `<div class="pagination"><button onclick="prevPage()" ${currentPage === 0 ? "disabled" : ""}><</button><button onclick="nextPage()" ${end >= allResults.length ? "disabled" : ""}>></button></div>` : "";
let html = `<p>Found ${allResults.length} puzzles${allResults.length > 0 ? ` in ${window.searchTimeMs.toFixed(0)}ms (page ${currentPage + 1} of ${totalPages})` : ""}</p>`;
html += paginationHtml;
html += `<div class="puzzle-grid">`;
pageResults.forEach((p, i) => {
const idx = start + i;
html += `<div class="puzzle"><div class="puzzle-board" id="result-board-${idx}"></div><div class="puzzle-info"><h3><a href="https://lichess.org/training/${p.PuzzleId}" target="_blank">${p.PuzzleId}</a></h3><p>Rating: ${p.Rating} | Pop: ${p.Popularity}%</p><div class="themes">${p.Themes.map((t) => `<span class="theme">${t}</span>`).join(" ")}</div><p>Move ${p.MatchedMove}</p></div></div>`;
});
html += `</div>`;
html += paginationHtml;
document.getElementById("results").innerHTML = html;
pageResults.forEach((p, i) =>
Chessboard(`result-board-${start + i}`, {
position: p.FEN,
pieceTheme: "/static/img/chesspieces/wikipedia/{piece}.png",
})
);
}
function nextPage() {
if ((currentPage + 1) * RESULTS_PER_PAGE < allResults.length) {
currentPage++;
displayPage();
}
}
function prevPage() {
if (currentPage > 0) {
currentPage--;
displayPage();
}
}
updateInfo();
|