class Formily::SubmittedDataTable

Helper class for display & convert submitted data

Public Class Methods

new(form, res) click to toggle source

@param form [Formily:Form] form object @param res [ActiveRecord::Base] related model

# File lib/formily/submitted_data_table.rb, line 8
def initialize(form, res)
  @form = form
  @headers = ['related'] + @form.inputs.pluck(:name) + ['date']
  @res = res
  @rows = []
  get_data
end

Public Instance Methods

headers() click to toggle source
# File lib/formily/submitted_data_table.rb, line 16
def headers
  @headers
end
rows() click to toggle source
# File lib/formily/submitted_data_table.rb, line 20
def rows
  @rows
end
to_csv() click to toggle source
# File lib/formily/submitted_data_table.rb, line 24
def to_csv
  CSV.generate do |csv|
    csv << (['index'] + @headers)
    @rows.each_with_index do |row, i|
      arr = ([i + 1] + row)
      csv << arr
    end
  end
end

Private Instance Methods

get_data() click to toggle source
# File lib/formily/submitted_data_table.rb, line 36
def get_data
  submits = @form.submits.includes(input_values: [{input: [:inputs, :group_input]}, :attach])
  submits = submits.where(resource_id: @res.id, resource_type: @res.class.name) if @res.present?

  submits.each do |s|
    row = []
    tmp = s.input_values.map do |i|
      if i.input.group_input_id
        {n: i.input.group_input.name, v: i.get_value} rescue {n: '', v: ''}
      else
        {n: i.input.name, v: i.get_value} rescue {n: '', v: ''}
      end
    end

    row << "#{s.resource_id}##{s.resource_type}"

    @headers[1..-2].each do |name|
      q = tmp.select{|x| x[:n] == name}

      if q.present?
        if q.length > 1
          row << q.map{|q1| q1[:v]}.join(', ')
        else
          row << q.first[:v]
        end

      else
        row << 'no data'
      end
    end

    row << s.created_at.strftime('%Y/%-m/%-d %H:%M (%Z)')

    @rows << row
  end
end