From 905995a01c304960976f9801b56069b834c06ab7 Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Fri, 2 Feb 2024 22:48:24 +0100 Subject: [PATCH] adds user management --- db/pb_migrations/1706901300_updated_users.js | 31 ++++++ db/pb_migrations/1706905108_updated_trails.js | 27 +++++ db/pb_migrations/1706905430_updated_trails.js | 48 +++++++++ db/pb_migrations/1706907701_updated_trails.js | 24 +++++ .../1706907926_updated_waypoints.js | 24 +++++ .../1706907953_updated_summit_logs.js | 24 +++++ .../1706908030_updated_summit_logs.js | 22 +++++ .../1706908043_updated_waypoints.js | 22 +++++ .../1706908165_updated_waypoints.js | 16 +++ .../1706908193_updated_waypoints.js | 18 ++++ .../1706908206_updated_waypoints.js | 16 +++ .../1706908221_updated_waypoints.js | 16 +++ .../1706908229_updated_summit_logs.js | 16 +++ .../1706908236_updated_waypoints.js | 16 +++ .../1706908260_updated_summit_logs.js | 16 +++ .../1706908281_updated_waypoints.js | 16 +++ .../1706908311_updated_waypoints.js | 16 +++ .../1706908342_updated_waypoints.js | 16 +++ .../1706908372_updated_waypoints.js | 16 +++ .../1706908432_updated_waypoints.js | 18 ++++ db/pb_migrations/1706908739_updated_trails.js | 16 +++ db/pb_migrations/1706908748_updated_trails.js | 16 +++ .../1706908846_updated_waypoints.js | 16 +++ .../1706908854_updated_waypoints.js | 16 +++ .../1706908926_updated_waypoints.js | 18 ++++ .../1706908971_updated_waypoints.js | 18 ++++ .../1706909005_updated_waypoints.js | 18 ++++ .../1706909055_updated_summit_logs.js | 22 +++++ web/src/app.d.ts | 1 + web/src/hooks.client.ts | 8 ++ web/src/hooks.server.ts | 40 +++++--- web/src/lib/components/avatar.svelte | 1 - web/src/lib/components/base/dropdown.svelte | 24 +++-- web/src/lib/components/base/select.svelte | 4 +- web/src/lib/components/base/text_field.svelte | 14 ++- web/src/lib/components/base/toast.svelte | 51 ++++++---- web/src/lib/components/base/toggle.svelte | 18 ++++ web/src/lib/components/footer.svelte | 2 +- .../components/{ => logo}/logo_text.svelte | 0 .../{ => logo}/logo_text_light.svelte | 0 .../components/logo/logo_text_two_line.svelte | 33 +++++++ web/src/lib/components/nav_bar.svelte | 55 ++++++++--- .../summit_log/summit_log_modal.svelte | 2 +- web/src/lib/constants.ts | 6 -- web/src/lib/models/trail.ts | 3 + web/src/lib/pocketbase.ts | 8 ++ web/src/lib/stores/category_store.ts | 2 +- web/src/lib/stores/summit_log_store.ts | 12 ++- web/src/lib/stores/toast_store.ts | 9 +- web/src/lib/stores/trail_store.ts | 75 +++++++++++--- web/src/lib/stores/user_store.ts | 25 +++++ web/src/lib/stores/waypoint_store.ts | 10 +- web/src/lib/util/file_util.ts | 2 +- web/src/routes/+layout.svelte | 2 +- web/src/routes/+page.svelte | 16 +-- web/src/routes/login/+page.svelte | 88 +++++++++++++++++ web/src/routes/register/+page.svelte | 98 +++++++++++++++++++ web/src/routes/trail/edit/[id]/+page.svelte | 31 ++++-- web/src/routes/trail/view/[id]/+page.svelte | 59 ++++++++--- web/src/routes/trail/view/[id]/+page.ts | 6 +- 60 files changed, 1135 insertions(+), 128 deletions(-) create mode 100644 db/pb_migrations/1706901300_updated_users.js create mode 100644 db/pb_migrations/1706905108_updated_trails.js create mode 100644 db/pb_migrations/1706905430_updated_trails.js create mode 100644 db/pb_migrations/1706907701_updated_trails.js create mode 100644 db/pb_migrations/1706907926_updated_waypoints.js create mode 100644 db/pb_migrations/1706907953_updated_summit_logs.js create mode 100644 db/pb_migrations/1706908030_updated_summit_logs.js create mode 100644 db/pb_migrations/1706908043_updated_waypoints.js create mode 100644 db/pb_migrations/1706908165_updated_waypoints.js create mode 100644 db/pb_migrations/1706908193_updated_waypoints.js create mode 100644 db/pb_migrations/1706908206_updated_waypoints.js create mode 100644 db/pb_migrations/1706908221_updated_waypoints.js create mode 100644 db/pb_migrations/1706908229_updated_summit_logs.js create mode 100644 db/pb_migrations/1706908236_updated_waypoints.js create mode 100644 db/pb_migrations/1706908260_updated_summit_logs.js create mode 100644 db/pb_migrations/1706908281_updated_waypoints.js create mode 100644 db/pb_migrations/1706908311_updated_waypoints.js create mode 100644 db/pb_migrations/1706908342_updated_waypoints.js create mode 100644 db/pb_migrations/1706908372_updated_waypoints.js create mode 100644 db/pb_migrations/1706908432_updated_waypoints.js create mode 100644 db/pb_migrations/1706908739_updated_trails.js create mode 100644 db/pb_migrations/1706908748_updated_trails.js create mode 100644 db/pb_migrations/1706908846_updated_waypoints.js create mode 100644 db/pb_migrations/1706908854_updated_waypoints.js create mode 100644 db/pb_migrations/1706908926_updated_waypoints.js create mode 100644 db/pb_migrations/1706908971_updated_waypoints.js create mode 100644 db/pb_migrations/1706909005_updated_waypoints.js create mode 100644 db/pb_migrations/1706909055_updated_summit_logs.js create mode 100644 web/src/hooks.client.ts delete mode 100644 web/src/lib/components/avatar.svelte create mode 100644 web/src/lib/components/base/toggle.svelte rename web/src/lib/components/{ => logo}/logo_text.svelte (100%) rename web/src/lib/components/{ => logo}/logo_text_light.svelte (100%) create mode 100644 web/src/lib/components/logo/logo_text_two_line.svelte delete mode 100644 web/src/lib/constants.ts create mode 100644 web/src/lib/pocketbase.ts create mode 100644 web/src/lib/stores/user_store.ts create mode 100644 web/src/routes/login/+page.svelte create mode 100644 web/src/routes/register/+page.svelte diff --git a/db/pb_migrations/1706901300_updated_users.js b/db/pb_migrations/1706901300_updated_users.js new file mode 100644 index 00000000..9461dbcb --- /dev/null +++ b/db/pb_migrations/1706901300_updated_users.js @@ -0,0 +1,31 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("_pb_users_auth_") + + // remove + collection.schema.removeField("users_name") + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("_pb_users_auth_") + + // add + collection.schema.addField(new SchemaField({ + "system": false, + "id": "users_name", + "name": "name", + "type": "text", + "required": false, + "presentable": false, + "unique": false, + "options": { + "min": null, + "max": null, + "pattern": "" + } + })) + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706905108_updated_trails.js b/db/pb_migrations/1706905108_updated_trails.js new file mode 100644 index 00000000..b0e1d7b7 --- /dev/null +++ b/db/pb_migrations/1706905108_updated_trails.js @@ -0,0 +1,27 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + // add + collection.schema.addField(new SchemaField({ + "system": false, + "id": "ehrmydva", + "name": "public", + "type": "bool", + "required": false, + "presentable": false, + "unique": false, + "options": {} + })) + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + // remove + collection.schema.removeField("ehrmydva") + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706905430_updated_trails.js b/db/pb_migrations/1706905430_updated_trails.js new file mode 100644 index 00000000..a924fba6 --- /dev/null +++ b/db/pb_migrations/1706905430_updated_trails.js @@ -0,0 +1,48 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + // update + collection.schema.addField(new SchemaField({ + "system": false, + "id": "1utgul91", + "name": "author", + "type": "relation", + "required": true, + "presentable": false, + "unique": false, + "options": { + "collectionId": "_pb_users_auth_", + "cascadeDelete": true, + "minSelect": null, + "maxSelect": 1, + "displayFields": null + } + })) + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + // update + collection.schema.addField(new SchemaField({ + "system": false, + "id": "1utgul91", + "name": "author", + "type": "relation", + "required": false, + "presentable": false, + "unique": false, + "options": { + "collectionId": "_pb_users_auth_", + "cascadeDelete": false, + "minSelect": null, + "maxSelect": 1, + "displayFields": null + } + })) + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706907701_updated_trails.js b/db/pb_migrations/1706907701_updated_trails.js new file mode 100644 index 00000000..451c78cb --- /dev/null +++ b/db/pb_migrations/1706907701_updated_trails.js @@ -0,0 +1,24 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + collection.listRule = "author = @request.auth.id || public = true" + collection.viewRule = "author = @request.auth.id || public = true" + collection.createRule = "@request.auth.id != \"\" && (@request.data.author = @request.auth.id)" + collection.updateRule = "author = @request.auth.id " + collection.deleteRule = "author = @request.auth.id " + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + collection.listRule = "" + collection.viewRule = "" + collection.createRule = "" + collection.updateRule = "" + collection.deleteRule = "" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706907926_updated_waypoints.js b/db/pb_migrations/1706907926_updated_waypoints.js new file mode 100644 index 00000000..53b9b3c5 --- /dev/null +++ b/db/pb_migrations/1706907926_updated_waypoints.js @@ -0,0 +1,24 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.createRule = "@request.auth.id != \"\"" + collection.updateRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id)" + collection.deleteRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "" + collection.viewRule = "" + collection.createRule = "" + collection.updateRule = "" + collection.deleteRule = "" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706907953_updated_summit_logs.js b/db/pb_migrations/1706907953_updated_summit_logs.js new file mode 100644 index 00000000..f18b2332 --- /dev/null +++ b/db/pb_migrations/1706907953_updated_summit_logs.js @@ -0,0 +1,24 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.createRule = "@request.auth.id != \"\"" + collection.updateRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id)" + collection.deleteRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.listRule = "" + collection.viewRule = "" + collection.createRule = "" + collection.updateRule = "" + collection.deleteRule = "" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908030_updated_summit_logs.js b/db/pb_migrations/1706908030_updated_summit_logs.js new file mode 100644 index 00000000..1cb8ca1d --- /dev/null +++ b/db/pb_migrations/1706908030_updated_summit_logs.js @@ -0,0 +1,22 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.summit_logs ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.summit_logs ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.updateRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id)" + collection.deleteRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.updateRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id)" + collection.deleteRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908043_updated_waypoints.js b/db/pb_migrations/1706908043_updated_waypoints.js new file mode 100644 index 00000000..368e99a7 --- /dev/null +++ b/db/pb_migrations/1706908043_updated_waypoints.js @@ -0,0 +1,22 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.updateRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id)" + collection.deleteRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.updateRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id)" + collection.deleteRule = "@request.auth.id != \"\" && @collection.trails.waypoints = id && (@collection.trails.author = @request.auth.id)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908165_updated_waypoints.js b/db/pb_migrations/1706908165_updated_waypoints.js new file mode 100644 index 00000000..fc8af541 --- /dev/null +++ b/db/pb_migrations/1706908165_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\"" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908193_updated_waypoints.js b/db/pb_migrations/1706908193_updated_waypoints.js new file mode 100644 index 00000000..79f56578 --- /dev/null +++ b/db/pb_migrations/1706908193_updated_waypoints.js @@ -0,0 +1,18 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" " + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\"" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908206_updated_waypoints.js b/db/pb_migrations/1706908206_updated_waypoints.js new file mode 100644 index 00000000..ec9ae38b --- /dev/null +++ b/db/pb_migrations/1706908206_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" " + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908221_updated_waypoints.js b/db/pb_migrations/1706908221_updated_waypoints.js new file mode 100644 index 00000000..1087c63f --- /dev/null +++ b/db/pb_migrations/1706908221_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908229_updated_summit_logs.js b/db/pb_migrations/1706908229_updated_summit_logs.js new file mode 100644 index 00000000..fa9d3725 --- /dev/null +++ b/db/pb_migrations/1706908229_updated_summit_logs.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.viewRule = "" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.summit_logs ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908236_updated_waypoints.js b/db/pb_migrations/1706908236_updated_waypoints.js new file mode 100644 index 00000000..1dd7eb43 --- /dev/null +++ b/db/pb_migrations/1706908236_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908260_updated_summit_logs.js b/db/pb_migrations/1706908260_updated_summit_logs.js new file mode 100644 index 00000000..e255892b --- /dev/null +++ b/db/pb_migrations/1706908260_updated_summit_logs.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.listRule = "" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.summit_logs ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908281_updated_waypoints.js b/db/pb_migrations/1706908281_updated_waypoints.js new file mode 100644 index 00000000..1087c63f --- /dev/null +++ b/db/pb_migrations/1706908281_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908311_updated_waypoints.js b/db/pb_migrations/1706908311_updated_waypoints.js new file mode 100644 index 00000000..810d8d25 --- /dev/null +++ b/db/pb_migrations/1706908311_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id " + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908342_updated_waypoints.js b/db/pb_migrations/1706908342_updated_waypoints.js new file mode 100644 index 00000000..77d3a868 --- /dev/null +++ b/db/pb_migrations/1706908342_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id " + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908372_updated_waypoints.js b/db/pb_migrations/1706908372_updated_waypoints.js new file mode 100644 index 00000000..8ee07f24 --- /dev/null +++ b/db/pb_migrations/1706908372_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908432_updated_waypoints.js b/db/pb_migrations/1706908432_updated_waypoints.js new file mode 100644 index 00000000..66d85093 --- /dev/null +++ b/db/pb_migrations/1706908432_updated_waypoints.js @@ -0,0 +1,18 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "" + collection.viewRule = "" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908739_updated_trails.js b/db/pb_migrations/1706908739_updated_trails.js new file mode 100644 index 00000000..4589475f --- /dev/null +++ b/db/pb_migrations/1706908739_updated_trails.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + collection.viewRule = "" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + collection.viewRule = "author = @request.auth.id || public = true" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908748_updated_trails.js b/db/pb_migrations/1706908748_updated_trails.js new file mode 100644 index 00000000..6b2df0c0 --- /dev/null +++ b/db/pb_migrations/1706908748_updated_trails.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + collection.viewRule = "author = @request.auth.id || public = true" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("e864strfxo14pm4") + + collection.viewRule = "" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908846_updated_waypoints.js b/db/pb_migrations/1706908846_updated_waypoints.js new file mode 100644 index 00000000..1a67deb0 --- /dev/null +++ b/db/pb_migrations/1706908846_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" && (@collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true))" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908854_updated_waypoints.js b/db/pb_migrations/1706908854_updated_waypoints.js new file mode 100644 index 00000000..a3d8362a --- /dev/null +++ b/db/pb_migrations/1706908854_updated_waypoints.js @@ -0,0 +1,16 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && (@collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true))" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908926_updated_waypoints.js b/db/pb_migrations/1706908926_updated_waypoints.js new file mode 100644 index 00000000..fb599ef9 --- /dev/null +++ b/db/pb_migrations/1706908926_updated_waypoints.js @@ -0,0 +1,18 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id " + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id " + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && (@collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true))" + collection.viewRule = "@request.auth.id != \"\" && (@collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true))" + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706908971_updated_waypoints.js b/db/pb_migrations/1706908971_updated_waypoints.js new file mode 100644 index 00000000..ae2fde82 --- /dev/null +++ b/db/pb_migrations/1706908971_updated_waypoints.js @@ -0,0 +1,18 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints.id ?= id " + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints.id ?= id " + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id " + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id " + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706909005_updated_waypoints.js b/db/pb_migrations/1706909005_updated_waypoints.js new file mode 100644 index 00000000..f42f4dca --- /dev/null +++ b/db/pb_migrations/1706909005_updated_waypoints.js @@ -0,0 +1,18 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints.id ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints.id ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("goeo2ubp103rzp9") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.waypoints.id ?= id " + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.waypoints.id ?= id " + + return dao.saveCollection(collection) +}) diff --git a/db/pb_migrations/1706909055_updated_summit_logs.js b/db/pb_migrations/1706909055_updated_summit_logs.js new file mode 100644 index 00000000..230676b3 --- /dev/null +++ b/db/pb_migrations/1706909055_updated_summit_logs.js @@ -0,0 +1,22 @@ +/// +migrate((db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.listRule = "@request.auth.id != \"\" && @collection.trails.summit_logs.id ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.viewRule = "@request.auth.id != \"\" && @collection.trails.summit_logs.id ?= id && (@collection.trails.author = @request.auth.id || @collection.trails.public = true)" + collection.updateRule = "@request.auth.id != \"\" && @collection.trails.summit_logs.id ?= id && (@collection.trails.author = @request.auth.id)" + collection.deleteRule = "@request.auth.id != \"\" && @collection.trails.summit_logs.id ?= id && (@collection.trails.author = @request.auth.id)" + + return dao.saveCollection(collection) +}, (db) => { + const dao = new Dao(db) + const collection = dao.findCollectionByNameOrId("dd2l9a4vxpy2ni8") + + collection.listRule = "" + collection.viewRule = "" + collection.updateRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id)" + collection.deleteRule = "@request.auth.id != \"\" && @collection.trails.waypoints ?= id && (@collection.trails.author = @request.auth.id)" + + return dao.saveCollection(collection) +}) diff --git a/web/src/app.d.ts b/web/src/app.d.ts index a8fd724c..30bb06c3 100644 --- a/web/src/app.d.ts +++ b/web/src/app.d.ts @@ -12,6 +12,7 @@ declare global { // interface Platform {} interface Locals { pb: PocketBase + user: AuthModel | null } } } diff --git a/web/src/hooks.client.ts b/web/src/hooks.client.ts new file mode 100644 index 00000000..78ecc118 --- /dev/null +++ b/web/src/hooks.client.ts @@ -0,0 +1,8 @@ +import { pb } from '$lib/pocketbase' +import { currentUser } from '$lib/stores/user_store' + +pb.authStore.loadFromCookie(document.cookie) +pb.authStore.onChange(() => { + currentUser.set(pb.authStore.model) + document.cookie = pb.authStore.exportToCookie({ httpOnly: false }) +}, true) \ No newline at end of file diff --git a/web/src/hooks.server.ts b/web/src/hooks.server.ts index 2d3fd75a..c7ef0c5f 100644 --- a/web/src/hooks.server.ts +++ b/web/src/hooks.server.ts @@ -1,23 +1,31 @@ -import PocketBase from 'pocketbase'; +import { createInstance } from '$lib/pocketbase' +import type { Handle } from '@sveltejs/kit' -export async function handle({ event, resolve }) { - event.locals.pb = new PocketBase('http://127.0.0.1:8090'); +export const handle: Handle = async ({ event, resolve }) => { + const pb = createInstance() - // load the store data from the request cookie string - event.locals.pb.authStore.loadFromCookie(event.request.headers.get('cookie') || ''); - - try { - // get an up-to-date auth store state by verifying and refreshing the loaded auth model (if any) - event.locals.pb.authStore.isValid && await event.locals.pb.collection('users').authRefresh(); - } catch (_) { - // clear the auth store on failed refresh - event.locals.pb.authStore.clear(); + // load the store data from the request cookie string + pb.authStore.loadFromCookie(event.request.headers.get('cookie') || '') + try { + // get an up-to-date auth store state by verifying and refreshing the loaded auth model (if any) + if (pb.authStore.isValid) { + await pb.collection('users').authRefresh() } + } catch (_) { + // clear the auth store on failed refresh + pb.authStore.clear() + } - const response = await resolve(event); + event.locals.pb = pb + event.locals.user = pb.authStore.model - // send back the default 'pb_auth' cookie to the client with the latest store state - response.headers.append('set-cookie', event.locals.pb.authStore.exportToCookie()); + const response = await resolve(event) - return response; + // send back the default 'pb_auth' cookie to the client with the latest store state + response.headers.set( + 'set-cookie', + pb.authStore.exportToCookie({ httpOnly: false }) + ) + + return response } \ No newline at end of file diff --git a/web/src/lib/components/avatar.svelte b/web/src/lib/components/avatar.svelte deleted file mode 100644 index 72e9c37d..00000000 --- a/web/src/lib/components/avatar.svelte +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/src/lib/components/base/dropdown.svelte b/web/src/lib/components/base/dropdown.svelte index 5a7040ed..cafa6287 100644 --- a/web/src/lib/components/base/dropdown.svelte +++ b/web/src/lib/components/base/dropdown.svelte @@ -1,7 +1,8 @@
{#if label.length} -

+

+ {/if}
{#if icon.length > 0} @@ -19,10 +25,10 @@ {/if} 0} class:bg-red-50={error.length > 0} - type="text" + use:typeAction bind:value on:change {placeholder} diff --git a/web/src/lib/components/base/toast.svelte b/web/src/lib/components/base/toast.svelte index 84c8b030..9a8fb94a 100644 --- a/web/src/lib/components/base/toast.svelte +++ b/web/src/lib/components/base/toast.svelte @@ -1,27 +1,44 @@ {#if $toast}
- - {$toast.text} + + {$toast.text} +
{/if} + + diff --git a/web/src/lib/components/base/toggle.svelte b/web/src/lib/components/base/toggle.svelte new file mode 100644 index 00000000..193a072e --- /dev/null +++ b/web/src/lib/components/base/toggle.svelte @@ -0,0 +1,18 @@ + + + + + + {error} + diff --git a/web/src/lib/components/footer.svelte b/web/src/lib/components/footer.svelte index 578b8d9b..807c5c35 100644 --- a/web/src/lib/components/footer.svelte +++ b/web/src/lib/components/footer.svelte @@ -1,5 +1,5 @@
diff --git a/web/src/lib/components/logo_text.svelte b/web/src/lib/components/logo/logo_text.svelte similarity index 100% rename from web/src/lib/components/logo_text.svelte rename to web/src/lib/components/logo/logo_text.svelte diff --git a/web/src/lib/components/logo_text_light.svelte b/web/src/lib/components/logo/logo_text_light.svelte similarity index 100% rename from web/src/lib/components/logo_text_light.svelte rename to web/src/lib/components/logo/logo_text_light.svelte diff --git a/web/src/lib/components/logo/logo_text_two_line.svelte b/web/src/lib/components/logo/logo_text_two_line.svelte new file mode 100644 index 00000000..e26f7c26 --- /dev/null +++ b/web/src/lib/components/logo/logo_text_two_line.svelte @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/src/lib/components/nav_bar.svelte b/web/src/lib/components/nav_bar.svelte index 906f79ab..748987e4 100644 --- a/web/src/lib/components/nav_bar.svelte +++ b/web/src/lib/components/nav_bar.svelte @@ -1,18 +1,47 @@ - diff --git a/web/src/lib/components/summit_log/summit_log_modal.svelte b/web/src/lib/components/summit_log/summit_log_modal.svelte index 0ba136af..f73c4f5f 100644 --- a/web/src/lib/components/summit_log/summit_log_modal.svelte +++ b/web/src/lib/components/summit_log/summit_log_modal.svelte @@ -22,7 +22,7 @@ closeModal!(); }, }); - $: form.set(util.cloneDeep($summitLog)); + $: form.set(util.cloneDeep($summitLog)); = writable(); +export const toast: Writable = writable(); + + +export function show_toast(newToast: Toast, duration: number = 3000) { + toast.set(newToast); + + setTimeout(() => toast.set(null), duration); +} diff --git a/web/src/lib/stores/trail_store.ts b/web/src/lib/stores/trail_store.ts index 18f97f32..1b3bb95f 100644 --- a/web/src/lib/stores/trail_store.ts +++ b/web/src/lib/stores/trail_store.ts @@ -1,11 +1,12 @@ -import { pb } from "$lib/constants"; -import { Trail } from "$lib/models/trail"; -import { getFileURL } from "$lib/util/file_util"; -import { writable, type Writable } from "svelte/store"; -import { waypoints_create, waypoints_delete } from "./waypoint_store"; -import { summit_logs_create, summit_logs_delete } from "./summit_log_store"; -import type { Waypoint } from "$lib/models/waypoint"; import type { SummitLog } from "$lib/models/summit_log"; +import { Trail } from "$lib/models/trail"; +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 { summit_logs_create, summit_logs_delete, summit_logs_update } from "./summit_log_store"; +import { waypoints_create, waypoints_delete, waypoints_update } from "./waypoint_store"; export const trails: Writable = writable([]) export const trail: Writable = writable(new Trail("")); @@ -25,7 +26,7 @@ export async function trails_index() { } export async function trails_show(id: string, loadGPX?: boolean) { - const response: Trail = await pb.collection('trails').getOne(id, { expand: "category,waypoints,summit_logs" }) + const response: Trail = await pb.collection('trails').getOne(id, { expand: "category,waypoints,summit_logs" }) if (loadGPX) { const gpxData: string = await fetchGPX(response); @@ -45,6 +46,11 @@ export async function trails_show(id: string, loadGPX?: boolean) { } export async function trails_create(trail: Trail, formData: { [key: string]: any; } | FormData) { + + if (!pb.authStore.model) { + throw new Error("Unauthenticated"); + ; + } formData.set("category", trail.expand.category!.id); for (const file of trail._photoFiles) { @@ -62,6 +68,13 @@ export async function trails_create(trail: Trail, formData: { [key: string]: any const model = await summit_logs_create(summitLog); formData.append("summit_logs", model.id!); } + + if (!formData.get("public")) { + formData.set("public", 0); + } + + formData.append("author", pb.authStore.model!.id); + let model = await pb .collection("trails") .create(formData); @@ -93,6 +106,13 @@ export async function trails_update(oldTrail: Trail, newTrail: Trail, formData: formData.append("waypoints+", model.id!); } + for (const updatedWaypoint of waypointUpdates.updated) { + const model = await waypoints_update({ + ...updatedWaypoint, + marker: undefined, + }); + } + for (const deletedWaypoint of waypointUpdates.deleted) { const success = await waypoints_delete(deletedWaypoint.id!); } @@ -104,6 +124,10 @@ export async function trails_update(oldTrail: Trail, newTrail: Trail, formData: formData.append("summit_logs+", model.id!); } + for (const updatedSummitLog of summitLogUpdates.updated) { + const model = await summit_logs_update(updatedSummitLog); + } + for (const deletedSummitLog of summitLogUpdates.deleted) { const success = await summit_logs_delete(deletedSummitLog.id!); } @@ -122,6 +146,10 @@ export async function trails_update(oldTrail: Trail, newTrail: Trail, formData: formData.delete("gpx"); } + if (!formData.get("public")) { + formData.set("public", 0); + } + const thumbnailIndex = newTrail.photos.findIndex( (p) => p == newTrail.thumbnail, ); @@ -137,7 +165,7 @@ export async function trails_update(oldTrail: Trail, newTrail: Trail, formData: model = await pb .collection("trails") - .update(model.id!, { thumbnail: thumbnail }); + .update(model.id!, { thumbnail: thumbnail }, { expand: "category,waypoints,summit_logs" }); trail.set(model); @@ -145,10 +173,21 @@ export async function trails_update(oldTrail: Trail, newTrail: Trail, formData: } -export async function trails_delete(id: string) { +export async function trails_delete(trail: Trail) { + if (trail.expand.waypoints) { + for (const waypoint of trail.expand.waypoints) { + waypoints_delete(waypoint.id!); + } + } + if (trail.expand.summit_logs) { + for (const summit_log of trail.expand.summit_logs) { + summit_logs_delete(summit_log.id!); + } + } + const success = await pb .collection("trails") - .delete(id); + .delete(trail.id!); return success; } @@ -173,12 +212,22 @@ function setFileURLs(trail: Trail) { } function compareObjectArrays(oldArray: T[], newArray: T[]) { - const newObjects = newArray.filter(newObj => !oldArray.find(oldObj => oldObj.id === newObj.id)); + const newObjects = []; + const updatedObjects = []; + for (const newObj of newArray) { + const oldObj = oldArray.find(oldObj => oldObj.id === newObj.id) + if (!oldObj) { + newObjects.push(newObj); + } else if (!util.deepEqual(newObj, oldObj)) { + updatedObjects.push(newObj); + } + } const deletedObjects = oldArray.filter(oldObj => !newArray.find(newObj => newObj.id === oldObj.id)); return { added: newObjects, - deleted: deletedObjects + deleted: deletedObjects, + updated: updatedObjects }; } diff --git a/web/src/lib/stores/user_store.ts b/web/src/lib/stores/user_store.ts new file mode 100644 index 00000000..6a4cf76d --- /dev/null +++ b/web/src/lib/stores/user_store.ts @@ -0,0 +1,25 @@ +import { pb } from "$lib/pocketbase"; +import { type AuthModel } from 'pocketbase'; +import { writable, type Writable } from "svelte/store"; + +export type User = { + username?: string, + email?: string, + password: string, +} + +export const currentUser: Writable = writable() + +export async function users_create(user: User) { + const model = await pb.collection('users').create({ ...user, passwordConfirm: user.password }); + + return model; +} + +export async function login(user: User) { + const authData = await pb.collection('users').authWithPassword(user.email ?? user.username!, user.password); +} + +export async function logout() { + pb.authStore.clear(); +} \ No newline at end of file diff --git a/web/src/lib/stores/waypoint_store.ts b/web/src/lib/stores/waypoint_store.ts index 919798e4..809128d8 100644 --- a/web/src/lib/stores/waypoint_store.ts +++ b/web/src/lib/stores/waypoint_store.ts @@ -1,4 +1,4 @@ -import { pb } from "$lib/constants"; +import { pb } from "$lib/pocketbase"; import { Waypoint } from "$lib/models/waypoint"; import { writable, type Writable } from "svelte/store"; @@ -13,6 +13,14 @@ export async function waypoints_create(bodyParams?: { [key: string]: any; } | Fo return model; } +export async function waypoints_update(updatedWaypoint: Waypoint) { + const model = await pb + .collection("waypoints") + .update(updatedWaypoint.id!, updatedWaypoint); + + return model; +} + export async function waypoints_delete(id: string) { const success = await pb .collection("waypoints") diff --git a/web/src/lib/util/file_util.ts b/web/src/lib/util/file_util.ts index 18b56c7f..494370bf 100644 --- a/web/src/lib/util/file_util.ts +++ b/web/src/lib/util/file_util.ts @@ -1,4 +1,4 @@ -import { pb } from "$lib/constants"; +import { pb } from "$lib/pocketbase"; import type { FileOptions } from "pocketbase"; export function getFileURL(record: { [key: string]: any; }, filename?: string, options?: FileOptions) { diff --git a/web/src/routes/+layout.svelte b/web/src/routes/+layout.svelte index ab49ce5c..1db1e56a 100644 --- a/web/src/routes/+layout.svelte +++ b/web/src/routes/+layout.svelte @@ -1,7 +1,7 @@ + +
+ +
diff --git a/web/src/routes/register/+page.svelte b/web/src/routes/register/+page.svelte new file mode 100644 index 00000000..a387ac0c --- /dev/null +++ b/web/src/routes/register/+page.svelte @@ -0,0 +1,98 @@ + + +
+ +
diff --git a/web/src/routes/trail/edit/[id]/+page.svelte b/web/src/routes/trail/edit/[id]/+page.svelte index 5bb925e7..a79d5bcf 100644 --- a/web/src/routes/trail/edit/[id]/+page.svelte +++ b/web/src/routes/trail/edit/[id]/+page.svelte @@ -3,6 +3,7 @@ import Select from "$lib/components/base/select.svelte"; import TextField from "$lib/components/base/text_field.svelte"; import Textarea from "$lib/components/base/textarea.svelte"; + import Toggle from "$lib/components/base/toggle.svelte"; import PhotoCard from "$lib/components/photo_card.svelte"; import SummitLogCard from "$lib/components/summit_log/summit_log_card.svelte"; import SummitLogModal from "$lib/components/summit_log/summit_log_modal.svelte"; @@ -13,7 +14,7 @@ import { Waypoint } from "$lib/models/waypoint"; import { categories } from "$lib/stores/category_store"; import { summitLog } from "$lib/stores/summit_log_store"; - import { toast } from "$lib/stores/toast_store"; + import { show_toast } from "$lib/stores/toast_store"; import { trail, trails_create, @@ -84,9 +85,19 @@ await trails_update($trail, submittedTrail, formData); } - toast.set({type: "success", "icon": "check", "text": "Trail saved successfully!"}) + show_toast({ + type: "success", + icon: "check", + text: "Trail saved successfully.", + }); } catch (e) { console.error(e); + + show_toast({ + type: "error", + icon: "close", + text: "Error saving trail.", + }); } finally { loading = false; } @@ -304,6 +315,7 @@ e: CustomEvent<{ text: string; value: string }>, ) { if (e.detail.value === "edit") { + currentSummitLog.date = format(currentSummitLog.date, "yyyy-MM-dd"); summitLog.set(currentSummitLog); openSummitLogModal(); } else if (e.detail.value === "delete") { @@ -375,12 +387,15 @@ label="Describe your trail" bind:value={$form.description} > - + {#if $form.expand.category} + + {/if} +

Waypoints

    diff --git a/web/src/routes/trail/view/[id]/+page.svelte b/web/src/routes/trail/view/[id]/+page.svelte index d3d0b9e0..85004ce9 100644 --- a/web/src/routes/trail/view/[id]/+page.svelte +++ b/web/src/routes/trail/view/[id]/+page.svelte @@ -1,8 +1,14 @@
    - +
    @@ -132,6 +150,13 @@ {$trail.location}
    +
    + handleDropdownClick(e.detail)} + > +
    {formatTimeHHMM($trail.duration)}
-
- Category - {$trail.expand.category.name} -
+ {#if $trail.expand.category} +
+ Category + {$trail.expand.category.name} +
+ {/if} {#if $trail.tags && $trail.tags.length > 0}
@@ -206,9 +233,11 @@
{/if} {#if activeTab == 3} - {#each $trail.expand.summit_logs ?? [] as log} - - {/each} +
    + {#each $trail.expand.summit_logs ?? [] as log} +
  • + {/each} +
{/if}
{ - await trails_show(params.id!, true) + try { + await trails_show(params.id!, true) + }catch(e) { + + } }; \ No newline at end of file