mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
### What problem does this PR solve? Fix: Improve Agent templates functionality and fix some UI style issues #3221 ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue)
131 lines
3.8 KiB
TypeScript
131 lines
3.8 KiB
TypeScript
import { PageHeader } from '@/components/page-header';
|
|
import {
|
|
Breadcrumb,
|
|
BreadcrumbItem,
|
|
BreadcrumbLink,
|
|
BreadcrumbList,
|
|
BreadcrumbPage,
|
|
BreadcrumbSeparator,
|
|
} from '@/components/ui/breadcrumb';
|
|
import { useSetModalState } from '@/hooks/common-hooks';
|
|
import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
|
|
import { useFetchAgentTemplates, useSetAgent } from '@/hooks/use-agent-request';
|
|
import { IFlowTemplate } from '@/interfaces/database/flow';
|
|
import { useCallback, useEffect, useState } from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
import { CreateAgentDialog } from './create-agent-dialog';
|
|
import { TemplateCard } from './template-card';
|
|
import { MenuItemKey, SideBar } from './template-sidebar';
|
|
|
|
export default function AgentTemplates() {
|
|
const { navigateToAgentList } = useNavigatePage();
|
|
const { t } = useTranslation();
|
|
const list = useFetchAgentTemplates();
|
|
const { loading, setAgent } = useSetAgent();
|
|
const [templateList, setTemplateList] = useState<IFlowTemplate[]>([]);
|
|
const [selectMenuItem, setSelectMenuItem] = useState<string>(
|
|
MenuItemKey.Recommended,
|
|
);
|
|
useEffect(() => {
|
|
setTemplateList(list);
|
|
}, [list]);
|
|
const {
|
|
visible: creatingVisible,
|
|
hideModal: hideCreatingModal,
|
|
showModal: showCreatingModal,
|
|
} = useSetModalState();
|
|
|
|
const [template, setTemplate] = useState<IFlowTemplate>();
|
|
|
|
const showModal = useCallback(
|
|
(record: IFlowTemplate) => {
|
|
setTemplate(record);
|
|
showCreatingModal();
|
|
},
|
|
[showCreatingModal],
|
|
);
|
|
|
|
const { navigateToAgent } = useNavigatePage();
|
|
|
|
const handleOk = useCallback(
|
|
async (payload: any) => {
|
|
let dsl = template?.dsl;
|
|
const ret = await setAgent({
|
|
title: payload.name,
|
|
dsl,
|
|
avatar: template?.avatar,
|
|
});
|
|
|
|
if (ret?.code === 0) {
|
|
hideCreatingModal();
|
|
navigateToAgent(ret.data.id)();
|
|
}
|
|
},
|
|
[
|
|
hideCreatingModal,
|
|
navigateToAgent,
|
|
setAgent,
|
|
template?.avatar,
|
|
template?.dsl,
|
|
],
|
|
);
|
|
const handleSiderBarChange = (keyword: string) => {
|
|
const tempList = list.filter(
|
|
(item, index) =>
|
|
item.canvas_type
|
|
?.toLocaleLowerCase()
|
|
.includes(keyword?.toLocaleLowerCase()) || index === 0,
|
|
);
|
|
setTemplateList(tempList);
|
|
setSelectMenuItem(keyword);
|
|
};
|
|
return (
|
|
<section>
|
|
<PageHeader>
|
|
<Breadcrumb>
|
|
<BreadcrumbList>
|
|
<BreadcrumbItem>
|
|
<BreadcrumbLink onClick={navigateToAgentList}>
|
|
Agent
|
|
</BreadcrumbLink>
|
|
</BreadcrumbItem>
|
|
<BreadcrumbSeparator />
|
|
<BreadcrumbItem>
|
|
<BreadcrumbPage>{t('flow.createGraph')}</BreadcrumbPage>
|
|
</BreadcrumbItem>
|
|
</BreadcrumbList>
|
|
</Breadcrumb>
|
|
</PageHeader>
|
|
<div className="flex flex-1 h-dvh">
|
|
<SideBar
|
|
change={handleSiderBarChange}
|
|
selected={selectMenuItem}
|
|
></SideBar>
|
|
|
|
<main className="flex-1 bg-text-title-invert/50 h-dvh">
|
|
<div className="grid gap-6 sm:grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 max-h-[94vh] overflow-auto px-8 pt-8">
|
|
{templateList?.map((x, index) => {
|
|
return (
|
|
<TemplateCard
|
|
isCreate={index === 0}
|
|
key={x.id}
|
|
data={x}
|
|
showModal={showModal}
|
|
></TemplateCard>
|
|
);
|
|
})}
|
|
</div>
|
|
{creatingVisible && (
|
|
<CreateAgentDialog
|
|
loading={loading}
|
|
visible={creatingVisible}
|
|
hideModal={hideCreatingModal}
|
|
onOk={handleOk}
|
|
></CreateAgentDialog>
|
|
)}
|
|
</main>
|
|
</div>
|
|
</section>
|
|
);
|
|
}
|