/* * @Author: ZhaoYing * @Date: 2026-02-03 14:10:15 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-02-03 14:10:15 */ import { type FC, useState, useRef, type MouseEvent } from 'react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Row, Col, Button, Flex, Divider, Space, App, Tooltip } from 'antd' import SearchInput from '@/components/SearchInput'; import OntologyModal from './components/OntologyModal' import type { OntologyModalRef, OntologyItem, Query, OntologyImportModalRef, OntologyExportModalRef } from './types' import RbCard from '@/components/RbCard/Card' import Tag from '@/components/Tag' import PageScrollList, { type PageScrollListRef } from '@/components/PageScrollList' import { getOntologyScenesUrl, deleteOntologyScene } from '@/api/ontology' import { formatDateTime } from '@/utils/format' import OntologyImportModal from './components/OntologyImportModal' import OntologyExportModal from './components/OntologyExportModal' /** * Ontology management page component * Displays a list of ontology scenes with search, create, import, export functionality */ const Ontology: FC = () => { // Hooks const { t } = useTranslation(); const navigate = useNavigate() const { modal, message } = App.useApp(); // State const [query, setQuery] = useState({}); // Refs const scrollListRef = useRef(null) const entityModalRef = useRef(null) const ontologyImportModalRef = useRef(null) const ontologyExportModalRef = useRef(null) /** * Open modal to create a new ontology scene */ const handleCreate = () => { entityModalRef.current?.handleOpen() } /** * Open modal to edit an existing ontology scene * @param record - The ontology item to edit * @param e - Mouse event to prevent propagation */ const handleEdit = (record: OntologyItem, e: MouseEvent) => { e.preventDefault(); e.stopPropagation(); entityModalRef.current?.handleOpen(record) } /** * Delete an ontology scene with confirmation * @param item - The ontology item to delete * @param e - Mouse event to prevent propagation */ const handleDelete = (item: OntologyItem, e: MouseEvent) => { e.preventDefault(); e.stopPropagation(); modal.confirm({ title: t('common.confirmDeleteDesc', { name: item.scene_name }), okText: t('common.delete'), cancelText: t('common.cancel'), okType: 'danger', onOk: () => { deleteOntologyScene(item.scene_id) .then(() => { message.success(t('common.deleteSuccess')) scrollListRef.current?.refresh() }) } }) } /** * Navigate to ontology detail page * @param record - The ontology item to view */ const handleJump = (record: OntologyItem) => { navigate(`/ontology/${record.scene_id}`) } /** * Refresh the ontology list */ const handleRefresh = () => { scrollListRef.current?.refresh() } /** * Open export modal */ const handleExport = () => { ontologyExportModalRef.current?.handleOpen() } /** * Open import modal */ const handleImport = () => { ontologyImportModalRef.current?.handleOpen() } return ( <> setQuery({ scene_name: value })} className="rb:w-full!" /> ref={scrollListRef} url={getOntologyScenesUrl} query={query} column={3} renderItem={(item) =>( {item.type_num} {t('ontology.typeCount')}} onClick={() => handleJump(item)} className="rb:cursor-pointer" >
{t(`ontology.scene_description`)} {item.scene_description}
{(['created_at', 'updated_at'] as const).map(key => (
{t(`ontology.${key}`)} {formatDateTime(item[key])}
))}
{t('ontology.entityTypes')}:
{item.entity_type?.map((type, i) => ( {type} ))} {item.type_num > 3 && ( +{item.type_num - 3} )}
handleEdit(item, e)} >
handleDelete(item, e)} >
)} /> ) } export default Ontology