Knowledge Base Page (pages/knowledgebase/index.tsx)¶
Overview¶
The Knowledge Base page provides a centralised repository for storing, organising, and retrieving company documents, templates, and knowledge resources. It enables users to build a comprehensive company knowledge archive that can be utilised by the AI for improved response accuracy.
Features¶
- Document upload and management
- Category-based organisation
- Advanced search capabilities
- Document tagging and metadata
- Version control for documents
- Grid and list view options
- Access control and permissions
- Bulk operations (delete, move, tag)
URL Parameters¶
None - authenticated route
Implementation¶
State Management¶
// Session and user state
const { data: session } = useSession();
const userID = session?.user?.userID;
// Document and folder state
const [documents, setDocuments] = useState<KnowledgeBaseDocument[]>([]);
const [folders, setFolders] = useState<KnowledgeBaseFolder[]>([]);
const [currentFolder, setCurrentFolder] = useState<string | null>(null);
const [breadcrumbs, setBreadcrumbs] = useState<Breadcrumb[]>([]);
// UI state
const [viewMode, setViewMode] = useState<"grid" | "list">("grid");
const [isUploading, setIsUploading] = useState<boolean>(false);
const [searchTerm, setSearchTerm] = useState<string>("");
const [selectedItems, setSelectedItems] = useState<string[]>([]);
const [sortBy, setSortBy] = useState<string>("dateCreated");
const [sortDirection, setSortDirection] = useState<"asc" | "desc">("desc");
Methods¶
// Document and folder operations
const fetchDocuments = async (folderId: string | null = null) =>
// Retrieves all documents in the current folder
const createFolder = async (name: string) =>
// Creates a new folder in the current location
const uploadDocument = async (file: File, metadata: DocumentMetadata) =>
// Uploads a new document with metadata
const deleteItems = async (itemIds: string[]) =>
// Deletes selected documents or folders
const moveItems = async (itemIds: string[], targetFolderId: string) =>
// Moves selected items to a different folder
// Navigation and UI
const navigateToFolder = async (folderId: string | null) =>
// Navigates to a specific folder and updates breadcrumbs
const handleSearch = (term: string) =>
// Searches documents and folders by name and content
const toggleViewMode = () =>
// Toggles between grid and list view
const handleSort = (field: string) =>
// Updates sort criteria and direction
HTML Structure¶
<div className="knowledge-base-container h-full">
{/* Header and controls */}
<div className="header-container mb-6">
<div className="flex justify-between items-center">
<h1 className="text-2xl font-bold">Knowledge Base</h1>
<div className="controls flex gap-2">
<Button onClick={() => setIsNewFolderModalOpen(true)}>
<FolderIcon className="mr-2 h-4 w-4" />
New Folder
</Button>
<Button onClick={() => setIsUploadModalOpen(true)}>
<UploadIcon className="mr-2 h-4 w-4" />
Upload
</Button>
</div>
</div>
{/* Search and filters */}
<div className="search-filter-container mt-4 flex gap-4">
<div className="search-container relative flex-grow">
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400" />
<Input
placeholder="Search knowledge base..."
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="pl-10"
/>
</div>
<div className="view-toggle flex gap-2">
<Button variant="outline" onClick={() => setViewMode("grid")}>
<Grid className="h-4 w-4" />
</Button>
<Button variant="outline" onClick={() => setViewMode("list")}>
<List className="h-4 w-4" />
</Button>
</div>
</div>
{/* Breadcrumb navigation */}
<div className="breadcrumbs-container mt-4">
<nav className="flex" aria-label="Breadcrumb">
<ol className="inline-flex items-center space-x-1 md:space-x-3">
{breadcrumbs.map((crumb, index) => (
<li key={crumb.id} className="inline-flex items-center">
{index > 0 && (
<ChevronRight className="mx-2 h-4 w-4 text-gray-400" />
)}
<button
onClick={() =>
navigateToFolder(crumb.id === "root" ? null : crumb.id)
}
className="text-sm font-medium text-blue-600 hover:text-blue-900"
>
{crumb.name}
</button>
</li>
))}
</ol>
</nav>
</div>
</div>
{/* Content grid/list */}
<div
className={
viewMode === "grid"
? "grid-container grid grid-cols-1 md:grid-cols-3 lg:grid-cols-4 gap-4"
: "list-container"
}
>
{/* Folders */}
{folders.map((folder) => (
<FolderCard
key={folder.id}
folder={folder}
viewMode={viewMode}
isSelected={selectedItems.includes(folder.id)}
onSelect={toggleItemSelection}
onNavigate={() => navigateToFolder(folder.id)}
/>
))}
{/* Documents */}
{documents.map((document) => (
<DocumentCard
key={document.id}
document={document}
viewMode={viewMode}
isSelected={selectedItems.includes(document.id)}
onSelect={toggleItemSelection}
onView={() => viewDocument(document.id)}
/>
))}
</div>
</div>
Props¶
No props - page component
Components/API Routes Used¶
Components¶
API Routes¶
/api/knowledgebase/documents- Manages knowledge base documents/api/knowledgebase/folders- Manages knowledge base folders/api/knowledgebase/search- Searches knowledge base content
Routes to Page¶
- Direct:
/knowledgebase - From: Navigation sidebar
- From: Home page knowledge base shortcut
Dependencies¶
import { useState, useEffect, useRef } from "react";
import { useSession } from "next-auth/react";
import { motion, AnimatePresence } from "framer-motion";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { ScrollArea } from "@/components/ui/scroll-area";
import { Dialog, DialogContent } from "@/components/ui/dialog";
import { KnowledgeBaseSearch } from "@/components/KnowledgeBaseSearch";
Notes¶
- Requires authentication
- Supports document versioning and history
- Implements document tagging for improved organisation
- Features advanced search capabilities with content indexing
- Integrates with the AI system to enhance responses with knowledge base content
- Supports multiple file formats including PDF, DOCX, XLSX, PPTX, and images