diff --git a/actions/documents/create-folder.ts b/actions/documents/create-folder.ts index beae4091..ec16a8ff 100644 --- a/actions/documents/create-folder.ts +++ b/actions/documents/create-folder.ts @@ -35,11 +35,7 @@ export async function createFolder( if (!parentFolder) { return { success: false, - error: { - form: 'Parent folder not found or access denied', - id: '', - name: '', - }, + error: 'Parent folder not found or access denied', }; } } @@ -100,22 +96,13 @@ export async function createFolder( if (error instanceof z.ZodError) { return { success: false, - error: { - form: 'Invalid input data', - id: '', - name: '', - _errors: [], - }, + error: 'Invalid input data', }; } return { success: false, - error: { - form: 'Failed to create folder', - id: '', - name: '', - }, + error: 'Failed to create folder', }; } } diff --git a/actions/documents/delete-folder.ts b/actions/documents/delete-folder.ts index 9450655c..6286cd02 100644 --- a/actions/documents/delete-folder.ts +++ b/actions/documents/delete-folder.ts @@ -146,7 +146,6 @@ export async function deleteFolder( return { success: false, error: 'Invalid input data', - fieldErrors: error.flatten().fieldErrors, }; } diff --git a/actions/documents/move-document.ts b/actions/documents/move-document.ts index 107bd4de..a61e772d 100644 --- a/actions/documents/move-document.ts +++ b/actions/documents/move-document.ts @@ -92,7 +92,6 @@ export async function moveDocument( return { success: false, error: 'Invalid input data', - fieldErrors: error.flatten().fieldErrors, }; } diff --git a/actions/github/fetch-repository.ts b/actions/github/fetch-repository.ts index 07a9ac9a..9e83ab84 100644 --- a/actions/github/fetch-repository.ts +++ b/actions/github/fetch-repository.ts @@ -32,7 +32,7 @@ export async function fetchRepository( const validationResult = fetchRepositorySchema.safeParse(input); if (!validationResult.success) { const errorMessage = - validationResult.error.errors[0]?.message || 'Invalid input'; + validationResult.error.issues[0]?.message || 'Invalid input'; return { success: false, error: errorMessage, diff --git a/actions/github/github-actions.ts b/actions/github/github-actions.ts index 60b0d573..efbf69fd 100644 --- a/actions/github/github-actions.ts +++ b/actions/github/github-actions.ts @@ -146,7 +146,6 @@ export async function createProjectFromGitHub( additionalData?.description || repository.description || `A project from ${repository.name}`, - summary: Prisma.JsonNull, // Can be populated later with rich content shortDesc: additionalData?.shortDesc || repository.description || diff --git a/actions/projects/create-document-comment.ts b/actions/projects/create-document-comment.ts index c569df3d..6701dd72 100644 --- a/actions/projects/create-document-comment.ts +++ b/actions/projects/create-document-comment.ts @@ -81,15 +81,13 @@ export async function createDocumentComment( // Create the document comment const comment = await prisma.documentComment.create({ data: { - content: validatedInput.content as Prisma.InputJsonValue, + contentRich: validatedInput.content as Prisma.InputJsonValue, discussionId: validatedInput.discussionId, - documentId: validatedInput.documentId, - authorId: user.id, + userId: user.id, parentId: validatedInput.parentId, - documentContent: validatedInput.documentContent, }, include: { - author: { + user: { select: { id: true, name: true, @@ -130,6 +128,11 @@ export async function createDocumentComment( }; } - return handlePrismaError(error); + return { + success: false, + error: error instanceof Prisma.PrismaClientKnownRequestError + ? handlePrismaError(error) + : 'An unexpected error occurred', + }; } } diff --git a/actions/projects/create-document.ts b/actions/projects/create-document.ts index 672e3eec..9f6bdef3 100644 --- a/actions/projects/create-document.ts +++ b/actions/projects/create-document.ts @@ -3,7 +3,7 @@ import { revalidatePath } from 'next/cache'; import { Prisma } from '@prisma/client'; -import { type Value } from 'platejs'; +// import { type Value } from 'platejs'; import { z } from 'zod'; import { getCurrentUser } from '@/lib/auth/auth-utils'; @@ -88,15 +88,8 @@ export async function createDocument( }, }); - // If this is a project summary document, update the project - if (validatedInput.projectId && validatedInput.documentType === 'project_summary') { - await prisma.project.update({ - where: { id: validatedInput.projectId }, - data: { - summaryDocumentId: document.id, - }, - }); - } + // Note: Project model doesn't have a summaryDocumentId field + // The relationship is handled through the Document model's projectId field // Revalidate relevant pages if (validatedInput.projectId) { @@ -127,6 +120,11 @@ export async function createDocument( }; } - return handlePrismaError(error); + return { + success: false, + error: error instanceof Prisma.PrismaClientKnownRequestError + ? handlePrismaError(error) + : 'An unexpected error occurred', + }; } } diff --git a/actions/projects/create-project.ts b/actions/projects/create-project.ts index 1381ce0c..d79680fd 100644 --- a/actions/projects/create-project.ts +++ b/actions/projects/create-project.ts @@ -64,7 +64,6 @@ export async function createProject( data: { title: data.title, description: data.description, - summary: data.summary, shortDesc: data.shortDesc, images: formattedImages, demoUrl: data.demoUrl || null, diff --git a/actions/projects/delete-document-comment.ts b/actions/projects/delete-document-comment.ts index a8a24860..75837cd6 100644 --- a/actions/projects/delete-document-comment.ts +++ b/actions/projects/delete-document-comment.ts @@ -3,6 +3,7 @@ import { revalidatePath } from 'next/cache'; import { z } from 'zod'; +import { Prisma } from '@prisma/client'; import { getCurrentUser } from '@/lib/auth/auth-utils'; import { prisma } from '@/lib/db'; @@ -38,7 +39,7 @@ export async function deleteDocumentComment( const existingComment = await prisma.documentComment.findFirst({ where: { id: validatedInput.id, - authorId: user.id, + userId: user.id, }, }); @@ -60,7 +61,7 @@ export async function deleteDocumentComment( }); // Revalidate relevant pages - revalidatePath(`/projects/${existingComment.documentId}`); + // Note: DocumentComment doesn't have direct documentId, revalidate general pages revalidatePath('/projects'); logger.info('Document comment deleted successfully', { @@ -69,8 +70,8 @@ export async function deleteDocumentComment( resourceId: validatedInput.id, metadata: { userId: user.id, - documentType: existingComment.documentType, - documentId: existingComment.documentId, + commentId: validatedInput.id, + discussionId: existingComment.discussionId, }, }); @@ -86,6 +87,11 @@ export async function deleteDocumentComment( }; } - return handlePrismaError(error); + return { + success: false, + error: error instanceof Prisma.PrismaClientKnownRequestError + ? handlePrismaError(error) + : 'An unexpected error occurred', + }; } } diff --git a/app/(dashboard)/docs/[docId]/loading.tsx b/app/(dashboard)/docs/[docId]/loading.tsx index 645f9652..04ceb050 100644 --- a/app/(dashboard)/docs/[docId]/loading.tsx +++ b/app/(dashboard)/docs/[docId]/loading.tsx @@ -1,10 +1,10 @@ +import { VerticalToolbarSkeleton } from '@/components/skeleton/vertical-toolbar-skeletob'; import { ResizablePanelGroup, ResizablePanel, ResizableHandle, } from '@/components/ui/resizable'; import { Skeleton } from '@/components/ui/skeleton'; -import { VerticalToolbarSkeleton } from '@/components/skeleton/vertical-toolbar-skeletob'; const SIDE_PANEL_DEFAULT_SIZE = 15; const MAIN_PANEL_DEFAULT_SIZE = 100 - SIDE_PANEL_DEFAULT_SIZE; diff --git a/app/(dashboard)/docs/page.tsx b/app/(dashboard)/docs/page.tsx index 825dc505..371f02a6 100644 --- a/app/(dashboard)/docs/page.tsx +++ b/app/(dashboard)/docs/page.tsx @@ -2,6 +2,7 @@ import { Suspense } from 'react'; import { DocumentList } from '@/components/documents/document-list'; import { FolderNavigation } from '@/components/documents/folder-navigation'; +import { VerticalToolbarSkeleton } from '@/components/skeleton/vertical-toolbar-skeletob'; import { ResizablePanelGroup, ResizablePanel, @@ -12,7 +13,6 @@ import { getFolderTreeWithDocuments, } from '@/data/documents/get-folders'; import { requireServerAuth } from '@/lib/auth/auth-server'; -import { VerticalToolbarSkeleton } from '@/components/skeleton/vertical-toolbar-skeletob'; interface DocumentsPageProps { searchParams: Promise<{ diff --git a/app/(dashboard)/projects/[id]/edit/page.tsx b/app/(dashboard)/projects/[id]/edit/page.tsx index c9211954..51b33492 100644 --- a/app/(dashboard)/projects/[id]/edit/page.tsx +++ b/app/(dashboard)/projects/[id]/edit/page.tsx @@ -11,9 +11,9 @@ import { updateProjectSummary } from '../../../../../actions/projects/update-pro interface ProjectPageProps { - params: { + params: Promise<{ id: string; - }; + }>; } export default async function ProjectEditPage({ params }: ProjectPageProps) { diff --git a/app/auth/error/page.tsx b/app/auth/error/page.tsx index 002a3010..dc0ea512 100644 --- a/app/auth/error/page.tsx +++ b/app/auth/error/page.tsx @@ -1,8 +1,8 @@ import { AlertTriangle } from 'lucide-react'; import Link from 'next/link'; -import { Alert, AlertDescription } from '@/components/ui/alert'; import { CodacLogo } from '@/components/codac-brand/codac-logo'; +import { Alert, AlertDescription } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import { Card, diff --git a/app/auth/verify-request/page.tsx b/app/auth/verify-request/page.tsx index 0d8d8a7c..4f9a6824 100644 --- a/app/auth/verify-request/page.tsx +++ b/app/auth/verify-request/page.tsx @@ -1,8 +1,8 @@ import { Mail } from 'lucide-react'; import Link from 'next/link'; -import { Button } from '@/components/ui/button'; import { CodacLogo } from '@/components/codac-brand/codac-logo'; +import { Button } from '@/components/ui/button'; import { Card, CardContent, diff --git a/components/auth/signin-form.tsx b/components/auth/signin-form.tsx index 8c9a3361..2f567d0a 100644 --- a/components/auth/signin-form.tsx +++ b/components/auth/signin-form.tsx @@ -4,9 +4,9 @@ import { useRouter, useSearchParams } from "next/navigation" import { signIn, useSession } from "next-auth/react" import { useState, useEffect } from "react" +import { CodacLogo } from "@/components/codac-brand/codac-logo" import { Alert, AlertDescription } from "@/components/ui/alert" import { Button } from "@/components/ui/button" -import { CodacLogo } from "@/components/codac-brand/codac-logo" import { Icons } from "@/components/ui/icons" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" diff --git a/components/auth/signup-form.tsx b/components/auth/signup-form.tsx index 45d28ec5..80dd27f5 100644 --- a/components/auth/signup-form.tsx +++ b/components/auth/signup-form.tsx @@ -4,9 +4,9 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; import { oAuthSignIn } from "@/actions/auth/oauth-signin"; +import { CodacLogo } from "@/components/codac-brand/codac-logo"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Button } from "@/components/ui/button"; -import { CodacLogo } from "@/components/codac-brand/codac-logo"; import { Card, CardContent, diff --git a/components/documents/folder-navigation.tsx b/components/documents/folder-navigation.tsx index 24f05280..d7dff58f 100644 --- a/components/documents/folder-navigation.tsx +++ b/components/documents/folder-navigation.tsx @@ -44,6 +44,7 @@ import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import type { FolderTreeItem } from '@/data/documents/get-folders'; import { cn } from '@/lib/utils'; + import { VerticalToolbarSkeleton } from '../skeleton/vertical-toolbar-skeletob'; interface FolderNavigationProps { diff --git a/components/editor/project-summary-editor.tsx b/components/editor/project-summary-editor.tsx new file mode 100644 index 00000000..ceaa1fcf --- /dev/null +++ b/components/editor/project-summary-editor.tsx @@ -0,0 +1,55 @@ +'use client'; + +import React from 'react'; +import { Card, CardContent } from '@/components/ui/card'; + +interface ProjectSummaryEditorProps { + projectId: string; + initialValue?: string; + onContentChange?: (content: string) => void; + canEdit?: boolean; + showStatusBar?: boolean; +} + +export function ProjectSummaryEditor({ + projectId, + initialValue = '', + onContentChange, + canEdit = true, + showStatusBar = false, +}: ProjectSummaryEditorProps) { + const [content, setContent] = React.useState(initialValue); + + const handleChange = (e: React.ChangeEvent) => { + const newContent = e.target.value; + setContent(newContent); + onContentChange?.(newContent); + }; + + return ( + + +
+
+ +