import { createDirectus, rest, authentication, readDashboards, deleteDashboard, createDashboard, createPanel } from '@directus/sdk'; async function rebuildDashboards() { const url = 'http://localhost:8059'; const email = 'marc@mintel.me'; const password = 'Tim300493.'; console.log(`🚀 Rebuilding Dashboards: ${url}`); const client = createDirectus(url).with(authentication('json')).with(rest()); try { await client.login(email, password); console.log('✅ Authenticated'); // 1. Delete existing dashboard const oldDashboards = await client.request(readDashboards()); for (const db of oldDashboards) { console.log(`Deleting dashboard: ${db.name} (${db.id})`); await client.request(deleteDashboard(db.id)); } // 2. Create the "Intelligence" Dashboard const dashboard = await client.request(createDashboard({ name: 'Feedback Operational Intelligence', note: 'High-fidelity overview of user feedback and system status.', icon: 'analytics', color: '#000000' })); console.log(`Created Dashboard: ${dashboard.id}`); // 3. Add Panels (Grid is 24 units wide) // --- Row 1: Key Metrics --- // Total await client.request(createPanel({ dashboard: dashboard.id as string, name: 'Total Submissions', type: 'metric', width: 6, height: 4, position_x: 0, position_y: 0, options: { collection: 'visual_feedback', function: 'count', field: 'id', color: '#666666', icon: 'all_inbox' } })); // Open await client.request(createPanel({ dashboard: dashboard.id as string, name: 'Pending Action', type: 'metric', width: 6, height: 4, position_x: 6, position_y: 0, options: { collection: 'visual_feedback', function: 'count', field: 'id', filter: { status: { _eq: 'open' } }, color: '#FF0000', icon: 'warning' } })); // Type: Bug await client.request(createPanel({ dashboard: dashboard.id as string, name: 'Bugs Reported', type: 'metric', width: 6, height: 4, position_x: 12, position_y: 0, options: { collection: 'visual_feedback', function: 'count', field: 'id', filter: { type: { _eq: 'bug' } }, color: '#E91E63', icon: 'bug_report' } })); // Type: Feature await client.request(createPanel({ dashboard: dashboard.id as string, name: 'Feature Requests', type: 'metric', width: 6, height: 4, position_x: 18, position_y: 0, options: { collection: 'visual_feedback', function: 'count', field: 'id', filter: { type: { _eq: 'feature' } }, color: '#4CAF50', icon: 'lightbulb' } })); // --- Row 2: Trends and Distribution --- // Time series (Volume) await client.request(createPanel({ dashboard: dashboard.id as string, name: 'Feedback Volume (Last 30 Days)', type: 'chart-timeseries', width: 16, height: 10, position_x: 0, position_y: 4, options: { collection: 'visual_feedback', function: 'count', field: 'id', group: 'date_created', interval: 'day', show_marker: true, color: '#000000' } })); // Category distribution (Pie) await client.request(createPanel({ dashboard: dashboard.id as string, name: 'Type Distribution', type: 'chart-pie', width: 8, height: 10, position_x: 16, position_y: 4, options: { collection: 'visual_feedback', function: 'count', field: 'id', group: 'type', donut: true, show_labels: true } })); // --- Row 3: Details --- // Detailed List await client.request(createPanel({ dashboard: dashboard.id as string, name: 'Recent Feedback (High Priority)', type: 'list', width: 24, height: 10, position_x: 0, position_y: 14, options: { collection: 'visual_feedback', fields: ['user_name', 'type', 'text', 'status', 'date_created'], sort: ['-date_created'], limit: 10 } })); console.log('✅ Dashboard rebuilt successfully'); } catch (e: any) { console.error('❌ Rebuild failed:'); console.error(e.message); if (e.errors) console.error(JSON.stringify(e.errors, null, 2)); } } rebuildDashboards();