mirror of
https://github.com/getredash/redash.git
synced 2025-12-25 01:03:20 -05:00
* Migrate Parameters component to React (#4006)
* Start Parameters Migration
* Add dirtyCount
* Use workaround with setState
* Apply Changes
* Add EditSettingsDialog
* Add Cmd/Ctrl + Enter behavior
* Remove isApplying
* Delete Angular version of parameters
* Update tests
* Remove angular stuff
* Update jest
* Drag placeholder
* Update events
* Use old button styling and move css
* Reviewing code
* Add parameter rearrange test
* Add Parameter Settings title change test
* Update Parameter Settings button styling
* Move parameter url logic back to Parameters
* Disable url update when query is new
* Styling changes (#4019)
* Ran's title width styling
* Update drag test
* Improve sizing for Number inputs
Co-Authored-By: Ran Byron <ranbena@gmail.com>
* Fix issue with dragged parameter wrapping
Co-Authored-By: Ran Byron <ranbena@gmail.com>
* Don't reevaluate dirtyParamCount
* Allow multiple values :)
* Fix parameter alignments
* Fix Select width on search
* Update client/app/components/Parameters.less
Co-Authored-By: Ran Byron <ranbena@gmail.com>
* Humanize param.name
* Make sure angular updates Execute disabled status
* Add more flake8 tests and fail build if any test fails (#4055)
* Add more flake8 tests and fail build if any test fails
Run all flake8 E9xx + F63x + F7xx + F82x tests.
* long = long in Python 2
* Fix: MySQL connections without SSL are failing (#4090)
* Move connection logic into a single method & make sure not to pass ssl value if not used.
* Remove wildcard import and format file.
* Removed redash-newstyle.less (#4017)
* Make sure we always pass a list to _get_column_lists (#4095)
(some data sources might return None as the columns list)
* [Data Sources] Add: Azure Data Explorer (Kusto) query runner (#4091)
* [Data Sources] Add: Azure Data Explorer (Kusto) query runner
* CodeClimate fixes
* Remove TODO
* Fixed configuration properties names for Azure Kusto
* Azure Kusto: get_schema in one query
* azure-kusto-data update to 0.0.32
* Add Kusto to the default query runners list
* [Qubole] - Adding support to process Quantum query types. (#4066)
* [Qubole] - Adding support to process Quantum query types.
Quantum is a serverless interactive service that offers
direct SQL access to user's data lake. Changes are made
to accept `quantum` query type from user which makes
`Cluster Label` as optional.
* -Making quantum as defult query.
-Dictionary safe access to connection parmeters
* keeping pep8 standards
* Maintainig pep8 std
* Use latest version of qds-sdk
* Use qds-sdk v1.13.0
* Use qds-sdk v1.12.0
* Use qds-sdk v1.13.0
* Updating SDK with verified version
* hive as default query type
* qds-sdk : Locking most recent release version
* qds-sdk : Locking recent release version
* falling back to original version of qds-sdk
* Dashboard: when updating parameters, run only relevant queries (#3804)
* refresh only affected queries in dashboard when parameters are changed
* rename pendingParameters to updatedParameters
* select which widgets to update according to their mapping as a dashboard-level parameter
* use lodash's include
* Migrate with SQL statements. (#4105)
* Update badge in README.md to link to CircleCI (#4104)
* Update README.md
* Update README.md
* Update README.md
Co-Authored-By: Ran Byron <ranbena@gmail.com>
* Update README.md
* Fix widget bottom element alignment (#4110)
* Fix: allow users with view only acces to use the queries in Query Results (#4112)
* Fix: allow users with view only acces to access the queries
* Add tests
* Update error message
* Update error message. Take 2
* Fix Dropdown parameter options appearing behind Dialog (#4109)
* Add ability to use Ant's Table loading property when using ItemsTable (#4117)
* Display data source icon in query editor (#4119)
* Move annotation logic into Query Runner (#4113)
* Code formatting
* Move annotation logic into query runner, so it can be overriden in the query runner.
* Add mixin to __all__
* Switch to flag instead of mixin
* Feature (Redshift): option to set query group for adhoc/scheduled queries (#4114)
* Add scheduled status to query job metadata.
* Add: option to set query group for adhoc/scheduled Redshift queries
* Scheduled might not be set for already enqueued queries.
* Fix number param value normlization (#4116)
* Use ng-src for data source icons (#4123)
* hive_ds: show a user friendly error message when possible (#4121)
* Update botocore, to get pass pip warning (#4122)
* Widget table scroll-x visible (#4101)
* Table viz horizontal scroll made visible
* Added tests
* Fixed snapshot pre-condition
* Perhaps this would trigger percy
* Upgrade Sentry-SDK and enable additional integratoins (#4127)
* Update sentry-sdk version
* Add additional Sentry integrations
* Migrate Counter visualization to React (#4106)
* Migrate Counter to React: Renderer
* Migrate Counter to React: Editor
* Cleanup
* Review and fix rows indexing algorithm
* Counter not properly scaled in editor
* Fix wrong label for/input id pair
* Tests
* Tests
* Fix vendor prefixes
* Remove unnecessary useEffect dependencies
* Update tests
* Fix Percy snapshot names
* Sync botocor eversions across requirements files. (#4128)
* Decrease size of widget pagination (#4120)
* Added tests
* Perhaps this would trigger percy
* Decrease size of widget pagination
* Removed unused attr
* Updated tests
* Allow the user to decide how to handle null values in charts (#4071)
* getredash/redash#2629 Refactor Chart visualization, add option for handling NULL values (keep/convert to 0.0)
* Handle null values in line/area stacking code; some cleanup
* Handle edge case: line/area stacking when last value of one of series is missing
* Mjnor update to line/area stacking code
* Fix line/area normalize to percents feature
* Unit tests
* Refine tests; add tests for prepareLayout function
* Tests for prepareData (heatmap) function
* Tests for prepareData (pie) function
* Tests for prepareData (bar, line, area) function
* Tests for prepareData (scatter, bubble) function
* Tests for prepareData (box) function
* Remove unused file
* Alerts: Add more condition comparison options (#4134)
* getredash/redash#4132 Add more condition comparison options
* Add arguments to fallback lambda
* Remove duplicate messages method (#4131)
* Migrate Chart visualization to React Part 1: Renderer (#4130)
* Migrate Chart visualization: Renderer
* Refine PlotlyChart component; move stylesheets to visualization's folder
* Migrate Custom JS Chart to React
* Cleanup
* Add jsconfig settings with '@' webpack alias (#4135)
* Counter Editor: move components to own files (#4138)
* Allow users to share aggregated usage information with us (#4108)
* Initial commit of BeaconConsent component
* Add comment about being able to change setting
* Use <Text> correctly
* Final version of consent screen
* Show beacon consent message on homepage only if it wasn't enabled already.
* Add consent setting to organization settings screen.
* Add support for custom message in OrgSetting.save.
* Implmenet consent saving.
* If consent given, send extra data
* Add HelpTrigger
* Make CodeClimate happy
* Wrap everything with DynamicComponent
* CHANGELOG for V8-beta. (#4057)
* CHANGELOG for V8-beta.
* Update CHANGELOG.md
* Update CHANGELOG.md
* Update CHANGELOG.md
* Bug fix: Query view doesn't sync parameters when selecting and deleting (#4146)
* Query Snippets: Use onClick instead of link for 'Click here' option (#4144)
* Snippets: Don't change url when not needed
* Revert "Snippets: Don't change url when not needed"
This reverts commit 2f346f3bb4.
* Query Snippets: use onClick instead of link
* Color picker component (#4136)
* Widget filters overlapped by visualization (#4137)
* Fix: widget filters overlapped by visualization
* Fix tests
* Fix tests
* CHANGELOG for v8.0.0-beta.2 (#4145)
* Stop building tarballs.
* Update version reference.
* CHANGELOG for 8.0.0-beta.2
196 lines
5.2 KiB
JavaScript
196 lines
5.2 KiB
JavaScript
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import Select from 'antd/lib/select';
|
|
import Input from 'antd/lib/input';
|
|
import InputNumber from 'antd/lib/input-number';
|
|
import DateParameter from '@/components/dynamic-parameters/DateParameter';
|
|
import DateRangeParameter from '@/components/dynamic-parameters/DateRangeParameter';
|
|
import { toString } from 'lodash';
|
|
import { QueryBasedParameterInput } from './QueryBasedParameterInput';
|
|
|
|
import './ParameterValueInput.less';
|
|
|
|
const { Option } = Select;
|
|
|
|
const multipleValuesProps = {
|
|
maxTagCount: 3,
|
|
maxTagTextLength: 10,
|
|
maxTagPlaceholder: num => `+${num.length} more`,
|
|
};
|
|
|
|
class ParameterValueInput extends React.Component {
|
|
static propTypes = {
|
|
type: PropTypes.string,
|
|
value: PropTypes.any, // eslint-disable-line react/forbid-prop-types
|
|
enumOptions: PropTypes.string,
|
|
queryId: PropTypes.number,
|
|
parameter: PropTypes.any, // eslint-disable-line react/forbid-prop-types
|
|
allowMultipleValues: PropTypes.bool,
|
|
onSelect: PropTypes.func,
|
|
className: PropTypes.string,
|
|
};
|
|
|
|
static defaultProps = {
|
|
type: 'text',
|
|
value: null,
|
|
enumOptions: '',
|
|
queryId: null,
|
|
parameter: null,
|
|
allowMultipleValues: false,
|
|
onSelect: () => {},
|
|
className: '',
|
|
};
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
value: props.parameter.hasPendingValue ? props.parameter.pendingValue : props.value,
|
|
isDirty: props.parameter.hasPendingValue,
|
|
};
|
|
}
|
|
|
|
componentDidUpdate = (prevProps) => {
|
|
const { value, parameter } = this.props;
|
|
// if value prop updated, reset dirty state
|
|
if (prevProps.value !== value || prevProps.parameter !== parameter) {
|
|
this.setState({
|
|
value: parameter.hasPendingValue ? parameter.pendingValue : value,
|
|
isDirty: parameter.hasPendingValue,
|
|
});
|
|
}
|
|
}
|
|
|
|
onSelect = (value) => {
|
|
const isDirty = toString(value) !== toString(this.props.value);
|
|
this.setState({ value, isDirty });
|
|
this.props.onSelect(value, isDirty);
|
|
}
|
|
|
|
renderDateParameter() {
|
|
const { type, parameter } = this.props;
|
|
const { value } = this.state;
|
|
return (
|
|
<DateParameter
|
|
type={type}
|
|
className={this.props.className}
|
|
value={value}
|
|
parameter={parameter}
|
|
onSelect={this.onSelect}
|
|
/>
|
|
);
|
|
}
|
|
|
|
renderDateRangeParameter() {
|
|
const { type, parameter } = this.props;
|
|
const { value } = this.state;
|
|
return (
|
|
<DateRangeParameter
|
|
type={type}
|
|
className={this.props.className}
|
|
value={value}
|
|
parameter={parameter}
|
|
onSelect={this.onSelect}
|
|
/>
|
|
);
|
|
}
|
|
|
|
renderEnumInput() {
|
|
const { enumOptions, allowMultipleValues } = this.props;
|
|
const { value } = this.state;
|
|
const enumOptionsArray = enumOptions.split('\n').filter(v => v !== '');
|
|
return (
|
|
<Select
|
|
className={this.props.className}
|
|
mode={allowMultipleValues ? 'multiple' : 'default'}
|
|
optionFilterProp="children"
|
|
disabled={enumOptionsArray.length === 0}
|
|
value={value}
|
|
onChange={this.onSelect}
|
|
dropdownMatchSelectWidth={false}
|
|
showSearch
|
|
showArrow
|
|
style={{ minWidth: 60 }}
|
|
notFoundContent={null}
|
|
{...multipleValuesProps}
|
|
>
|
|
{enumOptionsArray.map(option => (<Option key={option} value={option}>{ option }</Option>))}
|
|
</Select>
|
|
);
|
|
}
|
|
|
|
renderQueryBasedInput() {
|
|
const { queryId, parameter, allowMultipleValues } = this.props;
|
|
const { value } = this.state;
|
|
return (
|
|
<QueryBasedParameterInput
|
|
className={this.props.className}
|
|
mode={allowMultipleValues ? 'multiple' : 'default'}
|
|
optionFilterProp="children"
|
|
parameter={parameter}
|
|
value={value}
|
|
queryId={queryId}
|
|
onSelect={this.onSelect}
|
|
style={{ minWidth: 60 }}
|
|
{...multipleValuesProps}
|
|
/>
|
|
);
|
|
}
|
|
|
|
renderNumberInput() {
|
|
const { className } = this.props;
|
|
const { value } = this.state;
|
|
|
|
const normalize = val => (isNaN(val) ? undefined : val);
|
|
|
|
return (
|
|
<InputNumber
|
|
className={className}
|
|
value={normalize(value)}
|
|
onChange={val => this.onSelect(normalize(val))}
|
|
/>
|
|
);
|
|
}
|
|
|
|
renderTextInput() {
|
|
const { className } = this.props;
|
|
const { value } = this.state;
|
|
|
|
return (
|
|
<Input
|
|
className={className}
|
|
value={value}
|
|
data-test="TextParamInput"
|
|
onChange={e => this.onSelect(e.target.value)}
|
|
/>
|
|
);
|
|
}
|
|
|
|
renderInput() {
|
|
const { type } = this.props;
|
|
switch (type) {
|
|
case 'datetime-with-seconds':
|
|
case 'datetime-local':
|
|
case 'date': return this.renderDateParameter();
|
|
case 'datetime-range-with-seconds':
|
|
case 'datetime-range':
|
|
case 'date-range': return this.renderDateRangeParameter();
|
|
case 'enum': return this.renderEnumInput();
|
|
case 'query': return this.renderQueryBasedInput();
|
|
case 'number': return this.renderNumberInput();
|
|
default: return this.renderTextInput();
|
|
}
|
|
}
|
|
|
|
render() {
|
|
const { isDirty } = this.state;
|
|
|
|
return (
|
|
<div className="parameter-input" data-dirty={isDirty || null}>
|
|
{this.renderInput()}
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default ParameterValueInput;
|