diff --git a/web/src/lib/components/nav_bar.svelte b/web/src/lib/components/nav_bar.svelte index 90ca0e8e..c86e2991 100644 --- a/web/src/lib/components/nav_bar.svelte +++ b/web/src/lib/components/nav_bar.svelte @@ -22,7 +22,7 @@ {#if $currentUser} Trails - Map + Map Categories Favorites diff --git a/web/src/lib/stores/trail_store.ts b/web/src/lib/stores/trail_store.ts index 91e619c9..33d7c273 100644 --- a/web/src/lib/stores/trail_store.ts +++ b/web/src/lib/stores/trail_store.ts @@ -4,10 +4,11 @@ import type { Waypoint } from "$lib/models/waypoint"; import { pb } from "$lib/pocketbase"; import { getFileURL } from "$lib/util/file_util"; import { util } from "$lib/vendor/svelte-form-lib/util"; -import { writable, type Writable } from "svelte/store"; +import { get, writable, type Writable } from "svelte/store"; import { summit_logs_create, summit_logs_delete, summit_logs_update } from "./summit_log_store"; import { waypoints_create, waypoints_delete, waypoints_update } from "./waypoint_store"; import { ms } from "$lib/meilisearch"; +import type { LatLng } from "leaflet"; export const trails: Writable = writable([]) export const trail: Writable = writable(new Trail("")); @@ -15,7 +16,7 @@ export const trail: Writable = writable(new Trail("")); export const editTrail: Writable = writable(new Trail("")); export async function trails_index() { - const response: Trail[] = (await pb.collection('trails').getList(1, 5, {expand: "category,waypoints,summit_logs" })).items + const response: Trail[] = (await pb.collection('trails').getList(1, 5, { expand: "category,waypoints,summit_logs" })).items for (const trail of response) { setFileURLs(trail); @@ -26,7 +27,7 @@ export async function trails_index() { return response; } -export async function trails_search(filter: TrailFilter) { +export async function trails_search_filter(filter: TrailFilter) { let filterText: string = `distance >= ${filter.distanceMin} AND distance <= ${filter.distanceMax} AND elevation_gain >= ${filter.eleavationGainMin} AND elevation_gain <= ${filter.elevationGainMax}`; if (filter.category.length > 0) { @@ -62,6 +63,40 @@ export async function trails_search(filter: TrailFilter) { return dbResponse; } +export async function trails_search_bounding_box(northEast: LatLng, southWest: LatLng) { + const response = await ms.index("trails").search("", { + filter: [ + `_geoBoundingBox([${northEast.lat}, ${northEast.lng}], [${southWest.lat}, ${southWest.lng}])`, + ], + }); + const trailIds = response.hits.map((h) => h.id); + + if (trailIds.length == 0) { + trails.set([]); + return compareObjectArrays(get(trails), []); + } + + const dbResponse: Trail[] = ( + await pb.collection("trails").getList(1, 5, { + filter: trailIds.map((id) => `id="${id}"`).join("||"), + expand: "category,waypoints,summit_logs", + sort: `+name`, + }) + ).items; + + for (const trail of dbResponse) { + setFileURLs(trail); + const gpxData: string = await fetchGPX(trail); + trail.expand.gpx_data = gpxData; + } + + const comparison = compareObjectArrays(get(trails), dbResponse) + + trails.set(dbResponse); + + return comparison; +} + export async function trails_show(id: string, loadGPX?: boolean) { const response: Trail = await pb.collection('trails').getOne(id, { expand: "category,waypoints,summit_logs" }) diff --git a/web/src/routes/map/+page.svelte b/web/src/routes/map/+page.svelte new file mode 100644 index 00000000..fdd03f21 --- /dev/null +++ b/web/src/routes/map/+page.svelte @@ -0,0 +1,157 @@ + + +
+
+ {#each $trails as trail} + + {/each} +
+
+
+ + diff --git a/web/src/routes/map/+page.ts b/web/src/routes/map/+page.ts new file mode 100644 index 00000000..834c0218 --- /dev/null +++ b/web/src/routes/map/+page.ts @@ -0,0 +1,6 @@ +import { trails } from "$lib/stores/trail_store"; +import type { ServerLoad } from "@sveltejs/kit"; + +export const load: ServerLoad = async ({ params, locals }) => { + trails.set([]) +}; \ No newline at end of file diff --git a/web/src/routes/trails/+page.svelte b/web/src/routes/trails/+page.svelte index 6945217d..a94eb457 100644 --- a/web/src/routes/trails/+page.svelte +++ b/web/src/routes/trails/+page.svelte @@ -16,7 +16,7 @@ import type { Category } from "$lib/models/category"; import type { TrailFilter } from "$lib/models/trail"; import { categories } from "$lib/stores/category_store"; - import { trails, trails_search } from "$lib/stores/trail_store"; + import { trails, trails_search_filter } from "$lib/stores/trail_store"; import { country_codes } from "$lib/util/country_code_util"; import { formatMeters } from "$lib/util/format_util"; import { onMount } from "svelte"; @@ -71,15 +71,21 @@ let citySearchQuery: string = ""; + let filterExpanded: boolean = true; + onMount(() => { - const storedDisplayOption = localStorage.getItem("displayOption") - if(storedDisplayOption) { + const storedDisplayOption = localStorage.getItem("displayOption"); + if (storedDisplayOption) { selectedDisplayOption = storedDisplayOption; } - }) + + if (window.innerWidth < 768) { + filterExpanded = false; + } + }); async function searchTrails() { - await trails_search(filter); + await trails_search_filter(filter); } function setCategoryFilter(category: Category) { @@ -157,7 +163,7 @@ } function setDisplayOption() { - localStorage.setItem("displayOption", selectedDisplayOption); + localStorage.setItem("displayOption", selectedDisplayOption); } @@ -165,86 +171,99 @@ class="grid grid-cols-1 md:grid-cols-[300px_1fr] gap-8 max-w-7xl mx-6 md:mx-auto" >
- -
-

Category

- {#each $categories as category, i} -
- setCategoryFilter(category)} - /> - +
+
+
- {/each} -
-

Near

-
- searchCities(e.detail)} - on:click={(e) => handleSearchClick(e.detail)} - > +
- searchTrails()} - > -

- Radius: - {formatMeters(filter.near.radius)} -

-
-

Distance

- searchTrails()} - > -
- {formatMeters(filter.distanceMin)} - {formatMeters(filter.distanceMax)} -
-
-

Elevation Gain

- searchTrails()} - > -
- {formatMeters(filter.eleavationGainMin)} - {formatMeters(filter.elevationGainMax)} -
-
-

Completed

- setCompletedFilter(e.detail)} - > + + {#if filterExpanded} +
+

Category

+ {#each $categories as category, i} +
+ setCategoryFilter(category)} + /> + +
+ {/each} +
+

Near

+
+ searchCities(e.detail)} + on:click={(e) => handleSearchClick(e.detail)} + > +
+ searchTrails()} + > +

+ Radius: + {formatMeters(filter.near.radius)} +

+
+

Distance

+ searchTrails()} + > +
+ {formatMeters(filter.distanceMin)} + {formatMeters(filter.distanceMax)} +
+
+

Elevation Gain

+ searchTrails()} + > +
+ {formatMeters(filter.eleavationGainMin)} + {formatMeters(filter.elevationGainMax)} +
+
+

Completed

+ setCompletedFilter(e.detail)} + > + {/if}
-
+

Sort

@@ -255,7 +274,7 @@ > @@ -272,7 +291,10 @@
-