diff --git a/src/lib/server/db/schema.js b/src/lib/server/db/schema.js index 072208d..25fa50b 100644 --- a/src/lib/server/db/schema.js +++ b/src/lib/server/db/schema.js @@ -14,3 +14,8 @@ export const sessions = pgTable("sessions", { .references(() => users.id), expiresAt: timestamp({ withTimezone: true, mode: "date" }).notNull(), }); + +export const floors = pgTable("floors", { + floor: integer().primaryKey(), + url: text().notNull(), +}); diff --git a/src/routes/(app)/+layout.server.js b/src/routes/(app)/+layout.server.js index 8574512..f7eb8ae 100644 --- a/src/routes/(app)/+layout.server.js +++ b/src/routes/(app)/+layout.server.js @@ -1,8 +1,12 @@ +import { db } from "$lib/server/db"; +import * as table from "$lib/server/db/schema"; import { redirect } from "@sveltejs/kit"; export const load = async (event) => { if (!event.locals.user) { return redirect(302, "/login"); } - return { user: event.locals.user }; + const floors = await db.select().from(table.floors).orderBy(table.floors.floor); + + return { user: event.locals.user, floors: floors }; }; diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index 96a032d..3609836 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -3,21 +3,12 @@ import * as Sidebar from "$lib/components/ui/sidebar/index.js"; import { ChevronUp } from "lucide-svelte"; import House from "lucide-svelte/icons/house"; - import Settings from "lucide-svelte/icons/settings"; + import User from "lucide-svelte/icons/user"; import "../../app.css"; - import { sidebarItems } from "@/stores/sidebarStore.ts"; + import DropdownMenuItem from "$lib/components/ui/dropdown-menu/dropdown-menu-item.svelte"; + import { Button } from "bits-ui"; let { children, data } = $props(); - const items = [ - { - number: 1, - url: "/", - icon: House, - }, - ]; - - sidebarItems.set(items); - function getFloorName(n) { switch (n) { case 1: @@ -30,6 +21,7 @@ return n + "th floor"; } } + console.log(data.floors); @@ -39,13 +31,13 @@ Floors - {#each $sidebarItems as item (item.number)} + {#each data.floors as item (item.floor)} {#snippet child({ props })} - - {getFloorName(item.number)} + + {getFloorName(item.floor)} {/snippet} @@ -54,22 +46,6 @@ - - - - - - {#snippet child({ props })} - - - Settings - - {/snippet} - - - - - @@ -81,20 +57,24 @@ {...props} class="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground" > + {data.user.username} {/snippet} + + Settings + - Sign out + Log out - + +
diff --git a/src/routes/(app)/settings/+page.server.js b/src/routes/(app)/settings/+page.server.js new file mode 100644 index 0000000..7925138 --- /dev/null +++ b/src/routes/(app)/settings/+page.server.js @@ -0,0 +1,41 @@ +import { db } from "$lib/server/db"; +import * as table from "$lib/server/db/schema"; +import { fail } from "@sveltejs/kit"; +import { eq } from "drizzle-orm"; + +export const load = async (event) => { + const floors = await db.select().from(table.floors).orderBy(table.floors.floor); + + return { floors: floors }; +}; + +export const actions = { + newfloor: async (event) => { + const formData = await event.request.formData(); + const newFloorNumber = await formData.get("number"); + const n = Number(newFloorNumber); + if (isNaN(n)) return fail(400, { message: "Invalid number!" }); + + const exists = await db + .select({ floor: table.floors.floor }) + .from(table.floors) + .where(eq(table.floors.floor, n)) + .execute(); + console.log(n); + console.log(exists); + if (exists.length == 1) return fail(400, { message: "Floor " + n + " already exists!" }); + + await db.insert(table.floors).values({ floor: n, url: "/" }); + }, + rmfloor: async (event) => { + const formData = await event.request.formData(); + const rmFloorNumber = await formData.get("number"); + const n = Number(rmFloorNumber); + if (isNaN(n)) return fail(400, { message: "Invalid number!" }); + + const floors = await db.select().from(table.floors); + if (floors.length == 1) return fail(400, { message: "Cannot delete last floor!" }); + + await db.delete(table.floors).where(eq(table.floors.floor, n)); + }, +}; diff --git a/src/routes/(app)/settings/+page.svelte b/src/routes/(app)/settings/+page.svelte index e07e503..de7ae8d 100644 --- a/src/routes/(app)/settings/+page.svelte +++ b/src/routes/(app)/settings/+page.svelte @@ -1,23 +1,22 @@ - +
+
+ + +
+
+ + +
+
+{#if form?.message} +

{form.message}

+{/if} diff --git a/src/stores/sidebarStore.ts b/src/stores/sidebarStore.ts deleted file mode 100644 index 6bec492..0000000 --- a/src/stores/sidebarStore.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { writable } from "svelte/store" - -export const sidebarItems = writable([]);