import { formatSelectOptionsForRange, formatSelectOptions } from '../../modules/utils'; export const fieldTypes = [ 'CheckboxField', 'FreeFormSelectField', 'IntegerField', 'SelectCustomMultiField', 'SelectField', 'SelectMultipleSortableField', 'TextAreaFeild', 'TextField', ]; 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]; 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 SQLA_FILTER_OPTIONS = ['in', 'not in', 'regex']; const DRUID_FILTER_OPTIONS = SQLA_FILTER_OPTIONS.push('regex'); const DRUID_HAVING_OPTIONS = ['==', '!=', '>', '<', '>=', '<=']; export const FIELD_CHOICES_OPTIONS = { D3_TIME_FORMAT_OPTIONS, ROW_LIMIT_OPTIONS, SERIES_LIMITS, TIME_STAMP_OPTIONS, SQLA_FILTER_OPTIONS, DRUID_FILTER_OPTIONS, DRUID_HAVING_OPTIONS, }; export const commonControlPanelSections = { druidTimeSeries: { label: 'Time', description: 'Time related form attributes', fieldSetRows: [ ['granularity', 'druid_time_origin'], ['since', 'until'], ], }, datasourceAndVizType: { label: 'Datasource & Chart Type', fieldSetRows: [ ['datasource'], ['viz_type'], ], }, sqlaTimeSeries: { label: 'Time', description: 'Time related form attributes', fieldSetRows: [ ['granularity_sqla', 'time_grain_sqla'], ['since', 'until'], ], }, sqlClause: { label: 'SQL', fieldSetRows: [ ['where', 'having'], ], description: 'This section exposes ways to include snippets of SQL in your query', }, NVD3TimeSeries: [ { label: null, fieldSetRows: [ ['metrics'], ['groupby'], ['limit', 'timeseries_limit_metric'], ], }, { label: 'Advanced Analytics', description: 'This section contains options ' + 'that allow for advanced analytical post processing ' + 'of query results', fieldSetRows: [ ['rolling_type', 'rolling_periods'], ['time_compare'], ['num_period_compare', 'period_ratio_type'], ['resample_how', 'resample_rule'], ['resample_fillmethod'], ], }, ], }; export const visTypes = { dist_bar: { label: 'Distribution - Bar Chart', controlPanelSections: [ { label: 'Chart Options', description: 'tooltip text here', fieldSetRows: [ ['metrics'], ['groupby'], ['columns'], ['row_limit'], ['show_legend', 'show_bar_value'], ['bar_stacked', 'order_bars'], ['y_axis_format', 'bottom_margin'], ['x_axis_label', 'y_axis_label'], ['reduce_x_ticks', 'contribution'], ['show_controls'], ], }, ], fieldOverrides: { groupby: { label: 'Series', }, columns: { label: 'Breakdowns', description: 'Defines how each series is broken down', }, }, }, pie: { label: 'Pie Chart', controlPanelSections: [ { label: null, fieldSetRows: [ ['metrics', 'groupby'], ['limit'], ['pie_label_type'], ['donut', 'show_legend'], ['labels_outside'], ], }, ], }, line: { label: 'Time Series - Line Chart', requiresTime: true, controlPanelSections: [ commonControlPanelSections.NVD3TimeSeries[0], { label: 'Chart Options', fieldSetRows: [ ['show_brush', 'show_legend'], ['rich_tooltip', 'y_axis_zero'], ['y_log_scale', 'contribution'], ['show_markers', 'x_axis_showminmax'], ['line_interpolation'], ['x_axis_format', 'y_axis_format'], ['x_axis_label', 'y_axis_label'], ], }, commonControlPanelSections.NVD3TimeSeries[1], ], }, bar: { label: 'Time Series - Bar Chart', requiresTime: true, controlPanelSections: [ commonControlPanelSections.NVD3TimeSeries[0], { label: 'Chart Options', fieldSetRows: [ ['show_brush', 'show_legend', 'show_bar_value'], ['rich_tooltip', 'y_axis_zero'], ['y_log_scale', 'contribution'], ['x_axis_format', 'y_axis_format'], ['line_interpolation', 'bar_stacked'], ['x_axis_showminmax', 'bottom_margin'], ['x_axis_label', 'y_axis_label'], ['reduce_x_ticks', 'show_controls'], ], }, commonControlPanelSections.NVD3TimeSeries[1], ], }, compare: { label: 'Time Series - Percent Change', requiresTime: true, controlPanelSections: [ commonControlPanelSections.NVD3TimeSeries[0], commonControlPanelSections.NVD3TimeSeries[1], ], }, area: { label: 'Time Series - Stacked', requiresTime: true, controlPanelSections: [ commonControlPanelSections.NVD3TimeSeries[0], { label: 'Chart Options', fieldSetRows: [ ['show_brush', 'show_legend'], ['rich_tooltip', 'y_axis_zero'], ['y_log_scale', 'contribution'], ['x_axis_format', 'y_axis_format'], ['x_axis_showminmax', 'show_controls'], ['line_interpolation', 'stacked_style'], ], }, commonControlPanelSections.NVD3TimeSeries[1], ], }, table: { label: 'Table View', controlPanelSections: [ { label: 'GROUP BY', description: 'Use this section if you want a query that aggregates', fieldSetRows: [ ['groupby', 'metrics'], ], }, { label: 'NOT GROUPED BY', description: 'Use this section if you want to query atomic rows', fieldSetRows: [ ['all_columns', 'order_by_cols'], ], }, { label: 'Options', fieldSetRows: [ ['table_timestamp_format'], ['row_limit'], ['page_length'], ['include_search'], ], }, ], }, markup: { label: 'Markup', controlPanelSections: [ { label: null, fieldSetRows: [ ['markup_type', 'code'], ], }, ], }, pivot_table: { label: 'Pivot Table', controlPanelSections: [ { label: null, fieldSetRows: [ ['groupby', 'columns'], ['metrics', 'pandas_aggfunc'], ], }, ], }, separator: { label: 'Separator', controlPanelSections: [ { label: null, fieldSetRows: [ ['code'], ], }, ], fieldOverrides: { code: { default: '####Section Title\n' + 'A paragraph describing the section' + 'of the dashboard, right before the separator line ' + '\n\n' + '---------------', }, }, }, word_cloud: { label: 'Word Cloud', controlPanelSections: [ { label: null, fieldSetRows: [ ['series', 'metric', 'limit'], ['size_from', 'size_to'], ['rotation'], ], }, ], }, treemap: { label: 'Treemap', controlPanelSections: [ { label: null, fieldSetRows: [ ['metrics'], ['groupby'], ], }, { label: 'Chart Options', fieldSetRows: [ ['treemap_ratio'], ['number_format'], ], }, ], }, cal_heatmap: { label: 'Calendar Heatmap', requiresTime: true, controlPanelSections: [ { label: null, fieldSetRows: [ ['metric'], ['domain_granularity'], ['subdomain_granularity'], ], }, ], }, box_plot: { label: 'Box Plot', controlPanelSections: [ { label: null, fieldSetRows: [ ['metrics'], ['groupby', 'limit'], ], }, { label: 'Chart Options', fieldSetRows: [ ['whisker_options'], ], }, ], }, bubble: { label: 'Bubble Chart', controlPanelSections: [ { label: null, fieldSetRows: [ ['series', 'entity'], ['x', 'y'], ['size', 'limit'], ], }, { label: 'Chart Options', fieldSetRows: [ ['x_log_scale', 'y_log_scale'], ['show_legend'], ['max_bubble_size'], ['x_axis_label', 'y_axis_label'], ], }, ], }, big_number: { label: 'Big Number with Trendline', controlPanelSections: [ { label: null, fieldSetRows: [ ['metric'], ['compare_lag'], ['compare_suffix'], ['y_axis_format'], ], }, ], fieldOverrides: { y_axis_format: { label: 'Number format', }, }, }, big_number_total: { controlPanelSections: [ { label: null, fieldSetRows: [ ['metric'], ['subheader'], ['y_axis_format'], ], }, ], fieldOverrides: { y_axis_format: { label: 'Number format', }, }, }, histogram: { label: 'Histogram', controlPanelSections: [ { label: null, fieldSetRows: [ ['all_columns_x'], ['row_limit'], ], }, { label: 'Histogram Options', fieldSetRows: [ ['link_length'], ], }, ], fieldOverrides: { all_columns_x: { label: 'Numeric Column', description: 'Select the numeric column to draw the histogram', }, link_length: { label: 'No of Bins', description: 'Select number of bins for the histogram', default: 5, }, }, }, sunburst: { label: 'Sunburst', controlPanelSections: [ { label: null, fieldSetRows: [ ['groupby'], ['metric', 'secondary_metric'], ['row_limit'], ], }, ], fieldOverrides: { metric: { label: 'Primary Metric', description: 'The primary metric is used to define the arc segment sizes', }, secondary_metric: { label: 'Secondary Metric', description: 'This secondary metric is used to ' + 'define the color as a ratio against the primary metric. ' + 'If the two metrics match, color is mapped level groups', }, groupby: { label: 'Hierarchy', description: 'This defines the level of the hierarchy', }, }, }, sankey: { label: 'Sankey', controlPanelSections: [ { label: null, fieldSetRows: [ ['groupby'], ['metric'], ['row_limit'], ], }, ], fieldOverrides: { groupby: { label: 'Source / Target', description: 'Choose a source and a target', }, }, }, directed_force: { label: 'Directed Force Layout', controlPanelSections: [ { label: null, fieldSetRows: [ ['groupby'], ['metric'], ['row_limit'], ], }, { label: 'Force Layout', fieldSetRows: [ ['link_length'], ['charge'], ], }, ], fieldOverrides: { groupby: { label: 'Source / Target', description: 'Choose a source and a target', }, }, }, world_map: { label: 'World Map', controlPanelSections: [ { label: null, fieldSetRows: [ ['entity'], ['country_fieldtype'], ['metric'], ], }, { label: 'Bubbles', fieldSetRows: [ ['show_bubbles'], ['secondary_metric'], ['max_bubble_size'], ], }, ], fieldOverrides: { entity: { label: 'Country Field', description: '3 letter code of the country', }, metric: { label: 'Metric for color', description: 'Metric that defines the color of the country', }, secondary_metric: { label: 'Bubble size', description: 'Metric that defines the size of the bubble', }, }, }, filter_box: { label: 'Filter Box', controlPanelSections: [ { label: null, fieldSetRows: [ ['date_filter'], ['groupby'], ['metric'], ], }, ], fieldOverrides: { groupby: { label: 'Filter fields', description: 'The fields you want to filter on', default: [], }, }, }, iframe: { label: 'iFrame', controlPanelSections: [ { label: null, fieldSetRows: [ ['url'], ], }, ], }, para: { label: 'Parallel Coordinates', controlPanelSections: [ { label: null, fieldSetRows: [ ['series'], ['metrics'], ['secondary_metric'], ['limit'], ['show_datatable', 'include_series'], ], }, ], }, heatmap: { label: 'Heatmap', controlPanelSections: [ { label: 'Axis & Metrics', fieldSetRows: [ ['all_columns_x'], ['all_columns_y'], ['metric'], ], }, { label: 'Heatmap Options', fieldSetRows: [ ['linear_color_scheme'], ['xscale_interval', 'yscale_interval'], ['canvas_image_rendering'], ['normalize_across'], ], }, ], }, horizon: { label: 'Horizon', controlPanelSections: [ commonControlPanelSections.NVD3TimeSeries[0], { label: 'Chart Options', fieldSetRows: [ ['series_height', 'horizon_color_scale'], ], }, ], }, mapbox: { label: 'Mapbox', controlPanelSections: [ { label: null, fieldSetRows: [ ['all_columns_x', 'all_columns_y'], ['clustering_radius'], ['row_limit'], ['groupby'], ['render_while_dragging'], ], }, { label: 'Points', fieldSetRows: [ ['point_radius'], ['point_radius_unit'], ], }, { label: 'Labelling', fieldSetRows: [ ['mapbox_label'], ['pandas_aggfunc'], ], }, { label: 'Visual Tweaks', fieldSetRows: [ ['mapbox_style'], ['global_opacity'], ['mapbox_color'], ], }, { label: 'Viewport', fieldSetRows: [ ['viewport_longitude'], ['viewport_latitude'], ['viewport_zoom'], ], }, ], fieldOverrides: { all_columns_x: { label: 'Longitude', description: 'Column containing longitude data', }, all_columns_y: { label: 'Latitude', description: 'Column containing latitude data', }, pandas_aggfunc: { label: 'Cluster label aggregator', description: 'Aggregate function applied to the list of points ' + 'in each cluster to produce the cluster label.', }, rich_tooltip: { label: 'Tooltip', description: 'Show a tooltip when hovering over points and clusters ' + 'describing the label', }, groupby: { description: 'One or many fields to group by. If grouping, latitude ' + 'and longitude columns must be present.', }, }, }, }; export const fields = { datasource: { type: 'SelectField', label: 'Datasource', default: null, choices: [], description: '', }, viz_type: { type: 'SelectField', label: 'Viz', default: 'table', choices: formatSelectOptions(Object.keys(visTypes)), description: 'The type of visualization to display', }, metrics: { type: 'SelectMultipleSortableField', label: 'Metrics', choices: [], default: null, description: 'One or many metrics to display', }, order_by_cols: { type: 'SelectMultipleSortableField', label: 'Ordering', choices: [], description: 'One or many metrics to display', }, metric: { type: 'SelectField', label: 'Metric', choices: [], default: null, description: 'Choose the metric', }, 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', choices: [], default: null, description: 'A metric to use for color', }, 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: 'SelectMultipleSortableField', label: 'Group by', choices: [], description: 'One or many fields to group by', }, columns: { type: 'SelectMultipleSortableField', label: 'Columns', choices: [], description: 'One or many fields to pivot as columns', }, all_columns: { type: 'SelectMultipleSortableField', label: 'Columns', choices: [], description: 'Columns to display', }, all_columns_x: { type: 'SelectField', label: 'X', choices: [], default: null, description: 'Columns to display', }, all_columns_y: { type: 'SelectField', label: 'Y', choices: [], default: null, description: 'Columns to display', }, druid_time_origin: { type: 'SelectField', 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', 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', 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', label: 'Link Length', default: '200', choices: formatSelectOptions(['10', '25', '50', '75', '100', '150', '200', '250']), description: 'Link length in the force layout', }, charge: { type: 'FreeFormSelectField', 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, choices: [], 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', }, time_grain_sqla: { type: 'SelectField', label: 'Time Grain', choices: [], 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.', }, resample_rule: { type: 'FreeFormSelectField', label: 'Resample Rule', default: null, choices: formatSelectOptions(['', '1T', '1H', '1D', '7D', '1M', '1AS']), description: 'Pandas resample rule', }, resample_how: { type: 'SelectField', label: 'Resample How', default: null, choices: formatSelectOptions(['', 'mean', 'sum', 'median']), description: 'Pandas resample how', }, resample_fillmethod: { type: 'SelectField', label: 'Resample Fill Method', default: null, choices: formatSelectOptions(['', 'ffill', 'bfill']), description: 'Pandas resample fill method', }, since: { type: 'SelectField', 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', 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', label: 'Max Bubble Size', default: '25', choices: formatSelectOptions(['5', '10', '15', '25', '50', '75', '100']), }, whisker_options: { type: 'SelectField', 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: 'IntegerField', label: 'Ratio', default: 0.5 * (1 + Math.sqrt(5)), // d3 default, golden ratio description: 'Target aspect ratio for treemap tiles.', }, number_format: { type: 'SelectField', label: 'Number format', default: D3_TIME_FORMAT_OPTIONS[0], choices: D3_TIME_FORMAT_OPTIONS, description: D3_FORMAT_DOCS, }, row_limit: { type: 'SelectField', label: 'Row limit', default: null, choices: formatSelectOptions(ROW_LIMIT_OPTIONS), }, limit: { type: 'SelectField', 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', choices: [], default: null, description: 'Metric used to define the top series', }, 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: 'IntegerField', label: 'Periods', validators: [], description: 'Defines the size of the rolling window function, ' + 'relative to the time granularity selected', }, series: { type: 'SelectField', label: 'Series', choices: [], default: null, description: 'Defines the grouping of entities. ' + 'Each series is shown as a specific color on the chart and ' + 'has a legend toggle', }, entity: { type: 'SelectField', label: 'Entity', choices: [], default: null, description: 'This define the element to be plotted on the chart', }, x: { type: 'SelectField', label: 'X Axis', choices: [], default: null, description: 'Metric assigned to the [X] axis', }, y: { type: 'SelectField', label: 'Y Axis', choices: [], default: null, description: 'Metric assigned to the [Y] axis', }, size: { type: 'SelectField', label: 'Bubble Size', default: null, choices: [], }, 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', 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', label: 'Table Timestamp Format', default: 'smart_date', choices: TIME_STAMP_OPTIONS, description: 'Timestamp Format', }, series_height: { type: 'FreeFormSelectField', label: 'Series Height', default: '25', choices: formatSelectOptions(['10', '25', '40', '50', '75', '100', '150', '200']), description: 'Pixel height of each series', }, page_length: { type: 'FreeFormSelectField', 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: 'FreeFormSelectField', label: 'X axis format', default: 'smart_date', choices: TIME_STAMP_OPTIONS, description: D3_FORMAT_DOCS, }, y_axis_format: { type: 'FreeFormSelectField', label: 'Y 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', label: 'Font Size From', default: '20', description: 'Font size for the smallest value in the list', }, size_to: { type: 'TextField', 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', }, 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: 'IntegerField', label: 'Period Ratio', default: '', validators: [], 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: 'SelectMultipleSortableField', label: 'label', choices: [], 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.', }, 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: 'FreeFormSelectField', 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, choices: [], 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', }, 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: 'IntegerField', label: 'Opacity', default: 1, description: 'Opacity of all clusters, points, and labels. ' + 'Between 0 and 1.', }, viewport_zoom: { type: 'IntegerField', label: 'Zoom', default: 11, validators: [], description: 'Zoom level of the map', places: 8, }, viewport_latitude: { type: 'IntegerField', label: 'Default latitude', default: 37.772123, description: 'Latitude of default viewport', places: 8, }, viewport_longitude: { type: 'IntegerField', label: 'Default longitude', default: -122.405293, 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', 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', }, }; export function defaultFormData(vizType = 'table') { const data = { slice_name: null, slice_id: null, datasource_name: null, }; const { datasourceAndVizType, sqlClause } = commonControlPanelSections; const viz = visTypes[vizType]; const sectionsToRender = [datasourceAndVizType].concat(viz.controlPanelSections, sqlClause); sectionsToRender.forEach((section) => { section.fieldSetRows.forEach((fieldSetRow) => { fieldSetRow.forEach((k) => { data[k] = fields[k].default; }); }); }); return data; } export function defaultViz(vizType) { return { cached_key: null, cached_timeout: null, cached_dttm: null, column_formats: null, csv_endpoint: null, is_cached: false, data: [], form_data: defaultFormData(vizType), json_endpoint: null, query: null, standalone_endpoint: null, }; } export function initialState(vizType = 'table') { return { isDatasourceMetaLoading: false, datasources: null, datasource_type: null, fields, viz: defaultViz(vizType), isStarred: false, }; }