From 0e77c50411fd498fb6cf98fbf0c1e0810f93d41e Mon Sep 17 00:00:00 2001 From: Catherine Renelle <32781029+catrenelle@users.noreply.github.com> Date: Fri, 27 Feb 2026 18:35:00 -0500 Subject: [PATCH] Add board settings modal for editing board properties and deleting boards Co-Authored-By: Claude Opus 4.6 --- src/lib/components/BoardSettingsModal.svelte | 189 +++++++++++++++++++ src/routes/boards/[boardId]/+page.server.ts | 19 +- src/routes/boards/[boardId]/+page.svelte | 36 ++++ 3 files changed, 240 insertions(+), 4 deletions(-) create mode 100644 src/lib/components/BoardSettingsModal.svelte diff --git a/src/lib/components/BoardSettingsModal.svelte b/src/lib/components/BoardSettingsModal.svelte new file mode 100644 index 0000000..4d33827 --- /dev/null +++ b/src/lib/components/BoardSettingsModal.svelte @@ -0,0 +1,189 @@ + + + + + +
+ +
diff --git a/src/routes/boards/[boardId]/+page.server.ts b/src/routes/boards/[boardId]/+page.server.ts index 2c0811e..a3699a0 100644 --- a/src/routes/boards/[boardId]/+page.server.ts +++ b/src/routes/boards/[boardId]/+page.server.ts @@ -2,18 +2,29 @@ import { error } from '@sveltejs/kit'; import type { PageServerLoad } from './$types.js'; import { withTenant } from '$lib/server/rls.js'; import { requireBoardView } from '$lib/server/guards.js'; -import { canEditBoard } from '$lib/server/permissions.js'; +import { canEditBoard, canDeleteBoard } from '$lib/server/permissions.js'; export const load: PageServerLoad = async ({ params, locals }) => { const tenant = locals.tenant; if (!tenant) throw error(400, 'Unknown tenant'); - const board = await withTenant(tenant.id, async (tx) => { - return requireBoardView(tx, locals.user, params.boardId, tenant.id); + const { board, categories } = await withTenant(tenant.id, async (tx) => { + const [board, categories] = await Promise.all([ + requireBoardView(tx, locals.user, params.boardId, tenant.id), + locals.user + ? tx.category.findMany({ + where: { tenantId: tenant.id }, + orderBy: { name: 'asc' } + }) + : [] + ]); + return { board, categories }; }); return { board, - canEdit: canEditBoard(locals.user, board.members) + categories, + canEdit: canEditBoard(locals.user, board.members), + canDelete: canDeleteBoard(locals.user, board.members) }; }; diff --git a/src/routes/boards/[boardId]/+page.svelte b/src/routes/boards/[boardId]/+page.svelte index 72aa357..c5dfa21 100644 --- a/src/routes/boards/[boardId]/+page.svelte +++ b/src/routes/boards/[boardId]/+page.svelte @@ -8,6 +8,7 @@ import { api } from '$lib/utils/api.js'; import { toast } from '$lib/stores/toasts.svelte.js'; import CardModal from '$lib/components/CardModal.svelte'; + import BoardSettingsModal from '$lib/components/BoardSettingsModal.svelte'; import ActivityFeed from '$lib/components/ActivityFeed.svelte'; import BoardFilters from '$lib/components/BoardFilters.svelte'; import BulkToolbar from '$lib/components/BulkToolbar.svelte'; @@ -34,6 +35,7 @@ let editingColumnTitle = $state(''); let viewingUsers = $state([]); let showActivity = $state(false); + let showSettings = $state(false); let showArchivedCards = $state(false); let archivedCards = $state([]); let activeFilters = $state({ labelIds: [], assigneeIds: [], due: null }); @@ -205,6 +207,9 @@ if (d.board) { data.board.title = d.board.title; data.board.visibility = d.board.visibility; + if (d.board.description !== undefined) data.board.description = d.board.description; + if (d.board.background !== undefined) data.board.background = d.board.background; + if (d.board.categoryId !== undefined) data.board.categoryId = d.board.categoryId; } } @@ -421,6 +426,23 @@ {data.board.title} +{#if showSettings} + (showSettings = false)} + onsave={(updated) => { + data.board.title = updated.title; + data.board.visibility = updated.visibility; + data.board.description = updated.description; + data.board.background = updated.background; + data.board.categoryId = updated.categoryId; + showSettings = false; + }} + /> +{/if} + {#if selectedCard} Activity + + {#if data.canEdit} + + {/if}