The Chart KATA widget can build complex, dynamic charts with mixed visualizations and datasets from multiple sources. The datasets and chart schema are both defined using a KATA dialect.

Configuration

Datasets

A dataset is a collection of series data. An /identifier names the dataset.

Each series within a dataset has a unique key name containing an array of values.

For instance, a time-series dataset could include a series named ts with timestamps for the x-axis, and a second series named values with the y-axis values.

Type Description
automation: Load data from an automation. Almost anything is possible here.
dataQuery: Load data from a data query.
manual: Static data. This is primarily useful in interactions where some chart data has already been loaded.

automation:

Load series data from a ui.chart.data automation.

This can synthesize and preprocess chart data from anywhere: third-party APIs, Cerb records, business intelligence tools, etc.



automation/avgInflow:
  uri: cerb:automation:example.chartData.avgTicketInflows
  inputs:
    date_range: today to +4 weeks
  disabled@bool: no


dataQuery:

Load data from a data query.



dataQuery/tickets:
  query@text:
    type:worklist.subtotals
    of:ticket
    by:[created@month,group]
    query:(created:"this year")
    format:${format}
  query_params:
    format: timeseries


Key  
cache_secs@int: The number of seconds to cache the data query results. Use 0 to disable.
key_map: Assign new names to any series in the dataset (e.g. yes -> # Outgoing Messages). This can be an object of keys (old labels) and values (new labels), or key_map@csv: Old Label 1, New Label 1.
query: The data query to execute.
query_params: An optional dictionary of untrusted parameters used in the data query. Reference like ${placeholderKey}.

manual:

Load static data.



manual/series0:
  data:
    x@csv: 2022-01-01,2022-02-01,2022-03-01,2022-04-01
    custom@csv: 33,66,99,500


Chart

A {{datasets.name}} placeholder is available for each defined dataset. For instance, a grid: line can be rendered from a dynamically computed value (e.g. average, threshold, goal).

Key
axis:
color:
data:
grid:
legend:
tooltip:


data:
  type: bar
  series:
    tickets:
      name: Tickets
      x_key: ts
    series0:
      name: Custom Series
      x_key: x
      y_axis: y2
      y_type: line
    tasks:
      name: Tasks
      x_key: ts
  stacks:
    0@csv: tickets
    1@csv: tasks

axis:
  x:
    label: Time
    type: timeseries
    tick:
      date:
        format: %Y-%m
  y:
    label: Tickets/Tasks
  y2:
    label: Custom

grid:
  y:
    lines:
      0:
        value: {{datasets.baseline.value}}
        text: Target ({{datasets.baseline.value}})
        position: start


axis:

Key  
x: By default, the horizontal axis on the bottom.
y: By default, the vertical axis on the left.
y2: An optional second vertical axis on the right.

x:, y:, y2:

Key  
categories@list: If the axis is type: category, this is the optional preferred sort order. Otherwise, categories occur in the order they were defined.
label: An optional label to display along the axis.
tick: Options regarding measurement ticks.
type: category, linear (default), or timeseries

tick:

Key  
format: date:, duration:, or number: (default)

tick:format:

Key  
date: A date format string using d3-time-format specifiers. For example: %Y-%m-%d %H:%M:%S
duration: An elapsed time.
number: A number string using d3-format specifiers. For example: $,.2

tick:format:duration:

Key  
unit: milliseconds, seconds, minutes, hours
precision@int: The number of significant measures (e.g. 3 for 2d,5h,4m)

color:

Key  
patterns: A dictionary of named hex color patterns. For example: rainbow12@csv: #6e40aa, #b83cb0, #f6478d, #ff6956, #f59f30, #c4d93e, #83f557, #38f17a, #19d3b5, #29a0dd, #5069d9, #6e40aa.

Each dataset can specify a color pattern using data:series:*:color_pattern:. Several pre-defined color patterns are available through code autocompletion.

If a pattern key ends in the _dark suffix it will be preferred in dark mode.

If a color pattern is named default it will apply to any series without an explicit color assigned.

If multiple datasets share the same non-default color pattern, colors will be synchronized for values that are identical. For instance, if two series compare groups over current/prior year, then ‘Support’ will have the same color in both datasets.

data:

Key  
series: A dictionary of datasets to display on the chart.
stacks: A dictionary of datasets to stack (e.g. stacked bar). The keys can be anything as long as they’re unique. e.g. 0@csv: dataset1, dataset2.
type: The default visualization for all series on the chart.

series:

Each series: key is a dataset name that may contain multiple series.

Key  
color_pattern: The color:patterns: scheme to use for this dataset. A pattern will repeat if there are more series than colors. When two datasets use the same pattern, the same series names will be assigned the same colors.
name: A name to prepend to each series in the dataset.
x_key: The series key used for the x-axis. For instance, timestamps on a timeseries axis, or labels on a category axis.
y_axis: y (default) or y2.
y_type: An optional type: for this dataset. For instance, you can overlay on line trend on a bar chart.

type:

Type
area
area-spline
area-step
bar
donut
gauge
line
pie
scatter
spline
step

grid:

Key
x:
y:

x:, y:

Key
lines:

lines:

Each line must have a unique key name containing:

Key  
position: start, end
text: The label to display on the line.
value: The location on the given axis to draw the line.

legend:

Key  
show@bool: no to hide the legend, otherwise visible (by default).
style: compact (default) or table

style:table:

Key  
data@bool: yes to show full data for the visualization, otherwise omitted (by default)
stats@csv: Any combination of: sum, avg, min, max. Omitted by default.

tooltip:

Key  
grouped@bool: no to show only the data point under the mouse cursor, otherwise everything with the same x-axis value is shown together.
ratios@bool: yes to calculate ratios for series at each x-tick, otherwise hidden (by default)
show@bool: no to hide mouse hover tooltips over data points, otherwise visible (by default)

Examples

Timeseries: Stacked bar of tickets created this year by group

Datasets:



dataQuery/tickets:
  query@text:
    type:worklist.subtotals
    of:ticket
    by.count:[created@month,group]
    query:(created:"first day of this month -1 year")
    format:timeseries


Chart:



data:
  type: bar
  series:
    tickets:
      x_key: ts
  stacks:
    0@csv: tickets

axis:
  x:
    type: timeseries
    tick:
      format: %B '%y

tooltip:
  grouped@bool: no


Timeseries: Line comparison of contact methods

Datasets:



dataQuery/calls:
  query@text:
    type:worklist.subtotals
    of:call
    by:[created@year]
    format: timeseries

dataQuery/tasks:
  query@text:
    type:worklist.subtotals
    of:task
    by:[created@year]
    format: timeseries

dataQuery/tickets:
  query@text:
    type:worklist.subtotals
    of:ticket
    by:[created@year]
    query:(status:!d)
    format: timeseries


Chart:



data:
  type: line
  series:
    tickets:
      x_key: ts
      name: Tickets
    tasks:
      x_key: ts
      name: Tasks
    calls:
      x_key: ts
      name: Calls

axis:
  x:
    type: timeseries
    tick:
      format: %Y

tooltip:
  grouped@bool: no


Pie: Tickets created this year by bucket

Datasets:



dataQuery/tickets:
  query@text:
    type:worklist.subtotals
    of:ticket
    by.count:[group_bucket]
    query:(created:"this year")
    format:pie


Chart:



data:
  type: pie
  series:
    tickets:


Donut: Contact methods

Datasets:



dataQuery/calls:
  query@text:
    type:worklist.metrics
    values.calls:(
      of:call
      function:count
      field:id
      query:()
    )
    format: pie

dataQuery/tasks:
  query@text:
    type:worklist.metrics
    values.tasks:(
      of:task
      function:count
      field:id
      query:()
    )
    format: pie

dataQuery/tickets:
  query@text:
    type:worklist.metrics
    values.tickets:(
      of:ticket
      function:count
      field:id
      query:(status:!d)
    )
    format: pie


Chart:



data:
  type: donut
  series:
    calls:
      name: # Calls
    tasks:
      name: # Tasks
    tickets:
      name: # Tickets