Structure of a Visualisation Script
May 29, 2025 ยท View on GitHub
The basic skeleton of a visualisation JavaScript file looks like this:
if (!visualisations) {
var visualisations = {};
}
//IIFE to prvide shared scope for sharing state and constants between the controller
//object and each grid cell object instance
(function(){
var d3 = window.d3;
var commonFunctions = visualisations.commonFunctions;
var commonConstants = visualisations.commonConstants;
var margins = commonConstants.margins();
//Instantiated by Stroom
visualisations.Sunburst = function(containerNode) {
//Stroom creates a new iFrame for each visualisation so
//create a div for the gridded visualisation to be built in
if (containerNode){
var element = containerNode;
} else {
var element = window.document.createElement("div");
}
this.element = element;
var grid = new visualisations.GenericGrid(this.element);
var width = commonFunctions.gridAwareWidthFunc(true, containerNode, element, margins);
var height = commonFunctions.gridAwareHeightFunc(true, containerNode, element, margins);
var color = commonConstants.categoryGoogle();
// Called by GenericGrid to create a new instance of the visualisation for each cell.
this.getInstance = function(containerNode) {
return new visualisations.Sunburst(containerNode);
};
//called by Stroom to pass snapshots of the data as it gathers the query results
//context - an object containing any shared context between Stroom and the visualisation,
// e.g. a common colour scale could be used between multiple visualisations
//settings - the object containing all the user configurable settings for the visualisation,
// e.g. showLabels, displayXAxis, etc.
//d - the object tree containing all the data. Always contains all data currently available
// for a query.
this.setData = function(context, settings, d) {
if (context) {
if (context.color) {
color = context.color;
} else {
context.color = color;
}
}
// Inspect settings here:
//Get grid to construct the grid cells and for each one call back into a
//new instance of this to build the visualisation in the cell
//The last array arg allows you to synchronise the scales of fields
grid.buildGrid(context, settings, d, this, commonConstants.transitionDuration, synchedFields);
}
//called by Stroom to instruct the visualisation to redraw itself in a resized container
this.resize = function() {
commonFunctions.resize(grid, update, element, margins, width, height);
};
// T
//Called by GenericGrid to establish which position in the values array
//(or null if it is the series key) is used for the legend.
this.getLegendKeyField = function() {
return null;
};
//called by GenericGrid to build/update a visualisation inside a grid cell
//context - an object containing any shared context between Stroom and the visualisation,
// e.g. a common colour scale could be used between multiple visualisations.
// Also can be used by the grid to pass state down to each cell
//settings - the object containing all the user configurable settings for the visualisation,
// e.g. showLabels, displayXAxis, etc.
//data - the object tree containing all the data for that grid cell. Always contains all data
// currently available for a query.
this.setDataInsideGrid = function(context, settings, data) {
// If the context already has a colour set then use it
if (context) {
visContext = context;
if (context.color) {
colour = context.color;
}
}
if (data) {
// Use data here (typically call update)
}
}
// Function to update the visualization
// duration - time ms length of transitions
// d - object tree of data
// settings - settings object
var update = function(duration, d, settings) {
// Add vis specific data manipulation here
}
// Used to provide the visualisation's D3 colour scale to the grid
this.getColourScale = function() {
return color;
};
};
}());