Skip to content

Extender el Data Dashboard ​

El Data Dashboard está diseñado para extenderse. Esta guía cubre los cuatro puntos de extensión principales: tipos de gráficos, exportadores, capacidades del motor de consultas y pestañas de panel.

Agregar nuevos tipos de gráficos ​

El renderizado de gráficos usa Chart.js. Para agregar un nuevo tipo de gráfico:

1. Registra el tipo de gráfico ​

En bundles/data-dashboard/panel/chart-renderer.js, agrega tu tipo al registro CHART_TYPES:

js
const CHART_TYPES = {
  bar: { label: 'Bar', icon: '...', minColumns: 2 },
  line: { label: 'Line', icon: '...', minColumns: 2 },
  pie: { label: 'Pie', icon: '...', minColumns: 2 },
  scatter: { label: 'Scatter', icon: '...', minColumns: 2 },
  // Agrega tu tipo:
  heatmap: { label: 'Heatmap', icon: '...', minColumns: 3 },
};

2. Agrega la lógica de renderizado ​

Agrega un case a la función buildChartConfig() que devuelva un objeto de configuración de Chart.js:

js
case 'heatmap':
  return {
    type: 'matrix',  // Requiere el plugin chartjs-chart-matrix
    data: {
      datasets: [{
        data: transformToMatrix(queryResults, options),
        // ...
      }]
    },
    options: { /* ... */ }
  };

3. Maneja el renderizado del lado del servidor ​

Si el tipo de gráfico requiere un plugin de Chart.js, agrégalo al renderizador de canvas del lado del servidor en chart-renderer.js:

js
import ChartjsMatrix from 'chartjs-chart-matrix';
Chart.register(ChartjsMatrix);

Agrega también el plugin a las dependencias del package.json en el directorio del bundle.

4. Actualiza la UI del panel ​

El selector de tipo de gráfico del panel se autopobla desde CHART_TYPES, así que no se necesitan cambios de UI a menos que tu tipo requiera campos de configuración personalizados.

Exportadores personalizados ​

Los exportadores convierten los resultados de consultas en formatos descargables. Integrados: CSV, JSON.

Agregar un exportador ​

Crea un módulo en bundles/data-dashboard/exporters/:

js
// bundles/data-dashboard/exporters/xlsx.js
export default {
  id: 'xlsx',
  label: 'Excel (.xlsx)',
  mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  extension: '.xlsx',

  async export(queryResults, options) {
    // queryResults.columns: string[]
    // queryResults.rows: object[]
    // Devuelve un Buffer
    const workbook = buildWorkbook(queryResults);
    return workbook.toBuffer();
  }
};

Regístralo en el registro de exportadores:

js
// bundles/data-dashboard/exporters/index.js
import xlsx from './xlsx.js';

export const exporters = [csv, json, xlsx];

El panel y las herramientas MCP detectan automáticamente los exportadores registrados.

Extender el motor de consultas ​

Agregar transformaciones de consultas ​

Las transformaciones de consultas modifican el SQL antes de su ejecución — útiles para agregar cláusulas LIMIT automáticas, registro de consultas o funciones personalizadas.

Agrega una transformación al pipeline en server.js:

js
const transforms = [
  addDefaultLimit,      // Agrega LIMIT 1000 si no hay un LIMIT presente
  logQueryExecution,    // Registra en el historial de consultas
  // Agrega la tuya:
  addCustomFunctions,   // Registra funciones SQL personalizadas
];

Cada transformación recibe la cadena SQL y el contexto de conexión, y devuelve el SQL (posiblemente modificado):

js
function addCustomFunctions(sql, context) {
  // Registra una función SQLite personalizada en la conexión
  context.db.function('geo_distance', (lat1, lon1, lat2, lon2) => {
    // Fórmula de Haversine
    return calculateDistance(lat1, lon1, lat2, lon2);
  });
  return sql;
}

Soportar nuevos tipos de bases de datos ​

El motor de consultas actualmente soporta backends SQLite. Para agregar soporte para PostgreSQL, MySQL u otras bases de datos:

  1. Crea un adaptador de driver en bundles/data-dashboard/drivers/
  2. Implementa la interfaz DatabaseDriver: connect(), execute(sql), getSchema(), close()
  3. Registra el tipo de driver en server.js

El campo type del backend de datos (establecido durante crow_register_backend) determina qué driver se usa.

Agregar pestañas de panel vía plugins ​

Los bundles de terceros pueden agregar pestañas al panel del Data Dashboard registrando un plugin de pestaña.

Estructura de un plugin de pestaña ​

Coloca un módulo en ~/.crow/bundles/<your-bundle>/dashboard-tabs/:

js
// ~/.crow/bundles/geo-tools/dashboard-tabs/map-tab.js
export default {
  id: 'map',
  label: 'Map',
  icon: '<svg>...</svg>',
  order: 50,  // Posición después de las pestañas integradas

  async render({ req, db, queryResults }) {
    // Devuelve una cadena HTML para el contenido de la pestaña
    return `
      <div id="map-container" style="height: 500px;"></div>
      <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
      <script>
        const map = L.map('map-container').setView([30, -95], 6);
        // ... renderiza los resultados de la consulta como marcadores
      </script>
    `;
  }
};

Los plugins de pestaña se detectan automáticamente cuando se instala el bundle padre. Aparecen en la barra de pestañas junto a las pestañas integradas.

Próximos pasos ​

Released under the MIT License.