govau/performance-dashboard

View on GitHub
app/admin/data_row.rb

Summary

Maintainability
A
45 mins
Test Coverage
ActiveAdmin.register DataRow do
  decorate_with DataRowDecorator
  permit_params :row_label, :row_date, :values, :data_table_id
  after_create :save_values

  filter :data_table_id, as: :select
  filter :row_date

  show do 
    attributes_table do
      row :id
      row :dashboard
      row :row_label
      row :data_table_id do |data_row|
        data_row.data_table_id
      end
      row 'Widget(s)' do |data_row| 
        ul do 
          data_row.relevant_widgets.each do |w|
            li do 
              w.name
            end
          end
        end      
      end
      row :row_date
      row :values do |data_row|
        ul do 
          data_row.pretty_values.each do |k, v|
            li do 
              strong do 
                "#{k}:"
              end
              span do 
                v 
              end
            end
          end
        end
      end
    end
  end

  index do
    selectable_column
    column :id
    column :dashboard 
    column :row_label
    column 'Widget(s)' do |data_row| 
      ul do 
        data_row.relevant_widgets.each do |w|
          li do 
            w.name
          end
        end
      end      
    end
    column :row_date
    column :values do |data_row|
      ul do 
        data_row.pretty_values.each do |k, v|
          li do 
            strong do 
              "#{k}:"
            end
            span do 
              v 
            end
          end
        end
      end
    end
    actions
  end

  form do |f|
    f.inputs 'Data row' do
      f.input :row_label, as: :string
      f.input :data_table_id
      f.input :row_date
      f.input :values, input_html: { value: resource.values.to_json }
    end
    f.actions
  end

  controller do
    def update(options={}, &block)
      if values = parse_values 
        values.each do |k, v|
          resource.set_value_for k, v
        end

        super
      end
    end

    def create(options={}, &block)
      if @values = parse_values
        super
      end
    end

    def save_values(row)
      if @values.present?
        @values.each do |k, v|
          row.set_value_for k, v
        end
      end

      row.save!
    end

    def parse_values
      if params.dig(:data_row, :values).present?
        begin
          return JSON.parse params[:data_row].delete :values
        rescue JSON::ParserError => e
          redirect_to edit_admin_data_row_path(resource),
            alert: "Invalid JSON structure. Details: #{e.message}"
        end
      else
        redirect_to edit_admin_data_row_path(resource),
          alert: 'No values supplied!'
      end
    end
  end
end