diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3e8bbfc0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +.vscode/ +search/ \ No newline at end of file diff --git a/db/pb_migrations/1706962342_updated_trails.js b/db/pb_migrations/1706962342_updated_trails.js new file mode 100644 index 00000000..8306c68b --- /dev/null +++ b/db/pb_migrations/1706962342_updated_trails.js @@ -0,0 +1,50 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + // add + collection.schema.addField(new SchemaField({ + "system": false, + "id": "eqeqja1s", + "name": "lat", + "type": "number", + "required": false, + "presentable": false, + "unique": false, + "options": { + "min": null, + "max": null, + "noDecimal": false + } + })) + + // add + collection.schema.addField(new SchemaField({ + "system": false, + "id": "y6dbfyw6", + "name": "lon", + "type": "number", + "required": false, + "presentable": false, + "unique": false, + "options": { + "min": null, + "max": null, + "noDecimal": false + } + })) + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + // remove + collection.schema.removeField("eqeqja1s") + + // remove + collection.schema.removeField("y6dbfyw6") + + return dao.saveCollection(collection) +}) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..664b99cb --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "wanderer", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/package.json @@ -0,0 +1 @@ +{} diff --git a/web/package-lock.json b/web/package-lock.json index 02e64839..55e7f205 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -15,6 +15,7 @@ "leaflet": "^1.9.4", "leaflet-gpx": "^1.7.0", "leaflet.awesome-markers": "^2.0.5", + "meilisearch": "^0.37.0", "photoswipe": "^5.4.3", "pocketbase": "^0.21.0", "yup": "^1.3.3" @@ -1328,6 +1329,14 @@ "node": ">= 0.6" } }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2031,6 +2040,14 @@ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, + "node_modules/meilisearch": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/meilisearch/-/meilisearch-0.37.0.tgz", + "integrity": "sha512-LdbK6JmRghCawrmWKJSEQF0OiE82md+YqJGE/U2JcCD8ROwlhTx0KM6NX4rQt0u0VpV0QZVG9umYiu3CSSIJAQ==", + "dependencies": { + "cross-fetch": "^3.1.6" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2187,6 +2204,25 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -3366,6 +3402,11 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -3624,6 +3665,20 @@ } } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/web/package.json b/web/package.json index c55f8fd0..68e86445 100644 --- a/web/package.json +++ b/web/package.json @@ -38,6 +38,7 @@ "leaflet": "^1.9.4", "leaflet-gpx": "^1.7.0", "leaflet.awesome-markers": "^2.0.5", + "meilisearch": "^0.37.0", "photoswipe": "^5.4.3", "pocketbase": "^0.21.0", "yup": "^1.3.3" diff --git a/web/src/lib/components/trail/trail_card.svelte b/web/src/lib/components/trail/trail_card.svelte index ab6061fd..592c493d 100644 --- a/web/src/lib/components/trail/trail_card.svelte +++ b/web/src/lib/components/trail/trail_card.svelte @@ -1,5 +1,6 @@
-
+
diff --git a/web/src/routes/trail/edit/[id]/+page.svelte b/web/src/routes/trail/edit/[id]/+page.svelte index a79d5bcf..55e6c8e0 100644 --- a/web/src/routes/trail/edit/[id]/+page.svelte +++ b/web/src/routes/trail/edit/[id]/+page.svelte @@ -9,6 +9,7 @@ import SummitLogModal from "$lib/components/summit_log/summit_log_modal.svelte"; import WaypointCard from "$lib/components/waypoint/waypoint_card.svelte"; import WaypointModal from "$lib/components/waypoint/waypoint_modal.svelte"; + import { ms } from "$lib/meilisearch"; import { SummitLog } from "$lib/models/summit_log"; import { Trail, trailSchema } from "$lib/models/trail"; import { Waypoint } from "$lib/models/waypoint"; @@ -105,63 +106,69 @@ }); function addGPXLayer(gpx: string, addWaypoints: boolean = true) { - gpxLayer?.remove(); - gpxLayer = new L.GPX(gpx, { - async: true, - gpx_options: { - parseElements: [ - "track", - "route", - ...(addWaypoints ? ["waypoint"] : []), - ], - }, - marker_options: { - wptIcons: { - "": L.AwesomeMarkers.icon({ - icon: "circle", + return new Promise(function (resolve, reject) { + gpxLayer?.remove(); + gpxLayer = new L.GPX(gpx, { + async: true, + gpx_options: { + parseElements: [ + "track", + "route", + ...(addWaypoints ? ["waypoint"] : []), + ], + }, + marker_options: { + wptIcons: { + "": L.AwesomeMarkers.icon({ + icon: "circle", + prefix: "fa", + markerColor: "cadetblue", + iconColor: "white", + }) as Icon, + }, + startIcon: L.AwesomeMarkers.icon({ + icon: "circle-half-stroke", prefix: "fa", markerColor: "cadetblue", iconColor: "white", }) as Icon, + endIcon: L.AwesomeMarkers.icon({ + icon: "flag-checkered", + prefix: "fa", + markerColor: "cadetblue", + iconColor: "white", + }) as Icon, + startIconUrl: "", + endIconUrl: "", + shadowUrl: "", }, - startIcon: L.AwesomeMarkers.icon({ - icon: "circle-half-stroke", - prefix: "fa", - markerColor: "cadetblue", - iconColor: "white", - }) as Icon, - endIcon: L.AwesomeMarkers.icon({ - icon: "flag-checkered", - prefix: "fa", - markerColor: "cadetblue", - iconColor: "white", - }) as Icon, - startIconUrl: "", - endIconUrl: "", - shadowUrl: "", - }, - }) - .on("addpoint", function (e: any) { - if (e.point_type === "start") { - e.point.setZIndexOffset(1000); - } else if (e.point_type === "waypoint") { - const waypoint = new Waypoint( - e.point._latlng.lat, - e.point._latlng.lng, - { name: e.point.options.title, marker: e.point }, - ); - if (!$form.expand.waypoints) { + }) + .on("addpoint", function (e: any) { + if (e.point_type === "start") { + e.point.setZIndexOffset(1000); + $form.lat = e.point._latlng.lat; + $form.lon = e.point._latlng.lng; + } else if (e.point_type === "waypoint") { + const waypoint = new Waypoint( + e.point._latlng.lat, + e.point._latlng.lng, + { name: e.point.options.title, marker: e.point }, + ); + if (!$form.expand.waypoints) { + } + $form.expand.waypoints.push(waypoint); } - $form.expand.waypoints.push(waypoint); - } - }) - .on("loaded", function (e: LeafletEvent) { - map.fitBounds(e.target.getBounds()); - $form.distance = e.target.get_distance(); - $form.elevation_gain = e.target.get_elevation_gain(); - $form.duration = e.target.get_total_time() / 1000 / 60; - }) - .addTo(map); + }) + .on("loaded", function (e: LeafletEvent) { + map.fitBounds(e.target.getBounds()); + $form.distance = e.target.get_distance(); + $form.elevation_gain = e.target.get_elevation_gain(); + $form.duration = e.target.get_total_time() / 1000 / 60; + resolve(); + }) + .on("error", reject) + .addTo(map); + }); } function openFileBrowser() { @@ -184,9 +191,14 @@ reader.readAsText(selectedFile); - reader.onload = function (e) { + reader.onload = async function (e) { trail.set(new Trail("")); - addGPXLayer(e.target?.result as string); + await addGPXLayer(e.target?.result as string); + console.log(await + ms.index("cities500").search("", { + filter: [`_geoRadius(${$form.lat}, ${$form.lon}, 100000000000)`], + }), + ); }; } @@ -368,6 +380,8 @@ >
+ +
{ let trail: Trail; if (params.id === "new") { - trail = new Trail("", { category: categories[0] }); + trail = new Trail("", {category: categories[0]}); } else { trail = await trails_show(params.id, true); } diff --git a/web/src/routes/trail/view/[id]/+page.svelte b/web/src/routes/trail/view/[id]/+page.svelte index 85004ce9..a1cd38e0 100644 --- a/web/src/routes/trail/view/[id]/+page.svelte +++ b/web/src/routes/trail/view/[id]/+page.svelte @@ -9,6 +9,7 @@ trails_delete, trails_index, } from "$lib/stores/trail_store"; + import { currentUser } from "$lib/stores/user_store"; import { formatMeters, formatTimeHHMM } from "$lib/util/format_util"; import { createMarkerFromWaypoint } from "$lib/util/leaflet_util"; import type { Icon, Marker } from "leaflet"; @@ -150,13 +151,15 @@ {$trail.location} -
- handleDropdownClick(e.detail)} - > -
+ {#if $currentUser && $currentUser.id == $trail.author} +
+ handleDropdownClick(e.detail)} + > +
+ {/if}