| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- import { useFetchFlow } from '@/hooks/flow-hooks';
- import get from 'lodash/get';
- import React, {
- MouseEventHandler,
- useCallback,
- useMemo,
- useState,
- } from 'react';
- import JsonView from 'react18-json-view';
- import 'react18-json-view/src/style.css';
- import { useReplaceIdWithText } from '../../hooks';
-
- import {
- Popover,
- PopoverContent,
- PopoverTrigger,
- } from '@/components/ui/popover';
- import {
- Table,
- TableBody,
- TableCell,
- TableHead,
- TableHeader,
- TableRow,
- } from '@/components/ui/table';
- import { useTranslate } from '@/hooks/common-hooks';
- import {
- Button,
- Card,
- Col,
- Input,
- Row,
- Space,
- Tabs,
- Typography,
- message,
- } from 'antd';
- import { useGetComponentLabelByValue } from '../../hooks/use-get-begin-query';
-
- interface IProps extends React.PropsWithChildren {
- nodeId: string;
- name?: string;
- }
-
- export function NextNodePopover({ children, nodeId, name }: IProps) {
- const { t } = useTranslate('flow');
-
- const { data } = useFetchFlow();
- console.log(data);
-
- const component = useMemo(() => {
- return get(data, ['dsl', 'components', nodeId], {});
- }, [nodeId, data]);
-
- const inputs: Array<{ component_id: string; content: string }> = get(
- component,
- ['obj', 'inputs'],
- [],
- );
- const output = get(component, ['obj', 'output'], {});
- const { conf, messages, prompt } = get(
- component,
- ['obj', 'params', 'infor'],
- {},
- );
- const { replacedOutput } = useReplaceIdWithText(output);
- const stopPropagation: MouseEventHandler = useCallback((e) => {
- e.stopPropagation();
- }, []);
-
- const getLabel = useGetComponentLabelByValue(nodeId);
-
- const [inputPage, setInputPage] = useState(1);
- const pageSize = 3;
- const pagedInputs = inputs.slice(
- (inputPage - 1) * pageSize,
- inputPage * pageSize,
- );
-
- return (
- <Popover>
- <PopoverTrigger onClick={stopPropagation} asChild>
- {children}
- </PopoverTrigger>
- <PopoverContent
- align={'start'}
- side={'right'}
- sideOffset={20}
- onClick={stopPropagation}
- className="w-[800px] p-4"
- style={{ maxHeight: 600, overflow: 'auto' }}
- >
- <Card
- bordered={false}
- style={{ marginBottom: 16, padding: 0 }}
- bodyStyle={{ padding: 0 }}
- >
- <Typography.Title
- level={5}
- style={{
- marginBottom: 16,
- fontWeight: 600,
- fontSize: 18,
- borderBottom: '1px solid #f0f0f0',
- paddingBottom: 8,
- }}
- >
- {name} {t('operationResults')}
- </Typography.Title>
- </Card>
- <Tabs
- defaultActiveKey="input"
- items={[
- {
- key: 'input',
- label: t('input'),
- children: (
- <Card
- size="small"
- className="bg-gray-50 dark:bg-gray-800"
- style={{ borderRadius: 8, border: '1px solid #e5e7eb' }}
- bodyStyle={{ padding: 16 }}
- >
- <Table>
- <TableHeader>
- <TableRow>
- <TableHead>{t('componentId')}</TableHead>
- <TableHead className="w-[60px]">
- {t('content')}
- </TableHead>
- </TableRow>
- </TableHeader>
- <TableBody>
- {pagedInputs.map((x, idx) => (
- <TableRow key={idx + (inputPage - 1) * pageSize}>
- <TableCell>{getLabel(x.component_id)}</TableCell>
- <TableCell className="truncate">
- {x.content}
- </TableCell>
- </TableRow>
- ))}
- </TableBody>
- </Table>
- {/* Pagination */}
- {inputs.length > pageSize && (
- <Row justify="end" style={{ marginTop: 8 }}>
- <Space>
- <Button
- size="small"
- disabled={inputPage === 1}
- onClick={() => setInputPage(inputPage - 1)}
- >
- Prev
- </Button>
- <span className="mx-2 text-sm">
- {inputPage} / {Math.ceil(inputs.length / pageSize)}
- </span>
- <Button
- size="small"
- disabled={
- inputPage === Math.ceil(inputs.length / pageSize)
- }
- onClick={() => setInputPage(inputPage + 1)}
- >
- Next
- </Button>
- </Space>
- </Row>
- )}
- </Card>
- ),
- },
- {
- key: 'output',
- label: t('output'),
- children: (
- <Card
- size="small"
- className="bg-gray-50 dark:bg-gray-800"
- style={{ borderRadius: 8, border: '1px solid #e5e7eb' }}
- bodyStyle={{ padding: 16 }}
- >
- <JsonView
- src={replacedOutput}
- displaySize={30}
- className="w-full max-h-[300px] break-words overflow-auto"
- />
- </Card>
- ),
- },
- {
- key: 'infor',
- label: t('infor'),
- children: (
- <Card
- size="small"
- className="bg-gray-50 dark:bg-gray-800"
- style={{ borderRadius: 8, border: '1px solid #e5e7eb' }}
- bodyStyle={{ padding: 16 }}
- >
- <Row gutter={16}>
- <Col span={12}>
- {conf && (
- <Card
- size="small"
- bordered={false}
- style={{
- marginBottom: 16,
- background: 'transparent',
- }}
- bodyStyle={{ padding: 0 }}
- >
- <Typography.Text
- strong
- style={{
- color: '#888',
- marginBottom: 8,
- display: 'block',
- }}
- >
- Configuration:
- </Typography.Text>
- <JsonView
- src={conf}
- displaySize={30}
- className="w-full max-h-[120px] break-words overflow-auto"
- />
- </Card>
- )}
- {prompt && (
- <Card
- size="small"
- bordered={false}
- style={{ background: 'transparent' }}
- bodyStyle={{ padding: 0 }}
- >
- <Row
- align="middle"
- justify="space-between"
- style={{ marginBottom: 8 }}
- >
- <Col>
- <Typography.Text strong style={{ color: '#888' }}>
- Prompt:
- </Typography.Text>
- </Col>
- <Col>
- <Button
- size="small"
- onClick={() => {
- const inlineString = prompt
- .replace(/\s+/g, ' ')
- .trim();
- navigator.clipboard.writeText(inlineString);
- message.success(
- 'Prompt copied as single line!',
- );
- }}
- >
- Copy as single line
- </Button>
- </Col>
- </Row>
- <Input.TextArea
- value={prompt}
- readOnly
- autoSize={{ minRows: 2, maxRows: 6 }}
- className="bg-white dark:bg-gray-900 border-gray-200 dark:border-gray-700"
- />
- </Card>
- )}
- </Col>
- <Col span={12}>
- {messages && (
- <Card
- size="small"
- bordered={false}
- style={{
- marginBottom: 16,
- background: 'transparent',
- }}
- bodyStyle={{ padding: 0 }}
- >
- <Typography.Text
- strong
- style={{
- color: '#888',
- marginBottom: 8,
- display: 'block',
- }}
- >
- Messages:
- </Typography.Text>
- <div className="max-h-[300px] overflow-auto">
- <JsonView
- src={messages}
- displaySize={30}
- className="w-full break-words"
- />
- </div>
- </Card>
- )}
- </Col>
- </Row>
- </Card>
- ),
- },
- ]}
- />
- </PopoverContent>
- </Popover>
- );
- }
|