// Configuration
const config = {
dashboardIds: ['your-dashboard-id'], // Replace with your dashboard ID
apiEndpoint: '/api/guest-token',
supersetDomain: 'https://yourcompany.5x.co' // Your 5X BI domain
};
// Token Management
class TokenManager {
constructor() {
this.token = null;
this.tokenExpiry = null;
}
async getToken() {
if (!this.token || Date.now() > (this.tokenExpiry - 30000)) {
await this.refreshToken();
}
return this.token;
}
async refreshToken() {
const response = await fetch(config.apiEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
dashboardIds: config.dashboardIds
})
});
if (!response.ok) {
throw new Error('Failed to fetch guest token');
}
const data = await response.json();
this.token = data.guestToken;
this.tokenExpiry = Date.now() + (5 * 60 * 1000); // 5 minutes
}
}
// Dashboard Embedding
async function initializeDashboard() {
const tokenManager = new TokenManager();
const loadingIndicator = document.getElementById('loadingIndicator');
const errorMessage = document.getElementById('errorMessage');
const container = document.getElementById('dashboardContainer');
try {
loadingIndicator.style.display = 'block';
errorMessage.style.display = 'none';
const dashboard = await supersetEmbeddedSdk.embedDashboard({
id: config.dashboardIds[0],
supersetDomain: config.supersetDomain,
mountPoint: container,
fetchGuestToken: () => tokenManager.getToken(),
dashboardUiConfig: {
hideTitle: false,
filters: {
expanded: true
}
}
});
dashboard.on('render', () => {
loadingIndicator.style.display = 'none';
});
dashboard.on('error', (error) => {
errorMessage.textContent = `Error: ${error.message}`;
errorMessage.style.display = 'block';
loadingIndicator.style.display = 'none';
});
} catch (error) {
errorMessage.textContent = `Failed to load dashboard: ${error.message}`;
errorMessage.style.display = 'block';
loadingIndicator.style.display = 'none';
}
}
document.addEventListener('DOMContentLoaded', initializeDashboard);