feat(*): Add pagination to my dex

This commit is contained in:
Josh Creek
2024-07-12 21:33:02 +01:00
parent 8d86d93bc0
commit 2cf3a03f8f
4 changed files with 124 additions and 127 deletions
+29
View File
@@ -0,0 +1,29 @@
<script lang="ts">
export let currentPage: number;
export let itemsPerPage: number;
export let totalPages: number;
function nextPage() {
currentPage = Math.min(currentPage + 1, totalPages);
}
function previousPage() {
currentPage = Math.max(currentPage - 1, 1);
}
function setItemsPerPage(event: any) {
itemsPerPage = parseInt(event.target.value, 10);
}
</script>
<div>
<button on:click={previousPage} disabled={currentPage === 1}>Previous</button>
<button on:click={nextPage} disabled={currentPage === totalPages}>Next</button>
<label for="itemsPerPage">Items per page:</label>
<select id="itemsPerPage" on:change={setItemsPerPage}>
<option value="20">20</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div>
@@ -0,0 +1,45 @@
import PokedexEntryModel, { type PokedexEntry } from '$lib/models/PokedexEntry';
import CatchRecordModel, { type CatchRecord } from '$lib/models/CatchRecord';
import { CombinedData } from '$lib/models/CombinedData';
class CombinedDataRepository {
async findCombinedData(page: number = 1, limit: number = 20): Promise<CombinedData[]> {
const skip = (page - 1) * limit;
const combinedData: CombinedData[] = await PokedexEntryModel.aggregate([
{
$lookup: {
from: 'catchrecords',
localField: '_id',
foreignField: 'pokedexEntryId',
as: 'catchRecord'
}
},
{
$unwind: {
path: '$catchRecord',
preserveNullAndEmptyArrays: true
}
},
{
$sort: {
'boxPlacement.box': 1,
'boxPlacement.row': 1,
'boxPlacement.column': 1
}
},
{ $skip: skip },
{ $limit: limit }
]).exec();
return combinedData.map((data) => ({
pokedexEntry: data as PokedexEntry,
catchRecord: data.catchRecord as CatchRecord
}));
}
async countCombinedData(): Promise<number> {
return PokedexEntryModel.countDocuments().exec();
}
}
export default CombinedDataRepository;