import { formatSelectOptionsForRange, formatSelectOptions } from '../../modules/utils'; import visTypes from './visTypes'; import * as v from '../validators'; const D3_FORMAT_DOCS = 'D3 format syntax: https://github.com/d3/d3-format'; // input choices & options const D3_TIME_FORMAT_OPTIONS = [ ['.3s', '.3s | 12.3k'], ['.3%', '.3% | 1234543.210%'], ['.4r', '.4r | 12350'], ['.3f', '.3f | 12345.432'], ['+,', '+, | +12,345.4321'], ['$,.2f', '$,.2f | $12,345.43'], ]; const ROW_LIMIT_OPTIONS = [10, 50, 100, 250, 500, 1000, 5000, 10000, 50000]; const SERIES_LIMITS = [0, 5, 10, 25, 50, 100, 500]; export const TIME_STAMP_OPTIONS = [ ['smart_date', 'Adaptative formating'], ['%m/%d/%Y', '%m/%d/%Y | 01/14/2019'], ['%Y-%m-%d', '%Y-%m-%d | 2019-01-14'], ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S | 2019-01-14 01:32:10'], ['%H:%M:%S', '%H:%M:%S | 01:32:10'], ]; const MAP_DATASOURCE_TYPE_TO_EDIT_URL = { table: '/tablemodelview/edit', druid: '/druiddatasourcemodelview/edit', }; export const fields = { datasource: { type: 'SelectField', label: 'Datasource', clearable: false, default: null, mapStateToProps: (state) => ({ choices: state.datasources || [], editUrl: MAP_DATASOURCE_TYPE_TO_EDIT_URL[state.datasource_type], }), description: '', }, viz_type: { type: 'SelectField', label: 'Visualization Type', clearable: false, default: 'table', choices: Object.keys(visTypes).map(vt => [ vt, visTypes[vt].label, `/static/assets/images/viz_thumbnails/${vt}.png`, ]), description: 'The type of visualization to display', }, metrics: { type: 'SelectField', multi: true, label: 'Metrics', validators: [v.nonEmpty], mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.metrics_combo : [], }), default: [], description: 'One or many metrics to display', }, order_by_cols: { type: 'SelectField', multi: true, label: 'Ordering', default: [], description: 'One or many metrics to display', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.order_by_choices : [], }), }, metric: { type: 'SelectField', label: 'Metric', default: null, description: 'Choose the metric', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.metrics_combo : [], }), }, metric_2: { type: 'SelectField', label: 'Right Axis Metric', choices: [], default: [], description: 'Choose a metric for right axis', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.metrics_combo : [], }), }, stacked_style: { type: 'SelectField', label: 'Stacked Style', choices: [ ['stack', 'stack'], ['stream', 'stream'], ['expand', 'expand'], ], default: 'stack', description: '', }, linear_color_scheme: { type: 'SelectField', label: 'Linear Color Scheme', choices: [ ['fire', 'fire'], ['blue_white_yellow', 'blue/white/yellow'], ['white_black', 'white/black'], ['black_white', 'black/white'], ], default: 'blue_white_yellow', description: '', }, normalize_across: { type: 'SelectField', label: 'Normalize Across', choices: [ ['heatmap', 'heatmap'], ['x', 'x'], ['y', 'y'], ], default: 'heatmap', description: 'Color will be rendered based on a ratio ' + 'of the cell against the sum of across this ' + 'criteria', }, horizon_color_scale: { type: 'SelectField', label: 'Horizon Color Scale', choices: [ ['series', 'series'], ['overall', 'overall'], ['change', 'change'], ], default: 'series', description: 'Defines how the color are attributed.', }, canvas_image_rendering: { type: 'SelectField', label: 'Rendering', choices: [ ['pixelated', 'pixelated (Sharp)'], ['auto', 'auto (Smooth)'], ], default: 'pixelated', description: 'image-rendering CSS attribute of the canvas object that ' + 'defines how the browser scales up the image', }, xscale_interval: { type: 'SelectField', label: 'XScale Interval', choices: formatSelectOptionsForRange(1, 50), default: '1', description: 'Number of steps to take between ticks when ' + 'displaying the X scale', }, yscale_interval: { type: 'SelectField', label: 'YScale Interval', choices: formatSelectOptionsForRange(1, 50), default: null, description: 'Number of steps to take between ticks when ' + 'displaying the Y scale', }, bar_stacked: { type: 'CheckboxField', label: 'Stacked Bars', default: false, description: null, }, show_markers: { type: 'CheckboxField', label: 'Show Markers', default: false, description: 'Show data points as circle markers on the lines', }, show_bar_value: { type: 'CheckboxField', label: 'Bar Values', default: false, description: 'Show the value on top of the bar', }, order_bars: { type: 'CheckboxField', label: 'Sort Bars', default: false, description: 'Sort bars by x labels.', }, show_controls: { type: 'CheckboxField', label: 'Extra Controls', default: false, description: 'Whether to show extra controls or not. Extra controls ' + 'include things like making mulitBar charts stacked ' + 'or side by side.', }, reduce_x_ticks: { type: 'CheckboxField', label: 'Reduce X ticks', default: false, description: 'Reduces the number of X axis ticks to be rendered. ' + 'If true, the x axis wont overflow and labels may be ' + 'missing. If false, a minimum width will be applied ' + 'to columns and the width may overflow into an ' + 'horizontal scroll.', }, include_series: { type: 'CheckboxField', label: 'Include Series', default: false, description: 'Include series name as an axis', }, secondary_metric: { type: 'SelectField', label: 'Color Metric', default: null, description: 'A metric to use for color', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.metrics_combo : [], }), }, country_fieldtype: { type: 'SelectField', label: 'Country Field Type', default: 'cca2', choices: [ ['name', 'Full name'], ['cioc', 'code International Olympic Committee (cioc)'], ['cca2', 'code ISO 3166-1 alpha-2 (cca2)'], ['cca3', 'code ISO 3166-1 alpha-3 (cca3)'], ], description: 'The country code standard that Superset should expect ' + 'to find in the [country] column', }, groupby: { type: 'SelectField', multi: true, label: 'Group by', default: [], description: 'One or many fields to group by', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.gb_cols : [], }), }, columns: { type: 'SelectField', multi: true, label: 'Columns', choices: [], default: [], description: 'One or many fields to pivot as columns', }, all_columns: { type: 'SelectField', multi: true, label: 'Columns', default: [], description: 'Columns to display', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.all_cols : [], }), }, all_columns_x: { type: 'SelectField', label: 'X', default: null, description: 'Columns to display', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.all_cols : [], }), }, all_columns_y: { type: 'SelectField', label: 'Y', default: null, description: 'Columns to display', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.all_cols : [], }), }, druid_time_origin: { type: 'SelectField', freeForm: true, label: 'Origin', choices: [ ['', 'default'], ['now', 'now'], ], default: null, description: 'Defines the origin where time buckets start, ' + 'accepts natural dates as in `now`, `sunday` or `1970-01-01`', }, bottom_margin: { type: 'SelectField', freeForm: true, label: 'Bottom Margin', choices: formatSelectOptions(['auto', 50, 75, 100, 125, 150, 200]), default: 'auto', description: 'Bottom marging, in pixels, allowing for more room for axis labels', }, granularity: { type: 'SelectField', freeForm: true, label: 'Time Granularity', default: 'one day', choices: formatSelectOptions([ 'all', '5 seconds', '30 seconds', '1 minute', '5 minutes', '1 hour', '6 hour', '1 day', '7 days', 'week', 'week_starting_sunday', 'week_ending_saturday', 'month', ]), description: 'The time granularity for the visualization. Note that you ' + 'can type and use simple natural language as in `10 seconds`, ' + '`1 day` or `56 weeks`', }, domain_granularity: { type: 'SelectField', label: 'Domain', default: 'month', choices: formatSelectOptions(['hour', 'day', 'week', 'month', 'year']), description: 'The time unit used for the grouping of blocks', }, subdomain_granularity: { type: 'SelectField', label: 'Subdomain', default: 'day', choices: formatSelectOptions(['min', 'hour', 'day', 'week', 'month']), description: 'The time unit for each block. Should be a smaller unit than ' + 'domain_granularity. Should be larger or equal to Time Grain', }, link_length: { type: 'SelectField', freeForm: true, label: 'Link Length', default: '200', choices: formatSelectOptions(['10', '25', '50', '75', '100', '150', '200', '250']), description: 'Link length in the force layout', }, charge: { type: 'SelectField', freeForm: true, label: 'Charge', default: '-500', choices: formatSelectOptions([ '-50', '-75', '-100', '-150', '-200', '-250', '-500', '-1000', '-2500', '-5000', ]), description: 'Charge in the force layout', }, granularity_sqla: { type: 'SelectField', label: 'Time Column', default: null, description: 'The time column for the visualization. Note that you ' + 'can define arbitrary expression that return a DATETIME ' + 'column in the table or. Also note that the ' + 'filter below is applied against this column or ' + 'expression', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.all_cols : [], }), }, time_grain_sqla: { type: 'SelectField', label: 'Time Grain', default: 'Time Column', description: 'The time granularity for the visualization. This ' + 'applies a date transformation to alter ' + 'your time column and defines a new time granularity. ' + 'The options here are defined on a per database ' + 'engine basis in the Superset source code.', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.time_grain_sqla : [], }), }, resample_rule: { type: 'SelectField', freeForm: true, label: 'Resample Rule', default: null, choices: formatSelectOptions(['', '1T', '1H', '1D', '7D', '1M', '1AS']), description: 'Pandas resample rule', }, resample_how: { type: 'SelectField', freeForm: true, label: 'Resample How', default: null, choices: formatSelectOptions(['', 'mean', 'sum', 'median']), description: 'Pandas resample how', }, resample_fillmethod: { type: 'SelectField', freeForm: true, label: 'Resample Fill Method', default: null, choices: formatSelectOptions(['', 'ffill', 'bfill']), description: 'Pandas resample fill method', }, since: { type: 'SelectField', freeForm: true, label: 'Since', default: '7 days ago', choices: formatSelectOptions([ '1 hour ago', '12 hours ago', '1 day ago', '7 days ago', '28 days ago', '90 days ago', '1 year ago', '100 year ago', ]), description: 'Timestamp from filter. This supports free form typing and ' + 'natural language as in `1 day ago`, `28 days` or `3 years`', }, until: { type: 'SelectField', freeForm: true, label: 'Until', default: 'now', choices: formatSelectOptions([ 'now', '1 day ago', '7 days ago', '28 days ago', '90 days ago', '1 year ago', ]), }, max_bubble_size: { type: 'SelectField', freeForm: true, label: 'Max Bubble Size', default: '25', choices: formatSelectOptions(['5', '10', '15', '25', '50', '75', '100']), }, whisker_options: { type: 'SelectField', freeForm: true, label: 'Whisker/outlier options', default: 'Tukey', description: 'Determines how whiskers and outliers are calculated.', choices: formatSelectOptions([ 'Tukey', 'Min/max (no outliers)', '2/98 percentiles', '9/91 percentiles', ]), }, treemap_ratio: { type: 'TextField', label: 'Ratio', isFloat: true, default: 0.5 * (1 + Math.sqrt(5)), // d3 default, golden ratio description: 'Target aspect ratio for treemap tiles.', }, number_format: { type: 'SelectField', freeForm: true, label: 'Number format', default: D3_TIME_FORMAT_OPTIONS[0], choices: D3_TIME_FORMAT_OPTIONS, description: D3_FORMAT_DOCS, }, row_limit: { type: 'SelectField', freeForm: true, label: 'Row limit', default: null, choices: formatSelectOptions(ROW_LIMIT_OPTIONS), }, limit: { type: 'SelectField', freeForm: true, label: 'Series limit', choices: formatSelectOptions(SERIES_LIMITS), default: 50, description: 'Limits the number of time series that get displayed', }, timeseries_limit_metric: { type: 'SelectField', label: 'Sort By', default: null, description: 'Metric used to define the top series', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.metrics_combo : [], }), }, rolling_type: { type: 'SelectField', label: 'Rolling', default: 'None', choices: formatSelectOptions(['None', 'mean', 'sum', 'std', 'cumsum']), description: 'Defines a rolling window function to apply, works along ' + 'with the [Periods] text box', }, rolling_periods: { type: 'TextField', label: 'Periods', isInt: true, description: 'Defines the size of the rolling window function, ' + 'relative to the time granularity selected', }, series: { type: 'SelectField', label: 'Series', default: null, description: 'Defines the grouping of entities. ' + 'Each series is shown as a specific color on the chart and ' + 'has a legend toggle', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.gb_cols : [], }), }, entity: { type: 'SelectField', label: 'Entity', default: null, description: 'This define the element to be plotted on the chart', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.gb_cols : [], }), }, x: { type: 'SelectField', label: 'X Axis', default: null, description: 'Metric assigned to the [X] axis', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.gb_cols : [], }), }, y: { type: 'SelectField', label: 'Y Axis', default: null, description: 'Metric assigned to the [Y] axis', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.metrics_combo : [], }), }, size: { type: 'SelectField', label: 'Bubble Size', default: null, mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.metrics_combo : [], }), }, url: { type: 'TextField', label: 'URL', description: 'The URL, this field is templated, so you can integrate ' + '{{ width }} and/or {{ height }} in your URL string.', default: 'https: //www.youtube.com/embed/JkI5rg_VcQ4', }, x_axis_label: { type: 'TextField', label: 'X Axis Label', default: '', }, y_axis_label: { type: 'TextField', label: 'Y Axis Label', default: '', }, where: { type: 'TextField', label: 'Custom WHERE clause', default: '', description: 'The text in this box gets included in your query\'s WHERE ' + 'clause, as an AND to other criteria. You can include ' + 'complex expression, parenthesis and anything else ' + 'supported by the backend it is directed towards.', }, having: { type: 'TextField', label: 'Custom HAVING clause', default: '', description: 'The text in this box gets included in your query\'s HAVING ' + 'clause, as an AND to other criteria. You can include ' + 'complex expression, parenthesis and anything else ' + 'supported by the backend it is directed towards.', }, compare_lag: { type: 'TextField', label: 'Comparison Period Lag', isInt: true, description: 'Based on granularity, number of time periods to compare against', }, compare_suffix: { type: 'TextField', label: 'Comparison suffix', description: 'Suffix to apply after the percentage display', }, table_timestamp_format: { type: 'SelectField', freeForm: true, label: 'Table Timestamp Format', default: 'smart_date', choices: TIME_STAMP_OPTIONS, description: 'Timestamp Format', }, series_height: { type: 'SelectField', freeForm: true, label: 'Series Height', default: '25', choices: formatSelectOptions(['10', '25', '40', '50', '75', '100', '150', '200']), description: 'Pixel height of each series', }, page_length: { type: 'SelectField', freeForm: true, label: 'Page Length', default: 0, choices: formatSelectOptions([0, 10, 25, 40, 50, 75, 100, 150, 200]), description: 'Rows per page, 0 means no pagination', }, x_axis_format: { type: 'SelectField', freeForm: true, label: 'X axis format', default: 'smart_date', choices: TIME_STAMP_OPTIONS, description: D3_FORMAT_DOCS, }, y_axis_format: { type: 'SelectField', freeForm: true, label: 'Y axis format', default: '.3s', choices: D3_TIME_FORMAT_OPTIONS, description: D3_FORMAT_DOCS, }, y_axis_2_format: { type: 'SelectField', freeForm: true, label: 'Right axis format', default: '.3s', choices: D3_TIME_FORMAT_OPTIONS, description: D3_FORMAT_DOCS, }, markup_type: { type: 'SelectField', label: 'Markup Type', choices: formatSelectOptions(['markdown', 'html']), default: 'markdown', description: 'Pick your favorite markup language', }, rotation: { type: 'SelectField', label: 'Rotation', choices: formatSelectOptions(['random', 'flat', 'square']), default: 'random', description: 'Rotation to apply to words in the cloud', }, line_interpolation: { type: 'SelectField', label: 'Line Style', choices: formatSelectOptions(['linear', 'basis', 'cardinal', 'monotone', 'step-before', 'step-after']), default: 'linear', description: 'Line interpolation as defined by d3.js', }, pie_label_type: { type: 'SelectField', label: 'Label Type', default: 'key', choices: [ ['key', 'Category Name'], ['value', 'Value'], ['percent', 'Percentage'], ], description: 'What should be shown on the label?', }, code: { type: 'TextAreaField', label: 'Code', description: 'Put your code here', default: '', }, pandas_aggfunc: { type: 'SelectField', label: 'Aggregation function', choices: formatSelectOptions([ 'sum', 'mean', 'min', 'max', 'median', 'stdev', 'var', ]), default: 'sum', description: 'Aggregate function to apply when pivoting and ' + 'computing the total rows and columns', }, size_from: { type: 'TextField', isInt: true, label: 'Font Size From', default: '20', description: 'Font size for the smallest value in the list', }, size_to: { type: 'TextField', isInt: true, label: 'Font Size To', default: '150', description: 'Font size for the biggest value in the list', }, show_brush: { type: 'CheckboxField', label: 'Range Filter', default: false, description: 'Whether to display the time range interactive selector', }, date_filter: { type: 'CheckboxField', label: 'Date Filter', default: false, description: 'Whether to include a time filter', }, show_datatable: { type: 'CheckboxField', label: 'Data Table', default: false, description: 'Whether to display the interactive data table', }, include_search: { type: 'CheckboxField', label: 'Search Box', default: false, description: 'Whether to include a client side search box', }, table_filter: { type: 'CheckboxField', label: 'Table Filter', default: false, description: 'Whether to apply filter when table cell is clicked', }, show_bubbles: { type: 'CheckboxField', label: 'Show Bubbles', default: false, description: 'Whether to display bubbles on top of countries', }, show_legend: { type: 'CheckboxField', label: 'Legend', default: true, description: 'Whether to display the legend (toggles)', }, x_axis_showminmax: { type: 'CheckboxField', label: 'X bounds', default: true, description: 'Whether to display the min and max values of the X axis', }, rich_tooltip: { type: 'CheckboxField', label: 'Rich Tooltip', default: true, description: 'The rich tooltip shows a list of all series for that ' + 'point in time', }, y_axis_zero: { type: 'CheckboxField', label: 'Y Axis Zero', default: false, description: 'Force the Y axis to start at 0 instead of the minimum value', }, y_log_scale: { type: 'CheckboxField', label: 'Y Log Scale', default: false, description: 'Use a log scale for the Y axis', }, x_log_scale: { type: 'CheckboxField', label: 'X Log Scale', default: false, description: 'Use a log scale for the X axis', }, donut: { type: 'CheckboxField', label: 'Donut', default: false, description: 'Do you want a donut or a pie?', }, labels_outside: { type: 'CheckboxField', label: 'Put labels outside', default: true, description: 'Put the labels outside the pie?', }, contribution: { type: 'CheckboxField', label: 'Contribution', default: false, description: 'Compute the contribution to the total', }, num_period_compare: { type: 'TextField', label: 'Period Ratio', default: '', isInt: true, description: '[integer] Number of period to compare against, ' + 'this is relative to the granularity selected', }, period_ratio_type: { type: 'SelectField', label: 'Period Ratio Type', default: 'growth', choices: formatSelectOptions(['factor', 'growth', 'value']), description: '`factor` means (new/previous), `growth` is ' + '((new/previous) - 1), `value` is (new-previous)', }, time_compare: { type: 'TextField', label: 'Time Shift', default: null, description: 'Overlay a timeseries from a ' + 'relative time period. Expects relative time delta ' + 'in natural language (example: 24 hours, 7 days, ' + '56 weeks, 365 days', }, subheader: { type: 'TextField', label: 'Subheader', description: 'Description text that shows up below your Big Number', }, mapbox_label: { type: 'SelectField', multi: true, label: 'label', default: [], description: '`count` is COUNT(*) if a group by is used. ' + 'Numerical columns will be aggregated with the aggregator. ' + 'Non-numerical columns will be used to label points. ' + 'Leave empty to get a count of points in each cluster.', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.all_cols : [], }), }, mapbox_style: { type: 'SelectField', label: 'Map Style', choices: [ ['mapbox://styles/mapbox/streets-v9', 'Streets'], ['mapbox://styles/mapbox/dark-v9', 'Dark'], ['mapbox://styles/mapbox/light-v9', 'Light'], ['mapbox://styles/mapbox/satellite-streets-v9', 'Satellite Streets'], ['mapbox://styles/mapbox/satellite-v9', 'Satellite'], ['mapbox://styles/mapbox/outdoors-v9', 'Outdoors'], ], default: 'mapbox://styles/mapbox/streets-v9', description: 'Base layer map style', }, clustering_radius: { type: 'SelectField', freeForm: true, label: 'Clustering Radius', default: '60', choices: formatSelectOptions([ '0', '20', '40', '60', '80', '100', '200', '500', '1000', ]), description: 'The radius (in pixels) the algorithm uses to define a cluster. ' + 'Choose 0 to turn off clustering, but beware that a large ' + 'number of points (>1000) will cause lag.', }, point_radius: { type: 'SelectField', label: 'Point Radius', default: null, description: 'The radius of individual points (ones that are not in a cluster). ' + 'Either a numerical column or `Auto`, which scales the point based ' + 'on the largest cluster', mapStateToProps: (state) => ({ choices: state.fields.point_radius.choices, }), }, point_radius_unit: { type: 'SelectField', label: 'Point Radius Unit', default: 'Pixels', choices: formatSelectOptions(['Pixels', 'Miles', 'Kilometers']), description: 'The unit of measure for the specified point radius', }, global_opacity: { type: 'TextField', label: 'Opacity', default: 1, isFloat: true, description: 'Opacity of all clusters, points, and labels. ' + 'Between 0 and 1.', }, viewport_zoom: { type: 'TextField', label: 'Zoom', isFloat: true, default: 11, description: 'Zoom level of the map', places: 8, }, viewport_latitude: { type: 'TextField', label: 'Default latitude', default: 37.772123, isFloat: true, description: 'Latitude of default viewport', places: 8, }, viewport_longitude: { type: 'TextField', label: 'Default longitude', default: -122.405293, isFloat: true, description: 'Longitude of default viewport', places: 8, }, render_while_dragging: { type: 'CheckboxField', label: 'Live render', default: true, description: 'Points and clusters will update as viewport is being changed', }, mapbox_color: { type: 'SelectField', freeForm: true, label: 'RGB Color', default: 'rgb(0, 122, 135)', choices: [ ['rgb(0, 139, 139)', 'Dark Cyan'], ['rgb(128, 0, 128)', 'Purple'], ['rgb(255, 215, 0)', 'Gold'], ['rgb(69, 69, 69)', 'Dim Gray'], ['rgb(220, 20, 60)', 'Crimson'], ['rgb(34, 139, 34)', 'Forest Green'], ], description: 'The color for points and clusters in RGB', }, ranges: { type: 'TextField', label: 'Ranges', default: '', description: 'Ranges to highlight with shading', }, range_labels: { type: 'TextField', label: 'Range labels', default: '', description: 'Labels for the ranges', }, markers: { type: 'TextField', label: 'Markers', default: '', description: 'List of values to mark with triangles', }, marker_labels: { type: 'TextField', label: 'Marker labels', default: '', description: 'Labels for the markers', }, marker_lines: { type: 'TextField', label: 'Marker lines', default: '', description: 'List of values to mark with lines', }, marker_line_labels: { type: 'TextField', label: 'Marker line labels', default: '', description: 'Labels for the marker lines', }, filters: { type: 'FilterField', label: '', default: [], description: '', mapStateToProps: (state) => ({ choices: (state.datasource) ? state.datasource.filterable_cols : [], datasource: state.datasource, }), }, }; export default fields; // Control Panel fields that re-render chart without need for 'Query button' export const autoQueryFields = [ 'datasource', 'viz_type', 'bar_stacked', 'show_markers', 'show_bar_value', 'order_bars', 'show_controls', 'reduce_x_ticks', 'include_series', 'pie_label_type', 'show_brush', 'include_search', 'show_bubbles', 'show_legend', 'x_axis_showminmax', 'rich_tooltip', 'y_axis_zero', 'y_log_scale', 'x_log_scale', 'donut', 'labels_outside', 'contribution', 'size', 'row_limit', 'max_bubble_size', ];