import AddIcon from '@mui/icons-material/Add'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import Button from '@mui/material/Button'; import IconButton from '@mui/material/IconButton'; import Menu from '@mui/material/Menu'; import MenuItem from '@mui/material/MenuItem'; import { styled } from '@mui/material/styles'; import React, { useCallback } from 'react'; import { transientOptions } from '../../lib'; import { colors, colorsRaw, transitions } from './styles'; import type { MouseEvent, ReactNode } from 'react'; import type { ObjectField, TranslatedProps } from '../../interface'; const TopBarContainer = styled('div')` position: relative; align-items: center; background-color: ${colors.textFieldBorder}; display: flex; justify-content: space-between; padding: 2px 8px; `; interface ExpandButtonContainerProps { $hasError: boolean; } const ExpandButtonContainer = styled( 'div', transientOptions, )( ({ $hasError }) => ` display: flex; align-items: center; color: rgba(0, 0, 0, 0.6); font-family: 'Roboto', 'Helvetica', 'Arial', sans-serif; font-weight: 400; font-size: 1rem; line-height: 1.4375em; letter-spacing: 0.00938em; ${$hasError ? `color: ${colorsRaw.red}` : ''} `, ); export interface ObjectWidgetTopBarProps { allowAdd?: boolean; types?: ObjectField[]; onAdd?: (event: MouseEvent) => void; onAddType?: (name: string) => void; onCollapseToggle: (event: MouseEvent) => void; collapsed: boolean; heading: ReactNode; label?: string; hasError?: boolean; } const ObjectWidgetTopBar = ({ allowAdd, types, onAdd, onAddType, onCollapseToggle, collapsed, heading, label, hasError = false, t, }: TranslatedProps) => { const [anchorEl, setAnchorEl] = React.useState(null); const open = Boolean(anchorEl); const handleClick = useCallback((event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }, []); const handleClose = useCallback(() => { setAnchorEl(null); }, []); const handleAddType = useCallback( (type: ObjectField) => () => { handleClose(); onAddType?.(type.name); }, [handleClose, onAddType], ); const renderTypesDropdown = useCallback( (types: ObjectField[]) => { return (
{types.map((type, idx) => type ? ( {type.label ?? type.name} ) : null, )}
); }, [open, handleClick, t, label, anchorEl, handleClose, handleAddType], ); const renderAddButton = useCallback(() => { return ( ); }, [t, label, onAdd]); const renderAddUI = useCallback(() => { if (!allowAdd) { return null; } if (types && types.length > 0) { return renderTypesDropdown(types); } else { return renderAddButton(); } }, [allowAdd, types, renderTypesDropdown, renderAddButton]); return ( {heading} {renderAddUI()} ); }; export default ObjectWidgetTopBar;