Private
Public Access
1
0

Phase 4: Rich card features — labels, checklists, comments, attachments, categories

Add full CRUD + UI for all card sub-resources (tags/labels, assignees, checklists
with items, comments with markdown, file attachments). Restructure CardModal into
a two-column layout with lazy-loaded data. Upgrade card thumbnails with named label
pills, urgency-colored due date badges, checklist progress indicators, and SVG icons.
Add board categories with filtering on the listing page. Include markdown rendering
with DOMPurify sanitization and .prose CSS styles.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Catherine Renelle
2026-02-25 23:38:31 -05:00
parent 9b5708af64
commit 095d9756a8
33 changed files with 2226 additions and 143 deletions
+23 -12
View File
@@ -3,9 +3,9 @@ import { withTenant } from '$lib/server/rls.js';
export const load: PageServerLoad = async ({ locals }) => {
const tenant = locals.tenant;
if (!tenant) return { boards: [] };
if (!tenant) return { boards: [], categories: [] };
const boards = await withTenant(tenant.id, async (tx) => {
const result = await withTenant(tenant.id, async (tx) => {
const where: any = { tenantId: tenant.id, archived: false };
if (!locals.user) {
@@ -17,17 +17,28 @@ export const load: PageServerLoad = async ({ locals }) => {
];
}
return tx.board.findMany({
where,
include: {
members: {
include: { user: { select: { id: true, name: true, avatarUrl: true } } }
const [boards, categories] = await Promise.all([
tx.board.findMany({
where,
include: {
members: {
include: { user: { select: { id: true, name: true, avatarUrl: true } } }
},
category: true,
_count: { select: { columns: true } }
},
_count: { select: { columns: true } }
},
orderBy: { updatedAt: 'desc' }
});
orderBy: { updatedAt: 'desc' }
}),
locals.user
? tx.category.findMany({
where: { tenantId: tenant.id },
orderBy: { name: 'asc' }
})
: []
]);
return { boards, categories };
});
return { boards };
return result;
};