blob: c74ac5615664dc4a19695a68a60b3ef45bdcdb05 [file] [log] [blame]
/* eslint camelcase: 0 */
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'],
],
},
],
filters: [
{
label: 'Filters',
description: 'Filters are defined using comma delimited strings as in <US,FR,Other>' +
'Leave the value field empty to filter empty strings or nulls' +
'For filters with comma in values, wrap them in single quotes' +
"as in <NY, 'Tahoe, CA', DC>",
},
{
label: 'Result Filters',
description: 'The filters to apply after post-aggregation.' +
'Leave the value field empty to filter empty strings or nulls',
},
],
};
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', 'table_filter'],
],
},
],
},
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: [],
description: 'One or many metrics to display',
},
order_by_cols: {
type: 'SelectMultipleSortableField',
label: 'Ordering',
choices: [],
default: [],
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: [],
default: [],
description: 'One or many fields to group by',
},
columns: {
type: 'SelectMultipleSortableField',
label: 'Columns',
choices: [],
default: [],
description: 'One or many fields to pivot as columns',
},
all_columns: {
type: 'SelectMultipleSortableField',
label: 'Columns',
choices: [],
default: [],
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: 'FreeFormSelectField',
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: 'FreeFormSelectField',
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: 'FreeFormSelectField',
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: 'FreeFormSelectField',
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: 'FreeFormSelectField',
label: 'Resample How',
default: null,
choices: formatSelectOptions(['', 'mean', 'sum', 'median']),
description: 'Pandas resample how',
},
resample_fillmethod: {
type: 'FreeFormSelectField',
label: 'Resample Fill Method',
default: null,
choices: formatSelectOptions(['', 'ffill', 'bfill']),
description: 'Pandas resample fill method',
},
since: {
type: 'FreeFormSelectField',
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: 'FreeFormSelectField',
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: 'FreeFormSelectField',
label: 'Max Bubble Size',
default: '25',
choices: formatSelectOptions(['5', '10', '15', '25', '50', '75', '100']),
},
whisker_options: {
type: 'FreeFormSelectField',
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: 'FreeFormSelectField',
label: 'Number format',
default: D3_TIME_FORMAT_OPTIONS[0],
choices: D3_TIME_FORMAT_OPTIONS,
description: D3_FORMAT_DOCS,
},
row_limit: {
type: 'FreeFormSelectField',
label: 'Row limit',
default: null,
choices: formatSelectOptions(ROW_LIMIT_OPTIONS),
},
limit: {
type: 'FreeFormSelectField',
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: 'FreeFormSelectField',
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',
},
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: '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: [],
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.',
},
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: 'FreeFormSelectField',
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 sectionsToRender(vizType, datasourceType) {
const viz = visTypes[vizType];
const timeSection = datasourceType === 'table' ?
commonControlPanelSections.sqlaTimeSeries : commonControlPanelSections.druidTimeSeries;
const { datasourceAndVizType, sqlClause } = commonControlPanelSections;
const sections = [datasourceAndVizType].concat(
viz.controlPanelSections, timeSection, sqlClause);
return sections;
}
export function defaultFormData(vizType = 'table', datasourceType = 'table') {
const data = {
slice_name: null,
slice_id: null,
datasource_name: null,
filters: [],
};
const sections = sectionsToRender(vizType, datasourceType);
sections.forEach((section) => {
section.fieldSetRows.forEach((fieldSetRow) => {
fieldSetRow.forEach((k) => {
data[k] = fields[k].default;
});
});
});
return data;
}
export function defaultViz(vizType, datasourceType = 'table') {
return {
cached_key: null,
cached_timeout: null,
cached_dttm: null,
column_formats: null,
csv_endpoint: null,
is_cached: false,
data: [],
form_data: defaultFormData(vizType, datasourceType),
json_endpoint: null,
query: null,
standalone_endpoint: null,
};
}
export function initialState(vizType = 'table', datasourceType = 'table') {
return {
dashboards: [],
isDatasourceMetaLoading: false,
datasources: null,
datasource_type: null,
filterColumnOpts: [],
fields,
viz: defaultViz(vizType, datasourceType),
isStarred: false,
};
}
// 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',
];