@hitachivantara/uikit-react-lab
Version:
Contributed React components for the NEXT UI Kit.
194 lines (193 loc) • 6.66 kB
JavaScript
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
import { NodeToolbar, Handle, Position } from "reactflow";
import { useLabels, HvIconButton, HvTypography } from "@hitachivantara/uikit-react-core";
import { mergeStyles } from "@hitachivantara/uikit-react-utils";
import { useClasses } from "./BaseNode.styles.js";
import { staticClasses } from "./BaseNode.styles.js";
import { renderedIcon, isInputGroup, isOutputGroup, isConnected } from "./utils.js";
import { useHvNode } from "../hooks/useNode.js";
const DEFAULT_LABELS = {
outputsTitle: "Outputs",
inputsTitle: "Inputs",
deleteActionLabel: "Delete",
duplicateActionLabel: "Duplicate"
};
const HvFlowBaseNode = ({
id,
title: titleProp,
headerItems,
icon: iconProp,
color: colorProp,
inputs: inputsProp,
outputs: outputsProp,
nodeActions: nodeActionsProp,
footer,
classes: classesProp,
labels: labelsProp,
className,
children
}) => {
const {
toggleShowActions,
getNodeToolbarProps,
handleDefaultAction,
nodeActions,
title,
icon,
color,
iconColor,
inputEdges,
inputs,
outputEdges,
outputs,
node
} = useHvNode({
id,
title: titleProp,
inputs: inputsProp,
outputs: outputsProp,
icon: iconProp,
color: colorProp,
labels: labelsProp,
nodeActions: nodeActionsProp
});
const labels = useLabels(DEFAULT_LABELS, labelsProp);
const { classes, cx } = useClasses(classesProp);
const renderOutput = (output) => {
const edgeConnected = isConnected(id, "source", output.id, outputEdges);
return /* @__PURE__ */ jsxs("div", { className: classes.outputContainer, children: [
/* @__PURE__ */ jsx(
Handle,
{
type: "source",
isConnectableEnd: false,
id: output.id,
position: Position.Right,
className: cx(classes.handle, {
[classes.handleConnected]: edgeConnected
})
}
),
output.isMandatory && !edgeConnected && /* @__PURE__ */ jsx("div", { className: classes.mandatory }),
/* @__PURE__ */ jsx(HvTypography, { component: "div", children: output.label })
] }, output.id);
};
const renderInput = (input) => {
const edgeConnected = isConnected(id, "target", input.id, inputEdges);
return /* @__PURE__ */ jsxs("div", { className: classes.inputContainer, children: [
/* @__PURE__ */ jsx(
Handle,
{
type: "target",
isConnectableStart: false,
id: input.id,
position: Position.Left,
className: cx(classes.handle, {
[classes.handleConnected]: edgeConnected
})
}
),
/* @__PURE__ */ jsx(HvTypography, { component: "div", children: input.label }),
input.isMandatory && !edgeConnected && /* @__PURE__ */ jsx("div", { className: classes.mandatory })
] }, input.id);
};
if (!node) return null;
return /* @__PURE__ */ jsxs(
"div",
{
style: mergeStyles(void 0, {
"--node-color": color
}),
className: cx(
"nowheel",
// Disables the default canvas pan behaviour when scrolling inside the node
classes.root,
className
),
onMouseEnter: toggleShowActions,
onMouseLeave: toggleShowActions,
children: [
/* @__PURE__ */ jsx(NodeToolbar, { ...getNodeToolbarProps(), children: nodeActions?.map((action) => /* @__PURE__ */ jsx(
HvIconButton,
{
title: action.label,
onClick: () => handleDefaultAction(action),
children: renderedIcon(action.icon)
},
action.id
)) }),
/* @__PURE__ */ jsxs("div", { className: classes.headerContainer, children: [
/* @__PURE__ */ jsxs(
"div",
{
style: mergeStyles(void 0, {
"--icon-color": iconColor
}),
className: classes.titleContainer,
children: [
icon,
/* @__PURE__ */ jsx(
HvTypography,
{
component: "p",
variant: "title4",
className: classes.title,
children: title
}
)
]
}
),
headerItems && /* @__PURE__ */ jsx("div", { style: { display: "flex" }, children: headerItems })
] }),
children && /* @__PURE__ */ jsx("div", { className: classes.contentContainer, children }),
inputs && inputs.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx("div", { className: classes.inputsTitleContainer, children: /* @__PURE__ */ jsx(HvTypography, { children: labels?.inputsTitle }) }),
/* @__PURE__ */ jsx("div", { className: classes.inputsContainer, children: inputs?.map((input, idx) => {
if (!isInputGroup(input)) return renderInput(input);
return /* @__PURE__ */ jsxs(
"div",
{
className: classes.inputGroupContainer,
children: [
/* @__PURE__ */ jsx(HvTypography, { component: "div", variant: "label", children: input.label }),
input.inputs.map(
(inp) => renderInput(inp)
)
]
},
`group${idx}`
);
}) })
] }),
outputs && outputs.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
/* @__PURE__ */ jsx("div", { className: classes.outputsTitleContainer, children: /* @__PURE__ */ jsx(HvTypography, { children: labels?.outputsTitle }) }),
/* @__PURE__ */ jsx("div", { className: classes.outputsContainer, children: outputs?.map((output, idx) => {
if (!isOutputGroup(output)) {
return renderOutput(output);
}
return /* @__PURE__ */ jsxs(
"div",
{
className: classes.outputGroupContainer,
children: [
/* @__PURE__ */ jsx(HvTypography, { component: "div", variant: "label", children: output.label }),
output.outputs.map((out) => {
return renderOutput(out);
})
]
},
`group${idx}`
);
}) })
] }),
footer && /* @__PURE__ */ jsx("div", { className: classes.footerContainer, children: footer })
]
}
);
};
export {
DEFAULT_LABELS,
HvFlowBaseNode,
staticClasses as flowBaseNodeClasses
};