From f071ca6cb5ee4afe56ee88e71ed2ba5564336234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sen=C3=A9n=20Rodero=20Rodr=C3=ADguez?= Date: Wed, 8 May 2019 13:13:33 +0200 Subject: [PATCH] Create LocalCensusRecords index page * Create admin controller and routes * Add pagination * Add search by document_number * Add EN and ES translations * Add index specs * Add missing model specs --- .../admin/local_census_records_controller.rb | 8 ++ app/models/local_census_record.rb | 2 + .../_local_census_record.html.erb | 25 +++++++ .../_local_census_records.html.erb | 23 ++++++ .../admin/local_census_records/index.html.erb | 20 +++++ .../admin/local_census_records/index.js.erb | 1 + config/locales/en/admin.yml | 16 ++++ config/locales/es/admin.yml | 16 ++++ config/routes/admin.rb | 2 + .../admin/local_census_records_spec.rb | 75 +++++++++++++++++++ spec/models/local_census_record_spec.rb | 51 +++++++++++++ 11 files changed, 239 insertions(+) create mode 100644 app/controllers/admin/local_census_records_controller.rb create mode 100644 app/views/admin/local_census_records/_local_census_record.html.erb create mode 100644 app/views/admin/local_census_records/_local_census_records.html.erb create mode 100644 app/views/admin/local_census_records/index.html.erb create mode 100644 app/views/admin/local_census_records/index.js.erb create mode 100644 spec/features/admin/local_census_records_spec.rb create mode 100644 spec/models/local_census_record_spec.rb diff --git a/app/controllers/admin/local_census_records_controller.rb b/app/controllers/admin/local_census_records_controller.rb new file mode 100644 index 000000000..ded94c371 --- /dev/null +++ b/app/controllers/admin/local_census_records_controller.rb @@ -0,0 +1,8 @@ +class Admin::LocalCensusRecordsController < Admin::BaseController + load_and_authorize_resource + + def index + @local_census_records = @local_census_records.search(params[:search]) + @local_census_records = @local_census_records.page(params[:page]) + end +end diff --git a/app/models/local_census_record.rb b/app/models/local_census_record.rb index d275ec130..12e4d2795 100644 --- a/app/models/local_census_record.rb +++ b/app/models/local_census_record.rb @@ -3,4 +3,6 @@ class LocalCensusRecord < ApplicationRecord validates :document_type, presence: true validates :date_of_birth, presence: true validates :postal_code, presence: true + + scope :search, -> (terms) { where("document_number ILIKE ?", "%#{terms}%") } end diff --git a/app/views/admin/local_census_records/_local_census_record.html.erb b/app/views/admin/local_census_records/_local_census_record.html.erb new file mode 100644 index 000000000..e9fd12582 --- /dev/null +++ b/app/views/admin/local_census_records/_local_census_record.html.erb @@ -0,0 +1,25 @@ + + + <%= local_census_record.document_type %> + + + <%= local_census_record.document_number %> + + + <%= l local_census_record.date_of_birth %> + + + <%= local_census_record.postal_code %> + + + <%= link_to t("admin.actions.edit"), + edit_admin_local_census_record_path(local_census_record), + class: "button hollow" %> + + <%= link_to t("admin.actions.delete"), + admin_local_census_record_path(local_census_record), + method: :delete, + class: "button hollow alert", + data: { confirm: t("admin.actions.confirm") } %> + + diff --git a/app/views/admin/local_census_records/_local_census_records.html.erb b/app/views/admin/local_census_records/_local_census_records.html.erb new file mode 100644 index 000000000..d8549ab30 --- /dev/null +++ b/app/views/admin/local_census_records/_local_census_records.html.erb @@ -0,0 +1,23 @@ +<% if @local_census_records.any? %> +

<%= page_entries_info @local_census_records %>

+ + + + + + + + + + + + <%= render @local_census_records %> + +
<%= t("admin.local_census_records.index.document_type") %><%= t("admin.local_census_records.index.document_number") %><%= t("admin.local_census_records.index.date_of_birth") %><%= t("admin.local_census_records.index.postal_code") %><%= t("admin.actions.actions") %>
+ + <%= paginate @local_census_records %> +<% else %> +
+ <%= t("admin.local_census_records.index.no_local_census_records") %> +
+<% end %> diff --git a/app/views/admin/local_census_records/index.html.erb b/app/views/admin/local_census_records/index.html.erb new file mode 100644 index 000000000..616bc9693 --- /dev/null +++ b/app/views/admin/local_census_records/index.html.erb @@ -0,0 +1,20 @@ +

<%= t("admin.local_census_records.index.title") %>

+ +<%= link_to t("admin.local_census_records.index.create"), + new_admin_local_census_record_path, + class: "button float-right" %> + +
+ <%= form_tag admin_local_census_records_path, method: :get, remote: true do %> +
+ <%= text_field_tag :search, "", placeholder: t("admin.local_census_records.index.search.placeholder") %> +
+ <%= submit_tag t("admin.local_census_records.index.search.search"), class: "button" %> +
+
+ <% end %> +
+ +
+ <%= render "local_census_records" %> +
diff --git a/app/views/admin/local_census_records/index.js.erb b/app/views/admin/local_census_records/index.js.erb new file mode 100644 index 000000000..0e38d6f1b --- /dev/null +++ b/app/views/admin/local_census_records/index.js.erb @@ -0,0 +1 @@ +$("#local_census_records").html("<%= j render "local_census_records" %>"); diff --git a/config/locales/en/admin.yml b/config/locales/en/admin.yml index 74c854237..531b8c43f 100644 --- a/config/locales/en/admin.yml +++ b/config/locales/en/admin.yml @@ -1664,3 +1664,19 @@ en: progress_bars: index: title: "Progress bars" + local_census_records: + index: + title: Manage local census + create: Create new local census record + no_local_census_records: There are no local census records. + document_type: Document type + document_number: Document number + date_of_birth: Date of birth + postal_code: Postal code + search: + placeholder: Search by document number + search: Search + new: + creating: Creating new local census record + create: + notice: New local census record created successfully! diff --git a/config/locales/es/admin.yml b/config/locales/es/admin.yml index 6aebd1ae2..7982eb5ac 100644 --- a/config/locales/es/admin.yml +++ b/config/locales/es/admin.yml @@ -1662,3 +1662,19 @@ es: progress_bars: index: title: "Barras de progreso" + local_census_records: + index: + title: Gestionar censo local + create: Crear nuevo registro en el censo local + no_local_census_records: No hay registros de censo local + document_type: Tipo de documento + document_number: Número de documento + date_of_birth: Fecha de nacimiento + postal_code: Código postal + search: + placeholder: Búsqueda por número de documento + search: Buscar + new: + creating: Creando nuevo registro de censo local + create: + notice: ¡Nuevo registro de censo local creado correctamente! diff --git a/config/routes/admin.rb b/config/routes/admin.rb index 2b850a27d..557811a03 100644 --- a/config/routes/admin.rb +++ b/config/routes/admin.rb @@ -255,4 +255,6 @@ namespace :admin do put 'download_settings/:resource', to: 'download_settings#update', as: 'update_download_settings' get "/change_log/:id", to: "budget_investments#show_investment_log", as: "change_log" + + resources :local_census_records end diff --git a/spec/features/admin/local_census_records_spec.rb b/spec/features/admin/local_census_records_spec.rb new file mode 100644 index 000000000..4eae4440b --- /dev/null +++ b/spec/features/admin/local_census_records_spec.rb @@ -0,0 +1,75 @@ +require "rails_helper" + +feature "Admin local census records" do + + background do + login_as(create(:administrator).user) + end + + context "Index" do + let!(:local_census_record) { create(:local_census_record) } + + scenario "Should show empty message when no local census records exists" do + LocalCensusRecord.delete_all + visit admin_local_census_records_path + + expect(page).to have_content("There are no local census records.") + end + + scenario "Should show existing local census records" do + visit admin_local_census_records_path + + expect(page).to have_content(local_census_record.document_type) + expect(page).to have_content(local_census_record.document_number) + expect(page).to have_content(local_census_record.date_of_birth) + expect(page).to have_content(local_census_record.postal_code) + end + + scenario "Should show edit and destroy actions for each record" do + visit admin_local_census_records_path + + within "#local_census_record_#{local_census_record.id}" do + expect(page).to have_link "Edit" + expect(page).to have_link "Delete" + end + end + + scenario "Should show page entries info" do + visit admin_local_census_records_path + + expect(page).to have_content("There is 1 local census record") + end + + scenario "Should show paginator" do + create_list(:local_census_record, 25) + visit admin_local_census_records_path + + within ".pagination" do + expect(page).to have_link("2") + end + end + + context "Search" do + background do + create(:local_census_record, document_number: "X66777888" ) + end + + scenario "Should show matching records by document number at first visit" do + visit admin_local_census_records_path(search: "X66777888") + + expect(page).to have_content "X66777888" + expect(page).not_to have_content local_census_record.document_number + end + + scenario "Should show matching records by document number", :js do + visit admin_local_census_records_path + + fill_in :search, with: "X66777888" + click_on "Search" + + expect(page).to have_content "X66777888" + expect(page).not_to have_content local_census_record.document_number + end + end + end +end diff --git a/spec/models/local_census_record_spec.rb b/spec/models/local_census_record_spec.rb new file mode 100644 index 000000000..ef64ef19e --- /dev/null +++ b/spec/models/local_census_record_spec.rb @@ -0,0 +1,51 @@ +require "rails_helper" + +describe LocalCensusRecord do + let(:local_census_record) { build(:local_census_record) } + + context "validations" do + it "is valid" do + expect(local_census_record).to be_valid + end + + it "is not valid without document_number" do + local_census_record.document_number = nil + + expect(local_census_record).not_to be_valid + end + + it "is not valid without document_type" do + local_census_record.document_type = nil + + expect(local_census_record).not_to be_valid + end + + it "is not valid without date_of_birth" do + local_census_record.date_of_birth = nil + + expect(local_census_record).not_to be_valid + end + + it "is not valid without postal_code" do + local_census_record.postal_code = nil + + expect(local_census_record).not_to be_valid + end + end + + context "scopes" do + let!(:a_local_census_record) { create(:local_census_record, document_number: "AAAA") } + let!(:b_local_census_record) { create(:local_census_record, document_number: "BBBB") } + + context "search" do + it "filter document_numbers by given terms" do + expect(LocalCensusRecord.search("A")).to include a_local_census_record + expect(LocalCensusRecord.search("A")).not_to include b_local_census_record + end + + it "ignores terms case" do + expect(LocalCensusRecord.search("a")).to eq [a_local_census_record] + end + end + end +end