Redmine Dashboards
DashboardsPainéis construídos a partir das consultas guardadas que já tem — uma grelha de arrastar e largar com mosaicos de indicadores, tabelas e quinze tipos de gráfico, agregados em SQL e limitados àquilo que quem está a ver tem permissão para ver.
Vários servidores: $399

- Tipos de widget
- 23
- Variantes de gráfico
- 15
- Redmine
- 4 · 5 · 6 · 7
- Bases de dados
- MySQL, MariaDB, PostgreSQL
- Alterações ao núcleo
- Nenhuma
Construção por arrastar e largar
Uma grelha redimensionável e reordenável que se guarda sozinha enquanto trabalha. Disponha indicadores, gráficos e tabelas até o painel contar aquilo que precisa, sem ficheiro de layout e sem recarregar a página.
Quinze tipos de gráfico
Barras, barras horizontais, barras empilhadas, linha, multilinha, área, circular, anel, radar, polar, manómetro, funil, mapa de calor, treemap e anel de progresso — desenhados com Apache ECharts, em claro e em escuro.
As suas consultas guardadas, em imagem
Aponte um widget a uma consulta guardada e ele herda esse filtro, incluindo campos personalizados, observadores e subprojectos. Ou transforme a consulta num painel inteiro com um clique.
Agregado em SQL
GROUP BY, COUNT, SUM e AVG correm na base de dados, por isso cem mil tarefas são contadas e não instanciadas. Os resultados ficam em cache por utilizador, widget e filtros activos.
Ajustado a quem está a ver
Cada leitura parte de Issue.visible(user), TimeEntry.visible(user) e Query.visible(user), pelo que nenhum gráfico consegue somar um projecto de que quem o lê não é membro.
Filtros, actualização e detalhe
Uma barra de filtros reenquadra o painel inteiro, um intervalo por painel mantém um ecrã de parede actualizado, e cada barra, fatia e célula leva à lista de tarefas que está por trás.
Veja-o a funcionar dentro do Redmine
Todas as capturas de ecrã aqui vêm de uma instalação normal do Redmine 6 com o plugin colocado em plugins/. Os painéis ficam por baixo do cabeçalho e dos menus do próprio Redmine, porque é aí que correm.
Montar um painel


Widgets


Partilhar e alternar


A consulta já é o relatório
Nada aqui lhe pede para descrever os seus dados uma segunda vez. Filtre uma lista de tarefas como sempre fez, guarde-a, e essa consulta guardada passa a ser o âmbito que um widget agrega — exactamente a relação que o Redmine usa para desenhar a lista.
| Passo | O que faz | O que obtém |
|---|---|---|
| 1. Guardar uma consulta | Filtrar a lista de tarefas — campos personalizados, observadores, subprojectos — e carregar em Guardar | Uma consulta com nome, visível para aqueles com quem a partilhou |
| 2. Apontar-lhe um widget | Escolher essa consulta na janela do widget | Origem de dados e um agrupamento por omissão sensato, deduzidos por si |
| 3. Ou gerar o painel inteiro | Carregar em «A partir da consulta» | Um painel de mosaicos de indicadores e gráficos ligados a ela, num único pedido |
Configurado a partir de listas, não de SQL
Um widget é uma origem, uma dimensão, uma medida e uma agregação. Agrupe tarefas por estado, prioridade, tipo, responsável ou qualquer campo de data repartido em dias, semanas, meses ou anos; conte-as, some as horas estimadas ou faça a média do progresso. Ninguém na equipa escreve SQL para obter um gráfico — e como não há SQL para escrever, também não há consulta capaz de ultrapassar as permissões de quem a está a ler.

Cada widget configurado num único formulário
Todos os widgets, seja um indicador, uma barra ou um anel, configuram-se no mesmo formulário curto: um título e um tipo, uma origem de dados, uma consulta guardada opcional para os filtros, uma medida e um agrupamento com Top-N. Mude o tipo e o formulário adapta-se.




Uma única página de definições para administradores
Em Administração › Plugins › Redmine Charts define a cache de resultados por utilizador, o TTL da cache (5–86400 segundos, por omissão 300), o tema claro ou escuro por omissão e um intervalo de actualização automática por omissão, em que 0 a desliga. A página é o próprio ecrã de configuração de plugins do Redmine.
23 tipos de widget, e espaço para os seus
Cada tipo são metadados num registo, por isso a interface de configuração constrói-se a partir da declaração do próprio widget e não de um formulário escrito à mão para cada gráfico.
| Família | Tipos | Configurado com |
|---|---|---|
| Gráficos | Barras, barras horizontais, barras empilhadas, linha, multilinha, área, circular, anel, radar, polar, manómetro, funil, mapa de calor, treemap, anel de progresso | Origem, dimensão, medida, agregação |
| Indicador / número | Um único valor agregado, com filtro próprio | count · sum · avg · min · max |
| Tabela | Uma grelha paginada sobre os mesmos dados filtrados pelas permissões | Selector de colunas e filtros |
| Conteúdo | Markdown, notas, HTML, iframe, fluxo de actividade, tarefas recentes | Texto livre, ou um dos fluxos do próprio Redmine |
Desenhado com Apache ECharts
Quinze variantes, pensadas para claro e escuro, redesenhadas ao redimensionar e ainda legíveis num ecrã de parede. O bundle vem já compilado dentro do pacote, por isso instalar não exige Node nem passo de compilação.
Cada segmento desce ao detalhe
Carregar numa barra, numa fatia ou numa célula do mapa de calor abre a lista de tarefas do Redmine filtrada exactamente por essas. Os números continuam auditáveis, porque pode sempre aterrar nas linhas que estão por trás.
Filtros globais e actualização automática
Uma barra de filtros reenquadra todos os widgets do painel de uma só vez, e um intervalo de actualização por painel mantém actual o ecrã do corredor. Zero desliga a actualização.
Modelos e plantas
Guarde um painel como modelo reutilizável, duplique-o por equipa, ou exporte-o como planta JSON e importe-o noutra instância — de pré-produção para produção sem o reconstruir à mão.
Um plugin, um painel para cada equipa
Uma responsável de entregas, um serviço de apoio e um único programador montaram cada um destes em minutos, a partir de consultas guardadas que já tinham.





Duas origens incluídas, e a sua ao lado
Tarefas e tempo dedicado chegam com as suas dimensões e medidas já declaradas, ambas atrás dos âmbitos de visibilidade do Redmine. Uma origem acrescentada por outro plugin recebe tratamento idêntico.
| Origem | Dimensões | Medidas |
|---|---|---|
| Tarefas | Estado, prioridade, tipo, projecto, responsável, autor, categoria, versão, criação, actualização, data limite | Número de tarefas, horas estimadas, progresso |
| Tempo dedicado | Projecto, utilizador, actividade, data | Horas, número de registos |
| A sua | Aquilo que registar | Aquilo que registar |
Estender é registar, não remendar
Uma origem de dados é uma classe com um nome, as suas dimensões, as suas medidas e um base_scope filtrado pelas permissões; um tipo de widget é um hash. Registe qualquer um deles a partir do init.rb do seu próprio plugin com RedmineCharts.register_data_source ou register_widget_type e aparece de imediato na interface de configuração, herdando filtragem, cache e navegação ao detalhe. Para isso não se altera nada neste plugin.
Ninguém agrega aquilo que não pode ler
Um painel é uma forma rápida de deixar escapar um número, por isso cada leitura começa no âmbito de quem está a ver, em vez de terminar com uma verificação contra ele.
Primeiro a visibilidade, depois o agrupamento
Issue.visible(user), TimeEntry.visible(user) e Query.visible(user) restringem a relação antes de uma única linha ser contada. Um total vindo de um projecto de que não é membro não pode aparecer em widget nenhum, porque essas linhas nunca estiveram no conjunto.
Quatro permissões granulares
Ver painéis, criá-los, gerir todos e gerir modelos — cada uma atribuível por perfil. E tudo fica desligado até alguém activar o módulo Painéis para esse projecto.
Partilha através das participações
Conceda um painel a utilizadores, grupos, perfis ou projectos inteiros. Cada pedido volta a resolver viewable_by? e editable_by? pelas participações do próprio Redmine, e não por uma lista de acessos paralela que acaba por divergir.
Nada sai do servidor
O frontend só fala com a API JSON deste plugin, no seu próprio Redmine, usando a sessão e o token CSRF que já existem. Nenhum serviço externo, nenhuma chamada de licença, nenhuma telemetria.
Feito para aguentar uma instância grande
Contar cem mil tarefas não devia obrigar a carregar cem mil objectos. Aqui não obriga.
| Assunto | Como é resolvido |
|---|---|
| Agregação | GROUP BY, COUNT, SUM e AVG correm em SQL — as linhas nunca são instanciadas só para serem contadas |
| Dimensões muito largas | O dobrar Top-N mantém a resposta pequena quando uma dimensão tem milhares de valores |
| Visitas repetidas | Resultados em cache por utilizador, data de alteração do widget e filtros activos através da Rails.cache; o TTL é uma definição e o Redis funciona tal como está |
| Um widget lento | Os widgets carregam de forma independente, por isso uma consulta pesada nunca prende o painel inteiro |
| Bundle de JS em falta | O Rails desenha no servidor os dados de cada widget como recurso alternativo, por isso a página degrada-se em vez de ficar em branco |
Portável por desenho, não por acaso
O suporte a várias versões e bases de dados foi pensado de raiz — migrações, armazenamento JSON e agrupamento por datas foram todos escritos para resistir às diferenças.
| Aspecto | Suportado | Como |
|---|---|---|
| Redmine | 4.x, 5.x, 6.x, 7.x | Declara requires_redmine version_or_higher 4.0.0, sem substituições do núcleo que fiquem desactualizadas |
| Rails | 5.2 → 8.0 | As migrações apontam à base 5.2, que todas as versões até à 8.0 compreendem |
| Ruby | 2.5+ | Coincide com o requisito mínimo do Redmine 4 |
| Bases de dados | MySQL, MariaDB, PostgreSQL | O JSON vive em simples colunas text — DDL idêntico em todo o lado — com um serializador que escolhe a forma certa para cada versão do Rails |
| Agrupamento por datas | Dia, semana, mês, ano | Agrupa com um CAST(col AS DATE) portável e depois dobra em intervalos no Ruby — sem SQL específico de um fabricante |
| Voltar a correr migrações | Seguro | Escritas de forma defensiva, por isso uma actualização interrompida pode ser repetida |
Programável desde o primeiro dia
Cada endpoint vive em /redmine_charts/api, devolve JSON e aplica exactamente as permissões da interface — um painel pode assim ser criado a partir da CI ou gerado um por equipa.
| Método | Caminho | O que faz |
|---|---|---|
| GET | /dashboards | Todos os painéis visíveis para quem chama |
| POST | /dashboards | Criar um |
| GET | /dashboards/:id | Obter um painel com os seus widgets |
| PATCH | /dashboards/:id | Alterar nome, disposição ou definições |
| POST | /dashboards/:id/duplicate | Cloná-lo, widgets incluídos |
| GET | /dashboards/:id/export | Exportar uma planta JSON |
| POST | /dashboards/import | Criar um painel a partir de uma planta |
| POST | /dashboards/:id/widgets | Acrescentar um widget |
| GET | /widgets/:id/data | Dados do widget agregados e filtrados pelas permissões |
| GET | /meta/data_sources | Origens, dimensões, medidas e as consultas guardadas que pode usar |
O que vem hoje, e o que vem a seguir
Os itens do roteiro são aditivos por desenho — novas origens de dados, tipos de widget e serviços de exportação — por isso nenhum lhe irá pedir para migrar o que quer que seja. Aparecem como roteiro e não como funcionalidades, para que compre pelo que está hoje na caixa.
| Funcionalidade | Estado |
|---|---|
| Painéis: criar, duplicar, definir por omissão, exportar e importar | Disponível |
| Grelha redimensionável de arrastar e largar, com gravação automática | Disponível |
| Indicador, tabela e o conjunto completo de gráficos ECharts | Disponível |
| Configuração visual de widgets sem SQL | Disponível |
| Reutilização de consultas guardadas e geração de painéis com um clique | Disponível |
| Filtros globais que actualizam o painel inteiro | Disponível |
| Navegação ao detalhe do gráfico para a lista de tarefas | Disponível |
| Agregação SQL e cache por utilizador, filtradas pelas permissões | Disponível |
| Partilha, modelos, temas claro e escuro | Disponível |
| Várias versões, várias bases de dados, recurso alternativo no servidor | Disponível |
| Exportação para PDF, PNG e Excel | Planeado |
| Tarefas em segundo plano para relatórios muito pesados | Planeado |
| Actualização em directo por WebSocket | Planeado |
| Instantâneos agendados e enviados por e-mail | Planeado |
| Modo quiosque / ecrã de parede | Planeado |
| Criador de relatórios com IA em linguagem natural | Planeado |
| Widgets de calendário, burndown e resumo de Gantt | Planeado |
Instalação em três passos
Requer acesso por shell e a possibilidade de executar tarefas rake. Faça sempre uma cópia de segurança antes de instalar uma extensão.
cd /path/to/redmine # unzip the package from your email or download link unzip redmine_charts-1.0.0.zip -d plugins/ bundle install
bundle exec rake redmine:plugins:migrate NAME=redmine_charts RAILS_ENV=production # optional: the built-in dashboard templates bundle exec rake redmine_charts:seed_templates RAILS_ENV=production touch tmp/restart.txt
# Project → Settings → Modules → Charts & Dashboards # then grant the dashboard permissions to the roles that need them # a Dashboards entry appears in the top menu for anyone who holds one
Altera ou substitui ficheiros do núcleo do Redmine?
Preciso de Node.js ou de um passo de compilação para instalar?
As minhas consultas guardadas vão funcionar, mesmo as complicadas?
Alguém pode ver números de um projecto a que não tem acesso?
Que bases de dados são suportadas?
Em que versões de Redmine e Rails corre?
Podemos acrescentar origens de dados ou tipos de gráfico nossos?
O que fica de fora da versão 1.0 de propósito?
Preços
Um servidor
Uma instância do Redmine · utilizadores ilimitados · 12 meses de atualizações.
Vários servidores
Servidores Redmine ilimitados · utilizadores ilimitados · 12 meses de atualizações.