mirror of
https://github.com/we-promise/sure.git
synced 2026-04-09 15:24:48 +00:00
* Reindent TimeSeries classes * Fix spacing in time series tests * Remove trend tests where current is nil I think if we've gotten this far with a nil value for current, there's a data integrity problem. If we allow this, we'll have to be very defensive in our code. Best to raise and fix early. * Reindent Money class * Refactor TimeSeries artifacts * Use as_json in TimeSeries * Bring back tests for trends where current is nil * Bring back trend test * Correctly enumerate trend test * Use favorable_direction for trend_styles helper * Make trend public in TimeSeries::Value * Allow nil current values in trends I think I might've gotten it wrong before, nils might appear in trends if values are unavailable for snapshots * Clean up TimeSeries::Trend * Skip trend values same class validations if any values are nil * Refactor Money * Remove object parsing in TimeSeries::Value We're only every passing hashes * Refactor trendline chart controller into a time series chart controller * Replace trendline controller * Implement empty state * Port line-chart controller into time-series-chart * Split out methods * Group similar time series chart functionality * Fix indicator color * Fix empty state in time series chart * Replace line-chart controller with time-series-chart controller * Draw empty time series chart if less than 2 data points * Fix favorable direction serialization * Handle integers as well as money * Fix favorable direction serialization * Replace chart types with optional elements * Prevent double-renders when displaying turbo caches of time series charts * Remove ambiguities between time series and series data * Improve time series chart property names * Clean up tooltip template * Match tooltip designs * Apply trendline gradient * Implement trendline split behavior * Use same stroke width on all trend lines * Sort time series data by date * Support percentages * Use data color for guideline circles * Revert "Use data color for guideline circles" This reverts commit f239a1e00f84ae28e32f48315d67cf990e541a8a. * Use expected defaults for time series chart * Include day in time-series chart x-axis labels * favorableDirection -> favorable_direction * data -> datum where appropriate * Hide change data in tooltip for percentages
58 lines
1.2 KiB
Ruby
58 lines
1.2 KiB
Ruby
class TimeSeries
|
|
DIRECTIONS = %w[ up down ].freeze
|
|
|
|
attr_reader :values, :favorable_direction
|
|
|
|
def self.from_collection(collection, value_method)
|
|
collection.map do |obj|
|
|
{
|
|
date: obj.date,
|
|
value: obj.public_send(value_method),
|
|
original: obj
|
|
}
|
|
end.then { |data| new(data) }
|
|
end
|
|
|
|
def initialize(data, favorable_direction: "up")
|
|
@favorable_direction = (favorable_direction.presence_in(DIRECTIONS) || "up").inquiry
|
|
@values = initialize_values data.sort_by { |d| d[:date] }
|
|
end
|
|
|
|
def first
|
|
values.first
|
|
end
|
|
|
|
def last
|
|
values.last
|
|
end
|
|
|
|
def on(date)
|
|
values.find { |v| v.date == date }
|
|
end
|
|
|
|
def trend
|
|
TimeSeries::Trend.new \
|
|
current: last&.value,
|
|
previous: first&.value,
|
|
series: self
|
|
end
|
|
|
|
# `as_json` returns the data shape used by D3 charts
|
|
def as_json
|
|
{
|
|
values: values.map(&:as_json),
|
|
trend: trend.as_json,
|
|
favorable_direction: favorable_direction
|
|
}.as_json
|
|
end
|
|
|
|
private
|
|
def initialize_values(data)
|
|
[ nil, *data ].each_cons(2).map do |previous, current|
|
|
TimeSeries::Value.new **current,
|
|
previous_value: previous.try(:[], :value),
|
|
series: self
|
|
end
|
|
end
|
|
end
|