Team Roster in JavaScript
Using ApexCharts with JavaScript
This Team Roster example uses ApexCharts.js directly in JavaScript, with no wrapper component.
Install it with npm install apexcharts, then mount the chart with new ApexCharts(element, options).render().
// Per-unit data: every dot is ONE person, carrying its own name, role and
// (optionally) colour. The chart groups people by team; team leads get their
// own fillColor so a single dot stands out from its cluster. Hover any dot to
// read that individual's details, not the team aggregate. Shared by the
// vanilla-js, React and Vue builds.
var LEAD = '#FFAB00' // a lead's dot is tinted amber, overriding the team colour
var ROSTER = [
{
name: 'Engineering',
data: [
{ name: 'Ana Ruiz', role: 'Engineering Lead', fillColor: LEAD },
{ name: 'Ben Cho', role: 'Staff Engineer' },
{ name: 'Priya Nair', role: 'Senior Engineer' },
{ name: 'Marco Silva', role: 'Senior Engineer' },
{ name: 'Yuki Tanaka', role: 'Engineer' },
{ name: 'Sam Okoye', role: 'Engineer' },
{ name: 'Lena Fischer', role: 'Engineer' },
{ name: 'Diego Torres', role: 'Engineer' },
{ name: 'Hana Kim', role: 'Junior Engineer' },
{ name: 'Omar Haddad', role: 'Junior Engineer' },
],
},
{
name: 'Design',
data: [
{ name: 'Noa Levi', role: 'Design Lead', fillColor: LEAD },
{ name: 'Tom Beck', role: 'Senior Designer' },
{ name: 'Ivy Chen', role: 'Product Designer' },
{ name: 'Kofi Mensah', role: 'Product Designer' },
{ name: 'Sara Nowak', role: 'Designer' },
{ name: 'Leo Rossi', role: 'Designer' },
],
},
{
name: 'Sales',
data: [
{ name: 'Mara Vidal', role: 'Sales Lead', fillColor: LEAD },
{ name: 'Jon Park', role: 'Account Executive' },
{ name: 'Ella Brandt', role: 'Account Executive' },
{ name: 'Raj Mehta', role: 'Account Executive' },
{ name: 'Fay Duval', role: 'SDR' },
{ name: 'Cole Ward', role: 'SDR' },
{ name: 'Nia Abara', role: 'SDR' },
{ name: 'Theo Blanc', role: 'SDR' },
],
},
]
// Return the tooltip body for one hovered person: name on top, role beneath.
function rosterTooltip(o) {
if (!o.datum) return o.seriesName
return (
'<div style="font-weight:700">' +
o.datum.name +
'</div>' +
'<div style="opacity:0.7">' +
o.datum.role +
'</div>'
)
}
var options = {
series: ROSTER,
chart: {
type: 'unit',
height: 440,
animations: {
enabled: true,
speed: 700,
},
},
colors: ['#008FFB', '#00B8D9', '#36B37E'],
legend: {
show: false,
},
plotOptions: {
unit: {
layout: 'grouped',
spacing: 1.2,
clusterLabels: {
show: true,
// Team name + headcount, e.g. "Engineering (10)".
formatter: function (name, opts) {
return name + ' (' + opts.value + ')'
},
},
tooltip: {
// rosterTooltip lives in the shared head script.
formatter: rosterTooltip,
},
},
},
}
var chart = new ApexCharts(document.querySelector('#chart'), options)
chart.render()
// Nothing extra to wire: the chart renders from the options above. ROSTER and
// rosterTooltip live in the shared head script.