import { isFunction, map, filter, fromPairs, noop } from "lodash"; import React, { useEffect } from "react"; import PropTypes from "prop-types"; import Tooltip from "antd/lib/tooltip"; import Button from "antd/lib/button"; import Select from "antd/lib/select"; import KeyboardShortcuts, { humanReadableShortcut } from "@/services/KeyboardShortcuts"; import AutocompleteToggle from "./AutocompleteToggle"; import "./QueryEditorControls.less"; export function ButtonTooltip({ title, shortcut, ...props }) { shortcut = humanReadableShortcut(shortcut, 1); // show only primary shortcut title = title && shortcut ? ( {title} ({shortcut}) ) : ( title || shortcut ); return ; } ButtonTooltip.propTypes = { title: PropTypes.node, shortcut: PropTypes.string, }; ButtonTooltip.defaultProps = { title: null, shortcut: null, }; export default function EditorControl({ addParameterButtonProps, formatButtonProps, saveButtonProps, executeButtonProps, autocompleteToggleProps, dataSourceSelectorProps, }) { useEffect(() => { const buttons = filter( [addParameterButtonProps, formatButtonProps, saveButtonProps, executeButtonProps], b => b.shortcut && isFunction(b.onClick) ); if (buttons.length > 0) { const shortcuts = fromPairs(map(buttons, b => [b.shortcut, b.disabled ? noop : b.onClick])); KeyboardShortcuts.bind(shortcuts); return () => { KeyboardShortcuts.unbind(shortcuts); }; } }, [addParameterButtonProps, formatButtonProps, saveButtonProps, executeButtonProps]); return (
{addParameterButtonProps !== false && ( )} {formatButtonProps !== false && ( )} {autocompleteToggleProps !== false && ( )} {dataSourceSelectorProps === false && } {dataSourceSelectorProps !== false && ( )} {saveButtonProps !== false && ( )} {executeButtonProps !== false && ( )}
); } const ButtonPropsPropType = PropTypes.oneOfType([ PropTypes.bool, // `false` to hide button PropTypes.shape({ title: PropTypes.node, disabled: PropTypes.bool, loading: PropTypes.bool, onClick: PropTypes.func, text: PropTypes.node, shortcut: PropTypes.string, }), ]); EditorControl.propTypes = { addParameterButtonProps: ButtonPropsPropType, formatButtonProps: ButtonPropsPropType, saveButtonProps: ButtonPropsPropType, executeButtonProps: ButtonPropsPropType, autocompleteToggleProps: PropTypes.oneOfType([ PropTypes.bool, // `false` to hide PropTypes.shape({ available: PropTypes.bool, enabled: PropTypes.bool, onToggle: PropTypes.func, }), ]), dataSourceSelectorProps: PropTypes.oneOfType([ PropTypes.bool, // `false` to hide PropTypes.shape({ disabled: PropTypes.bool, value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), options: PropTypes.arrayOf( PropTypes.shape({ value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), label: PropTypes.node, }) ), onChange: PropTypes.func, }), ]), }; EditorControl.defaultProps = { addParameterButtonProps: false, formatButtonProps: false, saveButtonProps: false, executeButtonProps: false, autocompleteToggleProps: false, dataSourceSelectorProps: false, };