3scale/porta

View on GitHub
app/presenters/dashboard_widget_presenter.rb

Summary

Maintainability
A
0 mins
Test Coverage
class DashboardWidgetPresenter
  include ::Draper::ViewHelpers

  attr_reader :name, :params, :variables, :value, :previous_value, :percentual_change, :has_history, :current

  # TODO: clearly this should be just one attribute, and controllers should inject own structure
  attr_reader :chart, :items

  def initialize(name, params = {}, variables = {})
    @name = name
    @params = params.respond_to?(:permit!) ? params.dup.permit! : params
    @params = @params.transform_keys(&:to_sym)
    @variables = variables
    @data = nil
    @value = spinner
    @previous_value = nil
    @percentual_change = spinner
    @has_history = false
  end

  def render
    content = h.render(partial: template_name, locals: locals)
    content << h.render(partial: ajax_load, locals: locals) unless loaded? # trigger ajax refresh when not toggled
    content
  end

  def render_chart
    return unless chart

    h.render(partial: load_chart, locals: locals)
  end

  def url(params = self.params)
    h.polymorphic_url([:provider, :admin, :dashboard, name], params.symbolize_keys)
  end

  def path
    url(params.merge(routing_type: :path))
  end

  def current
    @current.try(:[], :formatted_value)
  end

  def id
    "dashboard-widget-#{params.to_h.to_a.join('-')}#{name}"
  end

  def template_name
    "provider/admin/dashboards/widgets/#{name}"
  end

  def ajax_load
    'provider/admin/dashboards/ajax_load'.freeze
  end

  def load_chart
    'provider/admin/dashboards/widgets/chart'.freeze
  end

  # @param data [Hash]
  def data=(data)
    @loaded = true
    @data = data
    @value = data.delete(:value)
    @previous_value = data.delete(:previous_value)
    @percentual_change = data.delete(:percentual_change)
    @chart = data.delete(:chart)
    @items = data.delete(:items)
    @current = data.delete(:current) || 0
    @has_history = data.delete(:has_history)
  end

  def loaded?
    !@loaded.nil?
  end

  def spinner
    h.content_tag(:i, ''.freeze, class: 'fa fa-spinner fa-spin fa-3x DashboardWidget-spinner'.freeze)
  end

  def locals
    { widget: self }.merge(variables)
  end
end