Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
145 commits
Select commit Hold shift + click to select a range
214d2ca
Add deep URL linking support for projects, documents, and tasks
manageeverything Sep 1, 2025
6a6b661
Add task selection logic for deep URL linking
manageeverything Sep 1, 2025
49f60be
Revert "Add task selection logic for deep URL linking"
manageeverything Sep 1, 2025
0c0a8f8
Optimize project loading performance for deep URL navigation
manageeverything Sep 2, 2025
0ee683d
refactor: edit document_service.py at 20250902143707
manageeverything Sep 2, 2025
24ed3ca
refactor: edit document_service.py at 20250902143716
manageeverything Sep 2, 2025
f2c7a7e
refactor: edit document_service.py at 20250902143725
manageeverything Sep 2, 2025
033ce83
refactor: edit DocsTab.tsx at 20250902144559
manageeverything Sep 2, 2025
cc4f85e
docs: edit CLAUDE.md at 20250902145006
manageeverything Sep 2, 2025
e8a74f7
refactor: edit projectService.ts at 20250902145045
manageeverything Sep 2, 2025
2386a38
refactor: edit DocsTab.tsx at 20250902145102
manageeverything Sep 2, 2025
06eb5ca
refactor: edit DocsTab.tsx at 20250902145114
manageeverything Sep 2, 2025
e99fd79
refactor: edit DocsTab.tsx at 20250902145125
manageeverything Sep 2, 2025
4fa9103
refactor: edit projectService.ts at 20250902145309
manageeverything Sep 2, 2025
0ffd721
refactor: edit DocsTab.tsx at 20250902145529
manageeverything Sep 2, 2025
91613b3
refactor: edit DocsTab.tsx at 20250902145736
manageeverything Sep 2, 2025
028456e
refactor: edit DocsTab.tsx at 20250902145746
manageeverything Sep 2, 2025
4b076b5
refactor: edit DocsTab.tsx at 20250902145927
manageeverything Sep 2, 2025
953b824
refactor: edit ProjectPage.tsx at 20250902150148
manageeverything Sep 2, 2025
f873bf1
refactor: edit ProjectPage.tsx at 20250902150203
manageeverything Sep 2, 2025
7690012
refactor: edit ProjectPage.tsx at 20250902150421
manageeverything Sep 2, 2025
4b95542
refactor: edit ProjectPage.tsx at 20250902150632
manageeverything Sep 2, 2025
1ae0f16
refactor: edit socketIOService.ts at 20250902151042
manageeverything Sep 2, 2025
a5da663
refactor: edit api.ts at 20250902151741
manageeverything Sep 2, 2025
c928c22
docs: write CHANGES.md at 20250902151950
manageeverything Sep 2, 2025
d55d6a8
refactor: edit SimpleMarkdown.tsx at 20250903084003
manageeverything Sep 3, 2025
a0368ad
refactor: edit SimpleMarkdown.tsx at 20250903084032
manageeverything Sep 3, 2025
3950624
refactor: edit SimpleMarkdown.tsx at 20250903084044
manageeverything Sep 3, 2025
a2e5b19
refactor: edit SimpleMarkdown.tsx at 20250903084056
manageeverything Sep 3, 2025
680edcd
refactor: edit SimpleMarkdown.tsx at 20250903084111
manageeverything Sep 3, 2025
3d859fc
refactor: edit SimpleMarkdown.tsx at 20250903084128
manageeverything Sep 3, 2025
83f1498
refactor: edit SimpleMarkdown.tsx at 20250903084140
manageeverything Sep 3, 2025
ccdc91e
refactor: edit SimpleMarkdown.tsx at 20250903084153
manageeverything Sep 3, 2025
881bb43
refactor: edit ProjectPage.tsx at 20250903084907
manageeverything Sep 3, 2025
df127c6
refactor: edit ProjectPage.tsx at 20250903085257
manageeverything Sep 3, 2025
6934b20
refactor: edit ProjectPage.tsx at 20250903085410
manageeverything Sep 3, 2025
245e1f1
refactor: edit ProjectPage.tsx at 20250903085604
manageeverything Sep 3, 2025
c627477
refactor: edit ProjectPage.tsx at 20250903085710
manageeverything Sep 3, 2025
7145797
refactor: edit ProjectPage.tsx at 20250903085738
manageeverything Sep 3, 2025
a4f1a02
refactor: edit ProjectPage.tsx at 20250903090131
manageeverything Sep 3, 2025
9d20451
refactor: edit ProjectPage.tsx at 20250903090159
manageeverything Sep 3, 2025
8b69f47
refactor: edit ProjectPage.tsx at 20250903090242
manageeverything Sep 3, 2025
72f7658
refactor: edit ProjectPage.tsx at 20250903091252
manageeverything Sep 3, 2025
cfe12fc
refactor: edit DocsTab.tsx at 20250903091259
manageeverything Sep 3, 2025
1924f56
refactor: edit ProjectPage.tsx at 20250903091450
manageeverything Sep 3, 2025
2427ca0
refactor: edit DocsTab.tsx at 20250903091458
manageeverything Sep 3, 2025
fd31b34
refactor: edit ProjectPage.tsx at 20250903091509
manageeverything Sep 3, 2025
f1f8ddb
refactor: edit DocsTab.tsx at 20250903091519
manageeverything Sep 3, 2025
4fbb80a
refactor: edit ProjectPage.tsx at 20250903091717
manageeverything Sep 3, 2025
9a8ddfc
refactor: edit ProjectPage.tsx at 20250903091738
manageeverything Sep 3, 2025
31a3ed0
refactor: edit ProjectPage.tsx at 20250903091754
manageeverything Sep 3, 2025
c8e024c
refactor: edit index.css at 20250903091829
manageeverything Sep 3, 2025
313163f
refactor: edit ProjectPage.tsx at 20250903091933
manageeverything Sep 3, 2025
7597c4c
refactor: edit index.css at 20250903091946
manageeverything Sep 3, 2025
2fff3a0
refactor: edit index.css at 20250903092020
manageeverything Sep 3, 2025
e3d8c6e
refactor: edit ProjectPage.tsx at 20250903092028
manageeverything Sep 3, 2025
3f03b27
refactor: edit index.css at 20250903092038
manageeverything Sep 3, 2025
ac6964b
refactor: edit index.css at 20250903092047
manageeverything Sep 3, 2025
7b52189
refactor: edit DocsTab.tsx at 20250903092339
manageeverything Sep 3, 2025
330c72a
refactor: edit serverHealthService.ts at 20250903093919
manageeverything Sep 3, 2025
2416376
refactor: edit TaskTableView.tsx at 20250903094707
manageeverything Sep 3, 2025
4869e3b
refactor: edit TaskTableView.tsx at 20250903094729
manageeverything Sep 3, 2025
4f9d883
refactor: edit TaskTableView.tsx at 20250903094756
manageeverything Sep 3, 2025
2c8eeb0
refactor: edit TaskTableView.tsx at 20250903094810
manageeverything Sep 3, 2025
a31d7f4
refactor: edit TaskTableView.tsx at 20250903094837
manageeverything Sep 3, 2025
2c5b287
refactor: edit TaskTableView.tsx at 20250903094853
manageeverything Sep 3, 2025
9f17b7e
refactor: edit TaskBoardView.tsx at 20250903094913
manageeverything Sep 3, 2025
f5553a0
refactor: edit TaskBoardView.tsx at 20250903094930
manageeverything Sep 3, 2025
e456c21
refactor: edit TaskBoardView.tsx at 20250903094953
manageeverything Sep 3, 2025
5614f7a
refactor: edit TaskBoardView.tsx at 20250903095018
manageeverything Sep 3, 2025
5c9c30c
refactor: multiedit TaskBoardView.tsx at 20250903095059
manageeverything Sep 3, 2025
c08f517
refactor: edit DraggableTaskCard.tsx at 20250903095140
manageeverything Sep 3, 2025
c74647d
refactor: edit DraggableTaskCard.tsx at 20250903095157
manageeverything Sep 3, 2025
cd09e34
refactor: edit DraggableTaskCard.tsx at 20250903095302
manageeverything Sep 3, 2025
3287fa8
refactor: edit DraggableTaskCard.tsx at 20250903095313
manageeverything Sep 3, 2025
cd095c3
refactor: edit DraggableTaskCard.tsx at 20250903095322
manageeverything Sep 3, 2025
9c295f7
refactor: edit TaskBoardView.tsx at 20250903095334
manageeverything Sep 3, 2025
537e4e5
refactor: edit TasksTab.tsx at 20250903095414
manageeverything Sep 3, 2025
c88030b
refactor: edit TasksTab.tsx at 20250903095428
manageeverything Sep 3, 2025
16104e5
refactor: edit TasksTab.tsx at 20250903095527
manageeverything Sep 3, 2025
e346355
refactor: edit TasksTab.tsx at 20250903095544
manageeverything Sep 3, 2025
c44aa1d
docs: write PR_DEEP_URL_LINKING_FIXES.md at 20250903095736
manageeverything Sep 3, 2025
643c5d0
docs: write PR_DEEP_URL_LINKING_FIXES.md at 20250903101535
manageeverything Sep 3, 2025
6230180
docs: edit PR_DEEP_URL_LINKING_FIXES.md at 20250903102031
manageeverything Sep 3, 2025
6fb7fae
refactor: multiedit TasksTab.tsx at 20250903112459
manageeverything Sep 3, 2025
a58ad78
refactor: multiedit ProjectPage.tsx at 20250903112558
manageeverything Sep 3, 2025
e2ff8d8
refactor: edit ProjectPage.tsx at 20250903112623
manageeverything Sep 3, 2025
850ef36
refactor: multiedit TaskTableView.tsx at 20250903112833
manageeverything Sep 3, 2025
b432015
refactor: edit TaskTableView.tsx at 20250903113556
manageeverything Sep 3, 2025
178fe86
refactor: edit TaskTableView.tsx at 20250903113623
manageeverything Sep 3, 2025
523ae53
refactor: multiedit TaskTableView.tsx at 20250903113751
manageeverything Sep 3, 2025
44ebfab
refactor: edit TaskTableView.tsx at 20250903121808
manageeverything Sep 3, 2025
c3e141e
refactor: edit TaskTableView.tsx at 20250903121857
manageeverything Sep 3, 2025
4485ceb
refactor: edit DraggableTaskCard.tsx at 20250903122035
manageeverything Sep 3, 2025
93cfb41
refactor: edit TaskBoardView.tsx at 20250903122146
manageeverything Sep 3, 2025
0787925
refactor: edit TaskBoardView.tsx at 20250903122203
manageeverything Sep 3, 2025
facda33
refactor: edit TaskTableView.tsx at 20250903122258
manageeverything Sep 3, 2025
72df13d
refactor: edit TaskTableView.tsx at 20250903122746
manageeverything Sep 3, 2025
b0dd3d2
refactor: edit TaskTableView.tsx at 20250903123744
manageeverything Sep 3, 2025
2c37c88
refactor: edit index.css at 20250903124140
manageeverything Sep 3, 2025
ff683b0
refactor: edit TaskTableView.tsx at 20250903124204
manageeverything Sep 3, 2025
5f35440
refactor: edit TaskBoardView.tsx at 20250903124233
manageeverything Sep 3, 2025
531c43c
refactor: multiedit TaskTableView.tsx at 20250903124729
manageeverything Sep 3, 2025
cf15ba6
refactor: multiedit TaskTableView.tsx at 20250903124918
manageeverything Sep 3, 2025
9983f11
refactor: multiedit TaskBoardView.tsx at 20250903124952
manageeverything Sep 3, 2025
23af30d
feat: write platformDetection.ts at 20250903130749
manageeverything Sep 3, 2025
56aa4ed
feat: write copyHelpers.ts at 20250903130845
manageeverything Sep 3, 2025
c3ae1c7
refactor: edit copyHelpers.ts at 20250903130857
manageeverything Sep 3, 2025
5e3120a
refactor: edit ProjectPage.tsx at 20250903130957
manageeverything Sep 3, 2025
532199d
refactor: edit ProjectPage.tsx at 20250903131017
manageeverything Sep 3, 2025
3529e24
refactor: edit ProjectPage.tsx at 20250903131202
manageeverything Sep 3, 2025
bfe963f
refactor: edit copyHelpers.ts at 20250903143203
manageeverything Sep 3, 2025
d72e91e
refactor: edit copyHelpers.ts at 20250903153549
manageeverything Sep 3, 2025
494b43a
refactor: edit copyHelpers.ts at 20250903153634
manageeverything Sep 3, 2025
622e4d1
refactor: edit ProjectPage.tsx at 20250903155046
manageeverything Sep 3, 2025
ea4f67e
refactor: edit ProjectPage.tsx at 20250903155703
manageeverything Sep 3, 2025
a5f91bf
refactor: edit TaskTableView.tsx at 20250903160040
manageeverything Sep 3, 2025
276f1ce
refactor: edit TaskTableView.tsx at 20250903160134
manageeverything Sep 3, 2025
e8e0fa4
refactor: edit TaskTableView.tsx at 20250903160208
manageeverything Sep 3, 2025
dd45f78
refactor: edit TaskTableView.tsx at 20250903160343
manageeverything Sep 3, 2025
0e1176b
refactor: edit TasksTab.tsx at 20250903160530
manageeverything Sep 3, 2025
b03be60
refactor: edit DraggableTaskCard.tsx at 20250903160642
manageeverything Sep 3, 2025
75b9dfe
refactor: edit DraggableTaskCard.tsx at 20250903160719
manageeverything Sep 3, 2025
600546b
refactor: edit DraggableTaskCard.tsx at 20250903160752
manageeverything Sep 3, 2025
9097e0f
refactor: edit DraggableTaskCard.tsx at 20250903160917
manageeverything Sep 3, 2025
17b98e0
refactor: edit TaskBoardView.tsx at 20250903161041
manageeverything Sep 3, 2025
8f1daf2
refactor: edit TaskBoardView.tsx at 20250903161121
manageeverything Sep 3, 2025
d041eff
refactor: edit TaskBoardView.tsx at 20250903161153
manageeverything Sep 3, 2025
d2a723a
refactor: edit TasksTab.tsx at 20250903161227
manageeverything Sep 3, 2025
18bc07a
refactor: edit DocumentCard.tsx at 20250903161412
manageeverything Sep 3, 2025
5ecb497
refactor: edit DocumentCard.tsx at 20250903161641
manageeverything Sep 3, 2025
020e2e8
refactor: edit DocumentCard.tsx at 20250903161718
manageeverything Sep 3, 2025
b429d05
refactor: edit DocumentCard.tsx at 20250903161823
manageeverything Sep 3, 2025
8905549
refactor: edit DocumentCard.tsx at 20250903161917
manageeverything Sep 3, 2025
65275be
refactor: edit DocsTab.tsx at 20250903162003
manageeverything Sep 3, 2025
31d0cf5
refactor: edit TaskBoardView.tsx at 20250903163139
manageeverything Sep 3, 2025
fd16e7c
refactor: edit TaskBoardView.tsx at 20250903163152
manageeverything Sep 3, 2025
39c0d46
refactor: edit TaskBoardView.tsx at 20250903163203
manageeverything Sep 3, 2025
f95bdaa
refactor: edit TaskBoardView.tsx at 20250903163212
manageeverything Sep 3, 2025
5116c19
refactor: edit TaskBoardView.tsx at 20250903163218
manageeverything Sep 3, 2025
5e936d3
refactor: edit TaskBoardView.tsx at 20250903163227
manageeverything Sep 3, 2025
51bedb3
refactor: edit DraggableTaskCard.tsx at 20250903163459
manageeverything Sep 3, 2025
1fe223b
refactor: edit DocumentCard.tsx at 20250903163521
manageeverything Sep 3, 2025
781fe6b
refactor: edit ProjectPage.tsx at 20250903164117
manageeverything Sep 3, 2025
ec47c64
refactor: edit DocumentCard.tsx at 20250903172404
manageeverything Sep 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
__pycache__
.env
.serena
.claude/settings.local.json
PRPs/local
PRPs/completed/
/logs/
.DS_Store
*.log


# Claude
.claude/
claude.local.md
.mcp.json
.next-session.md
8 changes: 8 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,14 @@ uv run pytest tests/test_service_integration.py -v
- `GET /api/projects/{id}/tasks` - Get project tasks
- `POST /api/projects/{id}/tasks` - Create task

### Documents

- `GET /api/projects/{id}/docs` - List project documents (light mode)
- `POST /api/projects/{id}/docs` - Create document (returns full document with created_at/updated_at timestamps)
- `GET /api/projects/{id}/docs/{doc_id}` - Get specific document (full mode with complete content)
- `PUT /api/projects/{id}/docs/{doc_id}` - Update document
- `DELETE /api/projects/{id}/docs/{doc_id}` - Delete document

## Socket.IO Events

Real-time updates via Socket.IO on port 8181:
Expand Down
20 changes: 15 additions & 5 deletions archon-ui-main/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,19 @@ const AppRoutes = () => {
<Route path="/settings" element={<SettingsPage />} />
<Route path="/mcp" element={<MCPPage />} />
{projectsEnabled ? (
<Route path="/projects" element={<ProjectPage />} />
<>
<Route path="/projects" element={<ProjectPage />} />
<Route path="/projects/:projectId" element={<ProjectPage />} />
<Route path="/projects/:projectId/docs" element={<ProjectPage />} />
<Route path="/projects/:projectId/docs/:documentId" element={<ProjectPage />} />
<Route path="/projects/:projectId/tasks" element={<ProjectPage />} />
<Route path="/projects/:projectId/tasks/:taskId" element={<ProjectPage />} />
</>
) : (
<Route path="/projects" element={<Navigate to="/" replace />} />
<>
<Route path="/projects" element={<Navigate to="/" replace />} />
<Route path="/projects/*" element={<Navigate to="/" replace />} />
</>
)}
</Routes>
);
Expand Down Expand Up @@ -59,17 +69,17 @@ const AppContent = () => {
}
},
onReconnected: () => {
console.log('🏥 [Health] onReconnected called - clearing disconnect screen');
setDisconnectScreenActive(false);
setDisconnectScreenDismissed(false);
// Refresh the page to ensure all data is fresh
window.location.reload();
// Don't auto-reload - let the user stay on the current page
}
});

return () => {
serverHealthService.stopMonitoring();
};
}, [disconnectScreenDismissed]);
}, []); // Only run once on mount, not when disconnectScreenDismissed changes

const handleDismissDisconnectScreen = () => {
setDisconnectScreenActive(false);
Expand Down
179 changes: 135 additions & 44 deletions archon-ui-main/src/components/project-tasks/DocsTab.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { useState, useEffect } from 'react';
import { Plus, X, Search, Upload, Link as LinkIcon, Check, Brain, Save, History, Eye, Edit3, Sparkles } from 'lucide-react';
import React, { useState, useEffect, useCallback } from 'react';
import { Plus, X, Search, Upload, Link as LinkIcon, Check, Brain, Save, History, Eye, Edit3, Sparkles, Loader2 } from 'lucide-react';
import { Button } from '../ui/Button';
import { knowledgeBaseService, KnowledgeItem } from '../../services/knowledgeBaseService';
import { projectService } from '../../services/projectService';
Expand Down Expand Up @@ -501,7 +501,9 @@ Add your content here...
/* ——————————————————————————————————————————— */
export const DocsTab = ({
tasks,
project
project,
selectedDocumentId,
onDocumentSelect
}: {
tasks: Task[];
project?: {
Expand All @@ -510,6 +512,8 @@ export const DocsTab = ({
created_at?: string;
updated_at?: string;
} | null;
selectedDocumentId?: string;
onDocumentSelect?: (documentId: string) => void;
}) => {
// Document state
const [documents, setDocuments] = useState<ProjectDoc[]>([]);
Expand Down Expand Up @@ -558,31 +562,35 @@ export const DocsTab = ({
const [progressItems, setProgressItems] = useState<CrawlProgressData[]>([]);
const { showToast } = useToast();

// Load project documents from the project data
// Load project documents using light mode for performance
const loadProjectDocuments = async () => {
if (!project?.id || !project.docs) return;
if (!project?.id) return;

try {
setLoading(true);

// Use the docs directly from the project data
const projectDocuments: ProjectDoc[] = project.docs.map((doc: any) => ({
// Use light mode to get document metadata only (for document cards)
const documentsResponse = await projectService.listDocuments(project.id, false);

if (!documentsResponse || documentsResponse.length === 0) {
setDocuments([]);
setLoading(false);
return;
}

// Map to ProjectDoc format for document cards
const projectDocuments: ProjectDoc[] = documentsResponse.map((doc: any) => ({
id: doc.id,
title: doc.title || 'Untitled Document',
created_at: doc.created_at,
updated_at: doc.updated_at,
content: doc.content,
content: doc.content || {}, // May be empty in light mode
document_type: doc.document_type || 'document'
}));

setDocuments(projectDocuments);

// Auto-select first document if available and no document is currently selected
if (projectDocuments.length > 0 && !selectedDocument) {
setSelectedDocument(projectDocuments[0]);
}

console.log(`Loaded ${projectDocuments.length} documents from project data`);
console.log(`Loaded ${projectDocuments.length} documents in light mode`);
} catch (error) {
console.error('Failed to load documents:', error);
showToast('Failed to load documents', 'error');
Expand All @@ -591,6 +599,40 @@ export const DocsTab = ({
}
};

// Load full document content when selecting a specific document
const loadFullDocument = async (docId: string) => {
if (!project?.id || !docId) return;

// Check if document already has content loaded
const existingDoc = documents.find(d => d.id === docId);
if (existingDoc && existingDoc.content && Object.keys(existingDoc.content).length > 0) {
console.log(`Document ${existingDoc.title} already has content loaded - skipping API call`);
setSelectedDocument(existingDoc);
return;
}

try {
console.log(`Loading full content for document: ${docId}`);
const fullDoc = await projectService.getDocument(project.id, docId);

// Update the documents array with the full content
setDocuments(prev => prev.map(doc =>
doc.id === docId ? { ...doc, content: fullDoc.content || {} } : doc
));

// Set as selected document with full content
const enrichedDoc = documents.find(d => d.id === docId);
if (enrichedDoc) {
setSelectedDocument({ ...enrichedDoc, content: fullDoc.content || {} });
}

console.log(`✅ Loaded full content for document: ${fullDoc.title}`);
} catch (error) {
console.error('Failed to load full document:', error);
showToast('Failed to load document content', 'error');
}
};

// Create new document from template
const createDocumentFromTemplate = async (templateKey: string) => {
if (!project?.id) return;
Expand Down Expand Up @@ -713,6 +755,27 @@ export const DocsTab = ({
setSelectedDocument(null);
}, [project?.id]);

// Handle selectedDocumentId from URL - load full content for deep linking
useEffect(() => {
if (selectedDocumentId && documents.length > 0) {
const targetDoc = documents.find(doc => doc.id === selectedDocumentId);
if (targetDoc && targetDoc !== selectedDocument) {
console.log(`🔗 URL specified document: ${targetDoc.title} - loading full content`);
loadFullDocument(selectedDocumentId);
setIsEditing(false);
}
}
}, [selectedDocumentId, documents, selectedDocument]);

// Handle document selection with URL callback - load full content
const handleDocumentSelect = useCallback((document: ProjectDoc) => {
// Load full document content when selected
loadFullDocument(document.id);
if (onDocumentSelect) {
onDocumentSelect(document.id);
}
}, [onDocumentSelect]);

// Existing knowledge loading function
const loadKnowledgeItems = async (knowledgeType?: 'technical' | 'business') => {
try {
Expand Down Expand Up @@ -935,35 +998,59 @@ export const DocsTab = ({

{/* Document Cards Container */}
<div className="relative mb-6">
<div className="flex gap-3 overflow-x-auto pb-2 scrollbar-thin scrollbar-thumb-gray-300 dark:scrollbar-thumb-gray-700">
{documents.map(doc => (
<DocumentCard
key={doc.id}
document={doc}
isActive={selectedDocument?.id === doc.id}
onSelect={setSelectedDocument}
onDelete={async (docId) => {
try {
// Call API to delete from database first
await projectService.deleteDocument(project.id, docId);

// Then remove from local state
setDocuments(prev => prev.filter(d => d.id !== docId));
if (selectedDocument?.id === docId) {
setSelectedDocument(documents.find(d => d.id !== docId) || null);
}
showToast('Document deleted', 'success');
} catch (error) {
console.error('Failed to delete document:', error);
showToast('Failed to delete document', 'error');
}
}}
isDarkMode={isDarkMode}
/>
))}

{/* Add New Document Card */}
<NewDocumentCard onClick={() => setShowTemplateModal(true)} />
<div className="flex gap-3 overflow-x-auto pb-2 force-scrollbar">
{loading ? (
// Single loading card following the same pattern as projects
<>
<div className="flex-shrink-0 w-48 p-4 rounded-lg border border-gray-200/50 dark:border-zinc-800/30 bg-gradient-to-b from-white/60 to-white/40 dark:from-white/5 dark:to-black/20 shadow-[0_10px_30px_-15px_rgba(0,0,0,0.1)] dark:shadow-[0_10px_30px_-15px_rgba(0,0,0,0.5)]">
<div className="flex items-center justify-center mb-4">
<Loader2 className="w-4 h-4 text-blue-500 animate-spin mr-2" />
<span className="text-xs font-medium text-gray-600 dark:text-gray-400">
Loading documents...
</span>
</div>
<div className="space-y-2">
{/* Skeleton placeholders */}
<div className="h-3 bg-gray-200/50 dark:bg-gray-700/30 rounded animate-pulse"></div>
<div className="h-3 bg-gray-200/50 dark:bg-gray-700/30 rounded animate-pulse w-3/4"></div>
<div className="h-6 bg-gray-200/50 dark:bg-gray-700/30 rounded animate-pulse"></div>
</div>
</div>
<NewDocumentCard onClick={() => setShowTemplateModal(true)} />
</>
) : (
<>
{documents.map(doc => (
<DocumentCard
key={doc.id}
document={doc}
isActive={selectedDocument?.id === doc.id}
onSelect={handleDocumentSelect}
onDelete={async (docId) => {
try {
// Call API to delete from database first
await projectService.deleteDocument(project.id, docId);

// Then remove from local state
setDocuments(prev => prev.filter(d => d.id !== docId));
if (selectedDocument?.id === docId) {
setSelectedDocument(documents.find(d => d.id !== docId) || null);
}
showToast('Document deleted', 'success');
} catch (error) {
console.error('Failed to delete document:', error);
showToast('Failed to delete document', 'error');
}
}}
isDarkMode={isDarkMode}
projectId={project.id}
/>
))}

{/* Add New Document Card */}
<NewDocumentCard onClick={() => setShowTemplateModal(true)} />
</>
)}
</div>
</div>

Expand All @@ -977,7 +1064,11 @@ export const DocsTab = ({
viewMode === 'beautiful' ? (
<div className="mb-8">
<PRPViewer
content={selectedDocument.content || {}}
content={{
title: selectedDocument.title,
document_type: selectedDocument.document_type,
...selectedDocument.content
}}
isDarkMode={isDarkMode}
/>
</div>
Expand Down
Loading