app/assets/js/components/queue.coffee (92 lines of code) (raw):

{div, ul, li, span, h4, svg, g, rect} = React.DOM Queues = React.createClass render: () -> (div { className: "row" }, [ (ul { className: "list-group" }, [(queue { q: q }) for q in @state.queues when localStorage.getItem(q.name) != 'off']) ]) getInitialState: () -> { queues: [] } updateFromServer: () -> $.ajax({ url: '/queues' success: ((result) -> @setState({ queues: result }) ).bind(this) }) setTimeout(@updateFromServer, 5000) componentDidMount: () -> @updateFromServer() Queue = React.createClass render: () -> (li {className: 'list-group-item list-group-item-condensed queue'}, [ (div {className: 'row'}, [ (h4 {className: 'col-md-3 queue-condensed'}, @props.q.name), (barChart { points: @props.q.approxQueueLength }) ]) ]) queue = React.createFactory(Queue) BarChart = React.createClass render: () -> (div { className: 'col-md-9' onMouseLeave: @hideToolTip }, [ (svg { className: 'queue-stats col-md-11' }, [ (g {}, [ (rect { x: @x()(datum.x) y: 20 - @y()(datum.y) height: @y()(datum.y) + 1 width: @rectWidth() onMouseEnter: @showToolTip.bind(this, datum) }) for datum in @props.points ]) ]) (div { style: { textAlign: 'right' } }, if (@props.points.length > 0) then [d3.format(',')(@props.points[@props.points.length - 1].y)]) if (@state.renderToolTip) then (div { style: { position: 'absolute' top: -30 left: @x()(@state.hoverDatum.x) backgroundColor: '#FFFFFF' border: '1px solid grey' padding: '2px' } }, [d3.time.format('%H:%M')(new Date(@state.hoverDatum.x)) + ' | ' + d3.format(' ,')(@state.hoverDatum.y)]) ]) getInitialState: () -> { width: 10 renderToolTip: false } rectWidth: () -> Math.max((@state.width / @props.points.length) - 1, 0) x: () -> d3.time.scale().range([0, @state.width - @rectWidth()]).domain(d3.extent(@props.points, (d) -> d.x)) y: () -> d3.scale.linear().range([0,20]).domain([d3.min([d3.min(@props.points, (d) -> d.y), 0]), d3.max(@props.points, (d) -> d.y)]) componentDidMount: () -> @deriveWidth() window.addEventListener('resize', @deriveWidth) deriveWidth: () -> svgNodeStyle = getComputedStyle(@getDOMNode().querySelector('svg')) padding = (style) -> parseInt(style.paddingLeft) + parseInt(style.paddingRight) @setState({ width: parseInt(svgNodeStyle.width) - padding(svgNodeStyle) }) showToolTip: (datum) -> @setState({ renderToolTip: true hoverDatum: datum }) hideToolTip: () -> @setState({ renderToolTip: false }) barChart = React.createFactory(BarChart) window.Queues = Queues