mirror of
https://github.com/usual2970/certimate.git
synced 2025-06-08 21:49:52 +00:00
103 lines
3.4 KiB
TypeScript
103 lines
3.4 KiB
TypeScript
import { memo } from "react";
|
|
import { useTranslation } from "react-i18next";
|
|
import { Button, theme } from "antd";
|
|
|
|
import { type WorkflowNode } from "@/domain/workflow";
|
|
import { useZustandShallowSelector } from "@/hooks";
|
|
import { useWorkflowStore } from "@/stores/workflow";
|
|
|
|
import AddNode from "./AddNode";
|
|
import WorkflowElement from "../WorkflowElement";
|
|
import { type SharedNodeProps } from "./_SharedNode";
|
|
|
|
export type BrandNodeProps = SharedNodeProps;
|
|
|
|
const BranchNode = ({ node, disabled }: BrandNodeProps) => {
|
|
const { t } = useTranslation();
|
|
|
|
const { addBranch } = useWorkflowStore(useZustandShallowSelector(["addBranch"]));
|
|
|
|
const { token: themeToken } = theme.useToken();
|
|
|
|
const renderBranch = (node: WorkflowNode, branchNodeId?: string, branchIndex?: number) => {
|
|
const elements: JSX.Element[] = [];
|
|
|
|
let current = node as typeof node | undefined;
|
|
while (current) {
|
|
elements.push(<WorkflowElement key={current.id} node={current} disabled={disabled} branchId={branchNodeId} branchIndex={branchIndex} />);
|
|
current = current.next;
|
|
}
|
|
|
|
return elements;
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<div
|
|
className="relative flex gap-x-16 before:absolute before:inset-x-[128px] before:top-0 before:h-[2px] before:bg-stone-200 before:content-[''] after:absolute after:inset-x-[128px] after:bottom-0 after:h-[2px] after:bg-stone-200 after:content-['']"
|
|
style={{
|
|
backgroundColor: themeToken.colorBgContainer,
|
|
}}
|
|
>
|
|
<Button
|
|
className="absolute left-1/2 z-[1] -translate-x-1/2 -translate-y-1/2 text-xs"
|
|
disabled={disabled}
|
|
size="small"
|
|
shape="round"
|
|
variant="outlined"
|
|
onClick={() => {
|
|
addBranch(node.id);
|
|
}}
|
|
>
|
|
{t("workflow_node.action.add_branch")}
|
|
</Button>
|
|
|
|
{node.branches?.map((branch, index) => (
|
|
<div
|
|
key={branch.id}
|
|
className="relative flex flex-col items-center before:absolute before:left-1/2 before:top-0 before:h-full before:w-[2px] before:-translate-x-1/2 before:bg-stone-200 before:content-['']"
|
|
>
|
|
{index == 0 && (
|
|
<>
|
|
<div
|
|
className="absolute -left-px -top-1 h-2 w-1/2"
|
|
style={{
|
|
backgroundColor: themeToken.colorBgContainer,
|
|
}}
|
|
></div>
|
|
<div
|
|
className="absolute -bottom-1 -left-px z-50 h-2 w-1/2"
|
|
style={{
|
|
backgroundColor: themeToken.colorBgContainer,
|
|
}}
|
|
></div>
|
|
</>
|
|
)}
|
|
{node.branches && index == node.branches.length - 1 && (
|
|
<>
|
|
<div
|
|
className="absolute -right-px -top-1 h-2 w-1/2"
|
|
style={{
|
|
backgroundColor: themeToken.colorBgContainer,
|
|
}}
|
|
></div>
|
|
<div
|
|
className="absolute -bottom-1 -right-px z-50 h-2 w-1/2"
|
|
style={{
|
|
backgroundColor: themeToken.colorBgContainer,
|
|
}}
|
|
></div>
|
|
</>
|
|
)}
|
|
<div className="relative flex flex-col items-center">{renderBranch(branch, node.id, index)}</div>
|
|
</div>
|
|
))}
|
|
</div>
|
|
|
|
<AddNode node={node} disabled={disabled} />
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default memo(BranchNode);
|