diff --git a/frontend/package.json b/frontend/package.json index 9c8f2a2..a9a725d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -35,6 +35,7 @@ "d3": "^7.9.0", "js-cookie": "^3.0.5", "marked": "^12.0.0", + "svelte-infinite-loading": "^1.3.8", "svelte-routing": "^2.11.0" }, "workspaces": [ diff --git a/frontend/src/lib/ListProteins.svelte b/frontend/src/lib/ListProteins.svelte index 5b604ed..86b40ae 100644 --- a/frontend/src/lib/ListProteins.svelte +++ b/frontend/src/lib/ListProteins.svelte @@ -99,7 +99,6 @@ flex-wrap: wrap; padding: 10px; margin-left: 10px; - height: calc(100vh - 100px); } .prot-info { width: 300px; diff --git a/frontend/src/routes/Search.svelte b/frontend/src/routes/Search.svelte index 3415e3e..3bb5ab4 100644 --- a/frontend/src/routes/Search.svelte +++ b/frontend/src/routes/Search.svelte @@ -6,8 +6,8 @@ import { Search, Button } from "flowbite-svelte"; import RangerFilter from "../lib/RangerFilter.svelte"; import DelayedSpinner from "../lib/DelayedSpinner.svelte"; - import app from "../main"; - import { navigate } from "svelte-routing"; + import InfiniteLoading from "svelte-infinite-loading"; + import type { InfiniteEvent } from "svelte-infinite-loading"; let query = ""; let proteinEntries: ProteinEntry[]; @@ -18,55 +18,73 @@ let lengthExtent: { min: number; max: number }; let massFilter: { min: number; max: number } | undefined; let massExtent: { min: number; max: number }; - let filterResetCounter = 0; - - let urlParams = new URLSearchParams(window.location.search) - let proteinsPerPage = 20 // The number of proteins to show per page - let page = 0 + let filterResetCounter = 0; + let searchTop: HTMLFormElement; + let proteinsPerPage = 20; // The number of proteins to show per page + let page = 0; onMount(async () => { - // Redirects user to ?page=1 if page query string not present - - /* - if (page == null) { - navigate('search?page=1') - } - console.log("Page is", page) - */ - await search(); species = await Backend.searchSpecies(); lengthExtent = await Backend.searchRangeLength(); massExtent = await Backend.searchRangeMass(); massFilter = massExtent; lengthFilter = lengthExtent; - console.log(page) + console.log(page); }); + function infiniteProteinScroll({ + detail: { loaded, complete }, + }: InfiniteEvent) { + page++; + Backend.searchProteins({ + query, + speciesFilter, + lengthFilter, + massFilter, + proteinsPerPage, + page, + }).then((d) => { + totalFound = d.totalFound; + if (totalFound === 0) { + complete(); + } else { + proteinEntries = proteinEntries.concat(d.proteinEntries); // add on top instead of replacing as we load more + loaded(); + } + }); + } + async function search() { const result = await Backend.searchProteins({ query, speciesFilter, lengthFilter, massFilter, - proteinsPerPage, - page + proteinsPerPage, + page, }); proteinEntries = result.proteinEntries; totalFound = result.totalFound; } - async function searchAndResetPage() { - page = 0; - await search(); - } + async function searchAndResetPage() { + scrollTop(); + page = 0; + await search(); + } async function resetFilter() { + scrollTop(); speciesFilter = undefined; lengthFilter = lengthExtent; massFilter = massExtent; query = ""; - page = 0; - filterResetCounter++; // Incrementing this so relevant components can be destroyed and re-created + page = 0; + filterResetCounter++; // Incrementing this so relevant components can be destroyed and re-created await search(); } + + function scrollTop() { + searchTop.scrollIntoView({ block: "end" }); + } @@ -88,7 +106,7 @@ outline on:click={async () => { speciesFilter = s; - await searchAndResetPage(); + await searchAndResetPage(); }} > {s} @@ -100,38 +118,43 @@

Amino Acids Length

{#if lengthExtent && lengthFilter} - {#key filterResetCounter} - { - lengthFilter = detail; - await searchAndResetPage(); - }} - /> - {/key} + {#key filterResetCounter} + { + lengthFilter = detail; + await searchAndResetPage(); + }} + /> + {/key} {/if}

Mass (Da)

{#if massExtent && massFilter} - {#key filterResetCounter} - { - massFilter = detail; - await searchAndResetPage() - }} - /> - {/key} + {#key filterResetCounter} + { + massFilter = detail; + await searchAndResetPage(); + }} + /> + {/key} {/if}
- { + await resetFilter(); + }} + outline + size="xs" + color="light">Reset All Filters
{:else} @@ -140,47 +163,39 @@
-