ja·ne·la

gem, Ruby. Uma janela, é claro.

Dashboards com filtro cruzado, nativos do Rails.

Declare medidas e dimensões nos seus modelos ActiveRecord. Clique em qualquer valor e o dashboard inteiro se ajusta em volta dele. Sem data warehouse, sem front-end separado, sem painel administrativo remendado ao lado.

Abrir o dashboard ao vivo Ler o código

gem "janela", "~> 0.16"

Livre e de código aberto, rodando a versão 0.16.1 aqui mesmo.

Este aqui é ao vivo. Clique numa barra.

Alguns painéis sobre um ano de pedidos de demonstração. Clicar num valor filtra os outros e põe o filtro na URL, então um dashboard filtrado é um link que você pode enviar. Segure Ctrl, ou Cmd no Mac, para selecionar mais de um valor. Esc limpa. Nada aqui é um vídeo.

Revenue $660.823,69

Revenue by Status
Revenue by Region
$277.451,70
$213.135,26
$170.236,73
Orders by Status
paid: 410 pending: 103 refunded: 63 cancelled: 24
410
103
63
24
Revenue by Placed on per week

Esse dashboard são algumas linhas numa tabela do banco de dados. Ninguém fez deploy para criá-lo, e você pode editá-lo agora mesmo.

O dashboard completo tem nove painéis, incluindo uma série temporal e um top cinco. As páginas do próprio Janela oferecem um índice e um editor que não precisam de JavaScript nenhum.

Por que ele existe

Toda opção de business intelligence para Rails hoje é uma de duas coisas.

Nenhuma das duas deixa você clicar num gráfico e reajustar todos os outros da página. É essa a parte pela qual as pessoas compram uma ferramenta comercial, e é a parte que o Janela faz.

O que você recebe

Medidas e dimensões

Declaradas no modelo, num bloco que quem programa Rails lê de uma só vez. Não é uma nova linguagem de consulta.

Filtro cruzado

Turbo Frames e um único controlador Stimulus. Você não escreve JavaScript, e não há sockets nem streams para manter rodando.

Todo painel é uma URL

/dashboards/orders/revenue/status?as=bar é um painel inteiro. Dá para abrir, linkar e cachear.

Um dashboard pode ser dado

Componha em ERB, ou deixe quem analisa e não faz deploy montar um a partir de registros, só com HTML.

Instantâneos

Congele os números num instante para que o público veja exatamente o que foi aprovado, enquanto o dashboard ao vivo segue se movendo.

A sua autorização

Toda consulta passa pelo seu próprio policy_scope. O Janela não traz tenancy própria e pergunta antes de ler.

Ele inteiro

Declare uma vez no modelo, depois ponha painéis onde quiser.

class Order < ApplicationRecord
  belongs_to :customer

  janela do
    measure :revenue, sum: :amount, prefix: "$"
    measure :orders, count: true

    dimension :status
    dimension :region, through: :customer
    dimension :placed_on, granularity: :month
  end
end
<%= janela_frame do %>
  <%= janela_pane Order, :revenue %>
  <%= janela_pane Order, :revenue, by: :status, as: :bar %>
  <%= janela_pane Order, :revenue, by: :region %>
<% end %>

Adicione a gem, monte o engine, registre dois controladores Stimulus. Essa é a instalação.

Feito para virar fork

Licença MIT e pequeno de propósito. O Janela entrega a parte que sustenta uma ferramenta de business intelligence e para por aí. Os cinco por cento restantes de cada pessoa são diferentes, então o projeto fica legível o bastante para que desmontá-lo seja um jeito normal de usá-lo, e não último recurso. Cada decisão está registrada como um ADR, para você ler por que uma peça existe antes de mudá-la.

Código no GitHub As decisões

Perguntas

Preciso de um data warehouse?

Não. O Janela consulta o seu banco de dados pelo ActiveRecord e não guarda dados por conta própria. Se depois você colocar os dados de relatório num armazenamento colunar, uma medida continua sendo uma medida.

Ele respeita a minha autorização?

Sim, e sem configuração. Se o seu controller define policy_scope, todo painel é calculado por ele, inclusive os que alguém compôs. Há um guia para aplicações multi tenant.

Preciso de uma etapa de build de JavaScript?

Não. Com importmap, o engine fixa o que precisa. Com esbuild ou bun há um pacote npm com os mesmos dois controladores. Os gráficos usam Chart.js e mais nada.

Quem não faz deploy consegue montar um dashboard?

Consegue. Um dashboard é um registro, então as páginas do próprio engine deixam a pessoa adicionar painéis, reordená-los e definir a grade, só com HTML simples. Ela só escolhe medidas e dimensões que os seus modelos já declararam.

Está pronto?

É um alfa na versão 0.16.1, usado em aplicações reais e coberto por testes unitários e de navegador real. Mudanças que quebram são comunicadas num guia de atualização e numa tarefa janela:doctor que lê a sua aplicação e diz o que mudar.

Por que o nome Janela?

Porque uma janela tem frames e panes, quadros e painéis, e é daí que vem o resto do vocabulário da gem. Nenhuma dessas palavras é algo que a sua aplicação provavelmente vá querer para si, e é esse o ponto.