import React from 'react'; import {Renderer, RendererProps} from '../factory'; import {RootCloseWrapper} from 'react-overlays'; import Overlay from '../components/Overlay'; import PopOver from '../components/PopOver'; import TooltipWrapper from '../components/TooltipWrapper'; import type {TooltipObject, Trigger} from '../components/TooltipWrapper'; import {isDisabled, isVisible, noop} from '../utils/helper'; import {filter} from '../utils/tpl'; import {Icon} from '../components/icons'; import {BaseSchema, SchemaClassName} from '../Schema'; import {ActionSchema} from './Action'; import {DividerSchema} from './Divider'; /** * 下拉按钮渲染器。 * 文档:https://baidu.gitee.io/amis/docs/components/dropdown-button */ export interface DropdownButtonSchema extends BaseSchema { /** * 指定为 DropDown Button 类型 */ type: 'dropdown-button'; /** * 是否独占一行 `display: block` */ block?: boolean; /** * 给 Button 配置 className。 */ btnClassName?: SchemaClassName; /** * 按钮集合 */ buttons?: Array; /** * 按钮文字 */ label?: string; /** * 按钮级别,样式 */ level?: 'info' | 'success' | 'danger' | 'warning' | 'primary' | 'link'; /** * 按钮提示文字,hover 时显示 */ // tooltip?: SchemaTooltip; /** * 点击外部是否关闭 */ closeOnOutside?: boolean; /** * 点击内容是否关闭 */ closeOnClick?: boolean; /** * 按钮大小 */ size?: 'xs' | 'sm' | 'md' | 'lg'; /** * 对齐方式 */ align?: 'left' | 'right'; /** * 是否只显示图标。 */ iconOnly?: boolean; } export interface DropDownButtonProps extends RendererProps, Omit { disabledTip?: string | TooltipObject; /** * 按钮提示文字,hover focus 时显示 */ tooltip?: string | TooltipObject; placement?: 'top' | 'right' | 'bottom' | 'left'; tooltipContainer?: any; tooltipTrigger?: Trigger | Array; tooltipRootClose?: boolean; defaultIsOpened?: boolean; label?: any; } export interface DropDownButtonState { isOpened: boolean; } export default class DropDownButton extends React.Component< DropDownButtonProps, DropDownButtonState > { state: DropDownButtonState = { isOpened: false }; static defaultProps: Pick< DropDownButtonProps, 'placement' | 'tooltipTrigger' | 'tooltipRootClose' > = { placement: 'top', tooltipTrigger: ['hover', 'focus'], tooltipRootClose: false }; target: any; constructor(props: DropDownButtonProps) { super(props); this.open = this.open.bind(this); this.close = this.close.bind(this); this.toogle = this.toogle.bind(this); this.domRef = this.domRef.bind(this); } componentDidMount() { if (this.props.defaultIsOpened) { this.setState({ isOpened: true }); } } domRef(ref: any) { this.target = ref; } toogle(e: React.MouseEvent) { e.preventDefault(); this.setState({ isOpened: !this.state.isOpened }); } open() { this.setState({ isOpened: true }); } close() { this.setState({ isOpened: false }); } renderOuter() { const { render, buttons, data, popOverContainer, classnames: cx, classPrefix: ns, children, align, closeOnClick, closeOnOutside } = this.props; let body = (
    {children ? children : Array.isArray(buttons) ? buttons.map((button, index) => { if (typeof button !== 'string' && !isVisible(button, data)) { return null; } else if (button === 'divider' || button.type === 'divider') { return
  • ; } return (
  • {render(`button/${index}`, { type: 'button', ...(button as any), isMenuItem: true })}
  • ); }) : null}
); if (popOverContainer) { return ( this.target} show> {body} ); } return body; } render() { const { tooltip, placement, tooltipContainer, tooltipTrigger, tooltipRootClose, disabledTip, block, disabled, btnDisabled, btnClassName, size, label, level, primary, className, classnames: cx, align, iconOnly, icon, data } = this.props; return (
{this.state.isOpened ? this.renderOuter() : null}
); } } @Renderer({ type: 'dropdown-button', name: 'dropdown-button' }) export class DropDownButtonRenderer extends DropDownButton {}