"use client" import { CircleHelpIcon, FileTextIcon, RefreshCwIcon } from "lucide-react" import Link from "next/link" import { toast } from "sonner" import { DashboardCrudPage } from "@/components/dashboard/crud" import { Badge } from "@/components/ui/badge" import { EditDialog } from "./_components/knowledge-base-edit" import { createKnowledgeBase, deleteKnowledgeBase, fetchKnowledgeBases, rebuildKnowledgeBaseIndex, updateKnowledgeBase, updateKnowledgeBaseSort, type CreateKnowledgeBasePayload, type KnowledgeBase, } from "@/lib/api/admin" import { KnowledgeBaseType, Status } from "@/lib/generated/enums" import { useI18n } from "@/i18n/provider" import { formatDateTime } from "@/lib/utils" export default function DashboardKnowledgePage() { const t = useI18n() const statusOptions = [ { value: "all", label: t("knowledge.allStatus") }, { value: String(Status.Ok), label: t("knowledge.statusOk") }, { value: String(Status.Disabled), label: t("knowledge.statusDisabled") }, { value: String(Status.Deleted), label: t("knowledge.statusDeleted") }, ] return ( filters={[ { name: "name", label: t("knowledge.searchBase"), placeholder: t("knowledge.searchBase"), defaultValue: "", trim: true, className: "w-full sm:w-80", }, { name: "status", label: t("knowledge.allStatus"), type: "select", defaultValue: "all", allValue: "all", options: statusOptions, className: "w-full sm:w-36", }, ]} columns={[ { key: "knowledgeBase", label: t("knowledge.columnBase"), className: "w-[36rem] max-w-[36rem]", render: (item) => { const isFAQ = item.knowledgeType === KnowledgeBaseType.FAQ const Icon = isFAQ ? CircleHelpIcon : FileTextIcon return (
{item.name}

{item.description || t("knowledge.noDescription")}

) }, }, { key: "type", label: t("knowledge.columnType"), render: (item) => {item.knowledgeTypeName}, }, { key: "contentCount", label: t("knowledge.columnContent"), render: (item) => ( {item.knowledgeType === KnowledgeBaseType.FAQ ? `${item.faqCount} ${t("knowledge.faq")}` : `${item.documentCount} ${t("knowledge.document")}`} ), }, { key: "status", label: t("knowledge.columnStatus"), render: (item) => ( {item.statusName} ), }, { key: "updatedAt", label: t("knowledge.columnUpdatedAt"), className: "whitespace-nowrap", render: (item) => ( {formatDateTime(item.updatedAt)} ), }, ]} fetchList={fetchKnowledgeBases} getItemId={(item) => item.id} createItem={createKnowledgeBase} updateItem={(item, payload) => updateKnowledgeBase({ id: item.id, ...payload })} deleteItem={(item) => deleteKnowledgeBase(item.id)} renderEditDialog={({ open, saving, itemId, onOpenChange, onSubmit }) => ( )} rowActions={[ { key: "rebuild-index", label: (item) => t("knowledge.rebuildIndex"), icon: , run: async ({ item }) => { await rebuildKnowledgeBaseIndex(item.id) toast.success(t("knowledge.rebuildStarted", { name: item.name })) }, }, ]} sort={{ enabled: true, onReorder: (items) => updateKnowledgeBaseSort(items.map((item) => item.id)), successMessage: t("knowledge.sortUpdated"), errorMessage: t("knowledge.sortUpdateFailed"), handleLabel: t("knowledge.sortHandle"), }} pageSize={1000} labels={{ refresh: t("knowledge.refreshBases"), create: t("knowledge.createBaseTitle"), query: t("knowledge.query"), loading: t("knowledge.loading"), empty: t("knowledge.emptyBases"), actions: t("knowledge.columnActions"), edit: t("knowledge.edit"), delete: t("knowledge.delete"), processing: t("knowledge.processing"), moreActions: (item) => t("knowledge.moreActions", { name: item.name }), loadFailed: t("knowledge.loadBasesFailed"), saveFailed: t("knowledge.baseSaveFailed"), deleteFailed: t("knowledge.baseDeleteFailed"), created: (payload) => t("knowledge.baseCreated", { name: payload.name }), updated: (item, payload) => t("knowledge.baseUpdated", { name: payload.name || item.name }), deleted: (item) => t("knowledge.baseDeleted", { name: item.name }), }} /> ) }