govau/performance-dashboard

View on GitHub
app/decorators/data_table_decorator.rb

Summary

Maintainability
A
45 mins
Test Coverage
class DataTableDecorator < Draper::Decorator
  delegate_all

  def summary    
    if data_rows.count > 1 && datasets.count == 1 # Only for sparklines
      date = previous.row_date.to_formatted_s :month_year

      if trending?
        "#{trend.capitalize} by #{format(difference)} since #{date}"
      else
        "#{trend.capitalize} since #{date}"
      end
    end
  end

  #TODO find a way of DRYing this up, copy-pasted just to use 
  def slices(widget, limit: 0)
    puts 'RUNNING SLICES METHOD IN DATA TABLE DECORATOR ++++++++++++++++++++++++++++++++++'

    # Jon todo: this needs to differentiate between custom and month slices, same as the data table class function
    # For custom rows which will probably have the same month date, return a new slice with one row for each

    arr = []

    if period_start = series_end&.beginning_of_month
      while (0 == limit || arr.size < limit) && period_start >= series_start&.beginning_of_month
        if s = slice_data(widget, 'month', period_start)
          arr << s          
        end

        period_start = period_start << 1
      end
    end

    arr.reverse
  end

  def slice_data(widget, period, period_start)
    object.slice_data(widget, period, period_start) ||
      fake_slice(widget, period, period_start)
  end

  def latest
    data_rows.by_time_desc.first
  end

  def previous
    data_rows.by_time_desc.second
  end

  def up?
    difference > 0
  end

  def down?
    !up?
  end

  def trending?
    difference != 0
  end

  def difference
    row_first_value(latest) - row_first_value(previous)
  end

  def trend
    if trending? 
      if up? 
        'up'
      else
        'down'
      end
    else
      'unchanged'
    end
  end

  private 

  def row_first_value(row)
    row.values&.first&.second&.to_f || 0
  end

  def fake_slice(widget, period, period_start)
    period_end = calculate_period_end period, period_start

    row = DataRow.new do |dr|
      dr.data_table = object
      dr.row_date = period_start
      dr.values = {}
    end

    rows = [row.decorate(context: {widget: widget})]

    groups = generate_groups rows

    Slice.new widget, period, period_start, period_end, groups, rows
  end
end