<% function renderSparkline(values, opts) { opts = opts || {}; var w = opts.w || 96; var h = opts.h || 28; if (!values || values.length < 2) return ''; var min = Math.min.apply(null, values); var max = Math.max.apply(null, values); var range = max - min || 1; var xStep = w / (values.length - 1); var pts = values.map(function(v, i) { return { x: (i * xStep).toFixed(1), y: (((max - v) / range) * (h - 4) + 2).toFixed(1) }; }); var linePath = pts.map(function(p, i) { return (i === 0 ? 'M' : 'L') + ' ' + p.x + ' ' + p.y; }).join(' '); var last = pts[pts.length - 1]; var areaPath = linePath + ' L ' + last.x + ' ' + h + ' L 0 ' + h + ' Z'; return ''; } %> <% if (ratings.length === 0) { %>

No players tracked yet.

<% } else { %> <% ratings.forEach(function(player, index) { const sparklineSvg = renderSparkline(player.monthlyHistory || []); %> <% }); %>
# Player Rating+ Δ since last update Predicted+ gap from today
<%= index + 1 %>
<%= player.name %> #<%= player.pdgaNumber %>
<% if (player.rating) { %>
<%= player.rating %> <%- include('delta-pill', { value: player.ratingChange }) %> <% if (sparklineSvg) { %><%- sparklineSvg %><% } %>
<% } else { %> Click to load <% } %>
<% if (player.predictedRating) { %>
<%= player.predictedRating %> <%- include('delta-pill', { value: player.deltaPredicted, extraClass: 'delta-predicted-pill' }) %> <% if (player.stdDev != null) { %>±<%= player.stdDev %><% } %>
<% } else { %> <% } %>
<%- include('player-history', { pdgaNumber: player.pdgaNumber, history: player.ratingHistory || [], player: player }) %>
<%- include('ratings-cards', { ratings: ratings }) %> <% } %>