Janela
Documentation Example Gallery Visits Vitral Dashboards The name Português
Documentation Example Gallery Visits Vitral Dashboards The name Português

Documentation

  • Overview
  • Vista
  • Multi tenancy
  • Charts and Their Options
  • Theming Janela
  • Composing a page
  • Agent tools
  • Every decision

Reference

  • Table
  • Bar chart
  • Line chart
  • Doughnut chart
  • Pie chart
  • Running total, more series
  • Vitral

Reference

Gallery

Every renderer Janela ships (table, bar, line, doughnut, and pie), drawn live against this demo's own data, with the declaration that produced it beside it. Built from nothing but janela_pane and what Janela exposes for exactly this: a time dimension can bucket by hour, day, week, month, quarter, and year, and a form offers 5, 10, 20, 50, 100 as a row limit, and a breakdown by a category can be ordered (desc, asc, label, and label_desc). Beside each pane is a control for every other option a pane takes: a chart's height (1 to 5), whether a bar shows its value, how prominent a single value is (1 to 3), and up to 3 companion columns on a table. Each appears only while the renderer chosen is one it changes, and the declaration rewrites itself to match, so it can be copied. This is a host page built from the gem's helpers, not one of the engine's own (ADR 027).

Table

Every row a query returns, as it is. Nothing else is drawn without a measure, so this is the one renderer every model can demonstrate.

Order

Declaration

janela_pane Order, :revenue

Page view

Declaration

janela_pane PageView, :views

Wholesale order

Declaration

janela_pane WholesaleOrder, :revenue

Bar chart

A measure compared across a categorical dimension: one bar per value, the shape for ranking or comparing a handful of groups.

Order

Declaration

janela_pane Order, :revenue, by: :status, as: :bar
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Page view

Declaration

janela_pane PageView, :views, by: :page, as: :bar
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Wholesale order

Declaration

janela_pane WholesaleOrder, :revenue, by: :status, as: :bar
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Line chart

A measure tracked over a time dimension, bucketed by whatever granularity that dimension offers.

Order

Declaration

janela_pane Order, :revenue, by: :placed_on, as: :line, granularity: :month
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Page view

Declaration

janela_pane PageView, :views, by: :viewed_on, as: :line, granularity: :month

Wholesale order

Declaration

janela_pane WholesaleOrder, :revenue, by: :placed_on, as: :line, granularity: :month
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Doughnut chart

A measure split across a categorical dimension as parts of a whole. Drawn as SVG with a legend of buttons, so it reads without JavaScript and every slice can be reached from the keyboard.

Order

Declaration

janela_pane Order, :revenue, by: :status, as: :doughnut
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Page view

Declaration

janela_pane PageView, :views, by: :page, as: :doughnut
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Wholesale order

Declaration

janela_pane WholesaleOrder, :revenue, by: :status, as: :doughnut
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Pie chart

The same split as a doughnut, without the hole. Best with a handful of values: past eight, the rest share one neutral colour.

Order

Declaration

janela_pane Order, :revenue, by: :status, as: :pie
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Page view

Declaration

janela_pane PageView, :views, by: :page, as: :pie
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Wholesale order

Declaration

janela_pane WholesaleOrder, :revenue, by: :status, as: :pie
Beside the label Up to three, drawn as columns in a table. A dimension shows a value only where every row of its group shares one.

Running total, more series

A line chart can read as a total to date, and carry up to three more series over the same months, each a line or bars on the left axis or a right one. Here orders placed and orders shipped are both to date, with orders per month as bars on the right.

Order

Declaration

janela_pane Order, :orders, by: :placed_on, as: :line, granularity: :month, cumulative: true, value_labels: true, series: [ { measure: :orders, by: :shipped_on, cumulative: true, title: "Orders shipped to date" }, { measure: :orders, as: :bar, axis: :right, title: "Orders per month" } ]

Set in the options a pane takes, not by a control here: Charts and Their Options says what each key does (ADR 062).

Janela

Cross-filtering dashboards, native to Rails. Janela is Portuguese for window, and a window has frames and panes, which is where the rest of the vocabulary comes from.

The project

2 stars 9,400 downloads

  • Source on GitHub
  • The gem
  • Open work

Why it is like this

  • Every decision
  • Multi tenancy
  • What changed

This demo

  • The full dashboard
  • Dashboards
  • Start over

Built by

  • Jay Killeen
  • VS Vanessa Soares
  • Claude

Agent authored contributions are reviewed the same as any other, on the merits of the diff rather than the source. The commit log says who wrote what.

MIT licensed, running 0.16.1. This demo is the test fixture from that repository with seed data, so what you click is what ships. Anything you change here is put back on the hour.

From the makers of Win on the Shelf © 2026 Retail Tasker