Files
redash/client/app/components/dynamic-parameters/DynamicButton.jsx
Gabriel Dutra 9f7844640a Introduce inheritance to the Parameter structure (#4049)
* Start draft for new Parameter structure

* Add the rest of the methods

* EnumParameter

* QueryBasedDropdownParameter

* DateParameter

* DateRangeParameter

* Update Parameter usage on code

* Merge dynamicValue into normalizedValue

* Add updateLocals and omit unwanted props

* Allow null NumberParameter and omit parentQueryId

* Rename parameter getValue to getExecutionValue

* Update $$value to normalizedValue + omit on save

* Add a few comments

* Remove ngModel property from Parameter

* Use value directly in DateRangeParameter

* Use simpler separator for DateRange url param

* Add backward compatibility

* Use normalizeValue null value for isEmpty

* Start creating jest tests

* Add more tests

* Normalize null value for multi mode in Enum

* Use saved value for param isEmpty
2019-10-24 12:42:30 +03:00

80 lines
2.3 KiB
JavaScript

import React, { useRef } from 'react';
import PropTypes from 'prop-types';
import { isFunction, get, findIndex } from 'lodash';
import Dropdown from 'antd/lib/dropdown';
import Icon from 'antd/lib/icon';
import Menu from 'antd/lib/menu';
import Typography from 'antd/lib/typography';
import { DynamicDateType } from '@/services/parameters/DateParameter';
import { DynamicDateRangeType } from '@/services/parameters/DateRangeParameter';
import './DynamicButton.less';
const { Text } = Typography;
function DynamicButton({ options, selectedDynamicValue, onSelect, enabled }) {
const menu = (
<Menu
className="dynamic-menu"
onClick={({ key }) => onSelect(get(options, key, 'static'))}
selectedKeys={[`${findIndex(options, { value: selectedDynamicValue })}`]}
data-test="DynamicButtonMenu"
>
{options.map((option, index) => (
// eslint-disable-next-line react/no-array-index-key
<Menu.Item key={index}>
{option.name} {option.label && (
<em>{isFunction(option.label) ? option.label() : option.label}</em>
)}
</Menu.Item>
))}
{enabled && <Menu.Divider />}
{enabled && (
<Menu.Item>
<Icon type="arrow-left" /><Text type="secondary">Back to Static Value</Text>
</Menu.Item>
)}
</Menu>
);
const containerRef = useRef(null);
return (
<div ref={containerRef}>
<a onClick={e => e.stopPropagation()}>
<Dropdown.Button
overlay={menu}
className="dynamic-button"
placement="bottomRight"
trigger={['click']}
icon={(
<Icon
type="thunderbolt"
theme={enabled ? 'twoTone' : 'outlined'}
className="dynamic-icon"
/>
)}
getPopupContainer={() => containerRef.current}
data-test="DynamicButton"
/>
</a>
</div>
);
}
DynamicButton.propTypes = {
options: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types
selectedDynamicValue: PropTypes.oneOfType([DynamicDateType, DynamicDateRangeType]),
onSelect: PropTypes.func,
enabled: PropTypes.bool,
};
DynamicButton.defaultProps = {
options: [],
selectedDynamicValue: null,
onSelect: () => {},
enabled: false,
};
export default DynamicButton;