Browse Source

replace bulk upload summary table placeholder

pull/1242/head
Phil Lee 3 years ago
parent
commit
b6c65e1dd6
  1. 25
      app/components/bulk_upload_error_summary_table_component.html.erb
  2. 17
      app/components/bulk_upload_error_summary_table_component.rb
  3. 3
      app/models/bulk_upload.rb
  4. 24
      app/views/bulk_upload_lettings_results/summary.html.erb
  5. 81
      spec/components/bulk_upload_error_summary_table_component_spec.rb
  6. 3
      spec/factories/bulk_upload_error.rb

25
app/components/bulk_upload_error_summary_table_component.html.erb

@ -0,0 +1,25 @@
<%= govuk_table do |table| %>
<% table.caption(size: "m", text: bulk_upload.filename) %>
<% table.head do |head| %>
<% head.row do |row| %>
<% row.cell(text: "Column", header: true) %>
<% row.cell(text: "Number of rows", header: true) %>
<% row.cell(text: "Question", header: true) %>
<% row.cell(text: "Error", header: true) %>
<% row.cell(text: "Specification", header: true) %>
<% end %>
<% end %>
<% table.body do |body| %>
<% sorted_errors.each do |error| %>
<% body.row do |row| %>
<% row.cell(text: error[0][0]) %>
<% row.cell(text: error[1]) %>
<% row.cell(text: BulkUpload::Lettings::Validator.question_for_field(error[0][1].to_sym)) %>
<% row.cell(text: error[0][2]) %>
<% row.cell(text: error[0][1]) %>
<% end %>
<% end %>
<% end %>
<% end %>

17
app/components/bulk_upload_error_summary_table_component.rb

@ -0,0 +1,17 @@
class BulkUploadErrorSummaryTableComponent < ViewComponent::Base
attr_reader :bulk_upload
def initialize(bulk_upload:)
@bulk_upload = bulk_upload
super
end
def sorted_errors
@sorted_errors ||= bulk_upload
.bulk_upload_errors
.group(:col, :field, :error)
.count
.sort_by { |el| el[0][0].rjust(3, "0") }
end
end

3
app/models/bulk_upload.rb

@ -3,7 +3,8 @@ class BulkUpload < ApplicationRecord
belongs_to :user belongs_to :user
has_many :bulk_upload_errors has_many :bulk_upload_errors, dependent: :destroy
has_many :lettings_logs has_many :lettings_logs
has_many :sales_logs has_many :sales_logs

24
app/views/bulk_upload_lettings_results/summary.html.erb

@ -9,29 +9,7 @@
</div> </div>
</div> </div>
<%= govuk_table do |table| %> <%= render BulkUploadErrorSummaryTableComponent.new(bulk_upload: @bulk_upload) %>
<% table.caption(size: "m", text: @bulk_upload.filename) %>
<% table.head do |head| %>
<% head.row do |row| %>
<% row.cell(text: "Column", header: true) %>
<% row.cell(text: "Number of rows", header: true) %>
<% row.cell(text: "Question", header: true) %>
<% row.cell(text: "Error", header: true) %>
<% row.cell(text: "Specification", header: true) %>
<% end %>
<% end %>
<% table.body do |body| %>
<% body.row do |row| %>
<% row.cell(text: "Bulbasaur") %>
<% row.cell(text: "Bulbasaur") %>
<% row.cell(text: "Bulbasaur") %>
<% row.cell(text: "Bulbasaur") %>
<% row.cell(text: "Bulbasaur") %>
<% end %>
<% end %>
<% end %>
<div class="govuk-grid-row"> <div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds"> <div class="govuk-grid-column-two-thirds">

81
spec/components/bulk_upload_error_summary_table_component_spec.rb

@ -0,0 +1,81 @@
require "rails_helper"
RSpec.describe BulkUploadErrorSummaryTableComponent, type: :component do
subject(:component) { described_class.new(bulk_upload:) }
let(:bulk_upload) { create(:bulk_upload) }
context "when no errors" do
it "does not renders any rows" do
result = render_inline(component)
expect(result).not_to have_selector("tbody tr")
end
end
context "when there are 2 independent errors" do
let!(:error_2) { create(:bulk_upload_error, bulk_upload:, col: "B", row: 2) }
let!(:error_1) { create(:bulk_upload_error, bulk_upload:, col: "A", row: 1) }
it "renders rows for each error" do
result = render_inline(component)
expect(result).to have_selector("tbody tr", count: 2)
end
it "renders rows by col order" do
result = render_inline(component)
order = result.css("tbody tr td:nth-of-type(1)").map(&:content)
expect(order).to eql(%w[A B])
end
it "render correct data" do
result = render_inline(component)
row_1 = result.css("tbody tr:nth-of-type(1) td").map(&:content)
expect(row_1).to eql([
"A",
"1",
BulkUpload::Lettings::Validator.question_for_field(error_1.field.to_sym),
error_1.error,
error_1.field,
])
row_2 = result.css("tbody tr:nth-of-type(2) td").map(&:content)
expect(row_2).to eql([
"B",
"1",
BulkUpload::Lettings::Validator.question_for_field(error_2.field.to_sym),
error_2.error,
error_2.field,
])
end
end
context "when there are 2 grouped errors" do
let!(:error_1) { create(:bulk_upload_error, bulk_upload:, col: "A", row: 1, field: "field_1") }
before do
create(:bulk_upload_error, bulk_upload:, col: "A", row: 2, field: "field_1")
end
it "renders 1 row combining the errors" do
result = render_inline(component)
expect(result).to have_selector("tbody tr", count: 1)
end
it "render correct data" do
result = render_inline(component)
row_1 = result.css("tbody tr:nth-of-type(1) td").map(&:content)
expect(row_1).to eql([
"A",
"2",
BulkUpload::Lettings::Validator.question_for_field(error_1.field.to_sym),
error_1.error,
error_1.field,
])
end
end
end

3
spec/factories/bulk_upload_error.rb

@ -4,7 +4,8 @@ FactoryBot.define do
factory :bulk_upload_error do factory :bulk_upload_error do
bulk_upload bulk_upload
row { rand(9_999) } row { rand(9_999) }
cell { "#{('A'..'Z').to_a.sample}#{row}" } col { ("A".."Z").to_a.sample }
cell { "#{col}#{row}" }
tenant_code { SecureRandom.hex(4) } tenant_code { SecureRandom.hex(4) }
property_ref { SecureRandom.hex(4) } property_ref { SecureRandom.hex(4) }
purchaser_code { SecureRandom.hex(4) } purchaser_code { SecureRandom.hex(4) }

Loading…
Cancel
Save