import { isFunction, map, filter, fromPairs, noop } from "lodash";
import React, { useEffect } from "react";
import PropTypes from "prop-types";
import Tooltip from "@/components/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";
import AutoLimitCheckbox from "@/components/queries/QueryEditor/AutoLimitCheckbox";
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,
autoLimitCheckboxProps,
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 && (
)}
{autoLimitCheckboxProps !== 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,
}),
]),
autoLimitCheckboxProps: PropTypes.oneOfType([
PropTypes.bool, // `false` to hide
PropTypes.shape(AutoLimitCheckbox.propTypes),
]),
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,
autoLimitCheckboxProps: false,
dataSourceSelectorProps: false,
};