packages/x-flow/src/components/NodeContainer/index.tsx (83 lines of code) (raw):

import { Popover } from 'antd'; import classNames from 'classnames'; import React, { memo, useMemo } from 'react'; import createIconFont from '../../utils/createIconFont'; import TextEllipsis from '../TextEllipsis'; import './index.less'; import TitleMenuTooltip from './TitleMenuTooltip'; export default memo((props: any) => { const { className, onClick, children, icon, title, desc, hideDesc, NodeWidget, iconFontUrl, iconSvg, hideTitleTips, isSwitchBottom, nodeSettingTitle, } = props; const IconBox = useMemo(() => createIconFont(iconFontUrl), [iconFontUrl]); const renderDesc = () => ( <> {!hideDesc && !!desc && ( <TextEllipsis text={desc} rows={2} type="paragraph" className='node-desc' /> )} </> ); const renderDescAndNodeWidget = () => { if (isSwitchBottom) { // 条件节点且为TB布局 return ( <> {renderDesc()} {NodeWidget && <div className="node-widget">{NodeWidget}</div>} </> ); } else { return ( <> {NodeWidget && <div className="node-widget">{NodeWidget}</div>} {renderDesc()} </> ); } }; return ( <div className={classNames('custom-node-container', { [className]: !!className, })} onClick={onClick} > <div className="node-title"> {!hideTitleTips ? ( <Popover overlayClassName="nodes-popover" content={<TitleMenuTooltip {...props} />} placement="bottomLeft" trigger="hover" getPopupContainer={() => document.getElementById('xflow-container') as HTMLElement } overlayInnerStyle={{ padding: '12px 16px' }} > <span className="icon-box" style={{ background: icon?.bgColor }}> {iconSvg ? iconSvg : <IconBox {...icon} />} </span> </Popover> ) : ( <span className="icon-box" style={{ background: icon?.bgColor }}> {iconSvg ? iconSvg : <IconBox {...icon} />} </span> )} <TextEllipsis text={title} style={{ width: 188, marginLeft: '8px' }} /> </div> <div className="node-body">{children}</div> {renderDescAndNodeWidget()} </div> ); });