Components for displaying data summaries, providing user interaction controls, and creating dashboard elements beyond traditional charts.
Display widget showing the number of records selected out of total records in crossfilter.
/**
* Create a Data Count Widget
* @param {String|node|d3.selection} parent - DOM selector, element, or d3 selection
* @param {String} [chartGroup] - Chart group name for coordinated interactions
*/
class DataCount extends BaseMixin {
constructor(parent: string | Element | d3.Selection, chartGroup?: string);
/** Set/get crossfilter instance */
crossfilter(crossfilter?: any): any | DataCount;
/** Set/get groupAll accessor */
groupAll(groupAll?: any): any | DataCount;
/** Set/get HTML template */
html(htmlTemplate?: object): object | DataCount;
/** Set/get format numbers */
formatNumber(formatter?: Function): Function | DataCount;
}
/** Factory function for creating DataCount instances */
function dataCount(parent: string | Element | d3.Selection, chartGroup?: string): DataCount;Usage Example:
import { DataCount } from 'dc';
const dataCount = new DataCount('#data-count')
.crossfilter(cf)
.groupAll(cf.groupAll())
.html({
some: '<strong>%filter-count</strong> selected out of <strong>%total-count</strong> records',
all: 'All <strong>%total-count</strong> records selected. Click on charts to apply filters.'
});
dataCount.render();Sortable data table widget for displaying detailed record information with pagination.
/**
* Create a Data Table Widget
* @param {String|node|d3.selection} parent - DOM selector, element, or d3 selection
* @param {String} [chartGroup] - Chart group name for coordinated interactions
*/
class DataTable extends BaseMixin {
constructor(parent: string | Element | d3.Selection, chartGroup?: string);
/** Set/get table size (number of rows) */
size(size?: number): number | DataTable;
/** Set/get column definitions */
columns(columns?: (string | object)[]): (string | object)[] | DataTable;
/** Set/get sort function */
sortBy(sortFunction?: Function): Function | DataTable;
/** Set/get sort order */
order(order?: Function): Function | DataTable;
/** Set/get whether to show groups */
showGroups(show?: boolean): boolean | DataTable;
/** Set/get section function for grouping */
section(sectionFunction?: Function): Function | DataTable;
/** Begin new group */
beginSlice(start?: number): number | DataTable;
/** End group */
endSlice(end?: number): number | DataTable;
}
/** Factory function for creating DataTable instances */
function dataTable(parent: string | Element | d3.Selection, chartGroup?: string): DataTable;Usage Example:
import { DataTable } from 'dc';
const dataTable = new DataTable('#data-table')
.dimension(dateDimension)
.group(d => d.date.getFullYear())
.size(20)
.columns([
'date',
'category',
{
label: 'Amount',
format: d => d3.format('$,.2f')(d.amount)
}
])
.sortBy(d => d.date)
.order(d3.descending);
dataTable.render();Grid-based data display widget for showing data in a flexible grid layout.
/**
* Create a Data Grid Widget
* @param {String|node|d3.selection} parent - DOM selector, element, or d3 selection
* @param {String} [chartGroup] - Chart group name for coordinated interactions
*/
class DataGrid extends BaseMixin {
constructor(parent: string | Element | d3.Selection, chartGroup?: string);
/** Set/get grid size (number of items) */
size(size?: number): number | DataGrid;
/** Set/get HTML content function */
html(htmlFunction?: Function): Function | DataGrid;
/** Set/get HTML group function */
htmlGroup(htmlGroupFunction?: Function): Function | DataGrid;
/** Set/get sort function */
sortBy(sortFunction?: Function): Function | DataGrid;
/** Set/get sort order */
order(order?: Function): Function | DataGrid;
/** Begin slice for pagination */
beginSlice(start?: number): number | DataGrid;
/** End slice for pagination */
endSlice(end?: number): number | DataGrid;
}
/** Factory function for creating DataGrid instances */
function dataGrid(parent: string | Element | d3.Selection, chartGroup?: string): DataGrid;Large number display widget for showing single metric values with optional trend indicators.
/**
* Create a Number Display Widget
* @param {String|node|d3.selection} parent - DOM selector, element, or d3 selection
* @param {String} [chartGroup] - Chart group name for coordinated interactions
*/
class NumberDisplay extends BaseMixin {
constructor(parent: string | Element | d3.Selection, chartGroup?: string);
/** Set/get number format function */
formatNumber(formatter?: Function): Function | NumberDisplay;
/** Set/get HTML template */
html(htmlTemplate?: object): object | NumberDisplay;
/** Set/get value accessor */
valueAccessor(accessor?: Function): Function | NumberDisplay;
}
/** Factory function for creating NumberDisplay instances */
function numberDisplay(parent: string | Element | d3.Selection, chartGroup?: string): NumberDisplay;Usage Example:
import { NumberDisplay } from 'dc';
const numberDisplay = new NumberDisplay('#number-display')
.group(totalGroup)
.formatNumber(d3.format(',.0f'))
.valueAccessor(d => d.value)
.html({
one: '<span style="color: steelblue; font-size: 26px;">%number</span>',
some: '<span style="color: steelblue; font-size: 26px;">%number</span>',
none: '<span style="color: darkgray; font-size: 22px;">N/A</span>'
});
numberDisplay.render();Dropdown selection widget for filtering data by selecting values from a list.
/**
* Create a Select Menu Widget
* @param {String|node|d3.selection} parent - DOM selector, element, or d3 selection
* @param {String} [chartGroup] - Chart group name for coordinated interactions
*/
class SelectMenu extends BaseMixin {
constructor(parent: string | Element | d3.Selection, chartGroup?: string);
/** Set/get multiple selection */
multiple(multiple?: boolean): boolean | SelectMenu;
/** Set/get number format */
numberVisible(count?: number): number | SelectMenu;
/** Set/get option key accessor */
promptText(text?: string): string | SelectMenu;
/** Set/get option value accessor */
promptValue(value?: any): any | SelectMenu;
/** Set/get ordering function */
order(orderFunction?: Function): Function | SelectMenu;
}
/** Factory function for creating SelectMenu instances */
function selectMenu(parent: string | Element | d3.Selection, chartGroup?: string): SelectMenu;Checkbox menu widget for multi-select filtering with individual checkbox controls.
/**
* Create a Checkbox Menu Widget
* @param {String|node|d3.selection} parent - DOM selector, element, or d3 selection
* @param {String} [chartGroup] - Chart group name for coordinated interactions
*/
class CboxMenu extends BaseMixin {
constructor(parent: string | Element | d3.Selection, chartGroup?: string);
/** Set/get ordering function */
order(orderFunction?: Function): Function | CboxMenu;
/** Set/get prompt text */
promptText(text?: string): string | CboxMenu;
}
/** Factory function for creating CboxMenu instances */
function cboxMenu(parent: string | Element | d3.Selection, chartGroup?: string): CboxMenu;Usage Example:
import { CboxMenu } from 'dc';
const cboxMenu = new CboxMenu('#cbox-menu')
.dimension(categoryDimension)
.group(categoryGroup)
.order((a, b) => a.key.localeCompare(b.key))
.promptText('Select categories...');
cboxMenu.render();Text input widget for filtering data based on text search criteria.
/**
* Create a Text Filter Widget
* @param {String|node|d3.selection} parent - DOM selector, element, or d3 selection
* @param {String} [chartGroup] - Chart group name for coordinated interactions
*/
class TextFilterWidget extends BaseMixin {
constructor(parent: string | Element | d3.Selection, chartGroup?: string);
/** Set/get placeholder text */
placeHolderText(text?: string): string | TextFilterWidget;
/** Set/get whether to normalize text */
normalize(normalize?: Function): Function | TextFilterWidget;
}
/** Factory function for creating TextFilterWidget instances */
function textFilterWidget(parent: string | Element | d3.Selection, chartGroup?: string): TextFilterWidget;Usage Example:
import { TextFilterWidget } from 'dc';
const textFilter = new TextFilterWidget('#text-filter')
.dimension(textDimension)
.placeHolderText('Search...')
.normalize(text => text.toLowerCase());
textFilter.render();Many widgets use HTML templates with placeholder variables:
interface HTMLTemplate {
/** Template when no data matches filters */
none?: string;
/** Template when exactly one item matches */
one?: string;
/** Template when multiple items match */
some?: string;
/** Template when all items match (no filters) */
all?: string;
}
// Template variables:
// %total-count - Total number of records
// %filter-count - Number of filtered records
// %number - The actual value/numberDataTable columns can be strings (property names) or objects with formatting:
interface ColumnDefinition {
/** Column header label */
label: string;
/** Format function for cell values */
format: (d: any, row: any) => string;
}
// Example column definitions:
const columns = [
'name', // Simple property access
{
label: 'Formatted Date',
format: d => d3.timeFormat('%Y-%m-%d')(d.date)
},
{
label: 'Currency',
format: d => d3.format('$,.2f')(d.amount)
}
];DataTable and DataGrid support pagination through slice methods:
// Show records 0-19 (first page)
table.beginSlice(0).endSlice(20);
// Show records 20-39 (second page)
table.beginSlice(20).endSlice(40);
// Or use size() for simple pagination
table.size(20); // Show first 20 recordsinterface HTMLTemplate {
none?: string;
one?: string;
some?: string;
all?: string;
}
interface ColumnDefinition {
label: string;
format: (d: any, row: any) => string;
}
interface DataDisplayWidget extends BaseMixin {
size(size?: number): number | DataDisplayWidget;
sortBy(sortFunction?: Function): Function | DataDisplayWidget;
order(order?: Function): Function | DataDisplayWidget;
beginSlice(start?: number): number | DataDisplayWidget;
endSlice(end?: number): number | DataDisplayWidget;
}