From c5b4bd51108ba6fb570107d7f47558842da6ca03 Mon Sep 17 00:00:00 2001 From: alexdbondoc17 Date: Wed, 23 Feb 2022 06:28:36 +0000 Subject: [PATCH] Add UI for `reports` --- .../reports_search_results_component.rb | 47 +++++++++++++++++++ .../reports_search_results_component.html.erb | 40 ++++++++++++++++ .../sidenav_component.html.erb | 3 ++ app/controllers/concerns/doctrine_search.rb | 4 +- app/controllers/reports_controller.rb | 17 +++++++ .../controllers/reports_controller.js | 17 +++++++ app/reflexes/reports_reflex.rb | 10 ++++ .../reports/_search_results_table.html.erb | 12 +++++ app/views/reports/index.html.erb | 41 ++++++++++++++++ app/views/shared/_reports_pagination.html.erb | 15 ++++++ config/routes.rb | 2 + 11 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 app/components/reports_search_results_component.rb create mode 100644 app/components/reports_search_results_component/reports_search_results_component.html.erb create mode 100644 app/controllers/reports_controller.rb create mode 100644 app/javascript/controllers/reports_controller.js create mode 100644 app/reflexes/reports_reflex.rb create mode 100644 app/views/reports/_search_results_table.html.erb create mode 100644 app/views/reports/index.html.erb create mode 100644 app/views/shared/_reports_pagination.html.erb diff --git a/app/components/reports_search_results_component.rb b/app/components/reports_search_results_component.rb new file mode 100644 index 0000000..d5ac7e0 --- /dev/null +++ b/app/components/reports_search_results_component.rb @@ -0,0 +1,47 @@ +class ReportsSearchResultsComponent < BaseComponent + with_collection_parameter :search_result + attr_reader :search_result, :opts + + def initialize(search_result:, current_user:, opts: {}) + @search_result = search_result + @opts = opts + end + + delegate :id, to: :search_result + delegate :headnote, to: :search_result + delegate :subject_ids, to: :search_result + delegate :content, to: :search_result + delegate :annotations, to: :search_result + delegate :subjects, to: :search_result + delegate :doctrine_jurisprudences, to: :search_result + + def annotation_form_url + doctrine_annotations_path(doctrine_id: id) + end + + def subject_names + "(No Subjects Provided)" + end + + def jurisprudence + return nil if doctrine_jurisprudences.blank? + + doctrine_jurisprudences.first.jurisprudence + end + + def document_title(annotation) + return annotation.document.short_title if annotation.document.short_title.present? + + annotation.document.title + end + + def date_or_year(annotation) + return annotation.document.docdate.to_date.strftime("%B %d, %Y") if annotation.document.docdate.present? + + annotation.document.year + end + + def render? + opts[:is_render].present? + end +end diff --git a/app/components/reports_search_results_component/reports_search_results_component.html.erb b/app/components/reports_search_results_component/reports_search_results_component.html.erb new file mode 100644 index 0000000..287f910 --- /dev/null +++ b/app/components/reports_search_results_component/reports_search_results_component.html.erb @@ -0,0 +1,40 @@ + diff --git a/app/components/sidenav_component/sidenav_component.html.erb b/app/components/sidenav_component/sidenav_component.html.erb index 013d2a6..0c26096 100644 --- a/app/components/sidenav_component/sidenav_component.html.erb +++ b/app/components/sidenav_component/sidenav_component.html.erb @@ -107,6 +107,9 @@ + diff --git a/app/controllers/concerns/doctrine_search.rb b/app/controllers/concerns/doctrine_search.rb index ae10a13..ff23f14 100644 --- a/app/controllers/concerns/doctrine_search.rb +++ b/app/controllers/concerns/doctrine_search.rb @@ -5,9 +5,9 @@ module DoctrineSearch search = ::Doctrine.search do fulltext search_params[:q], fields: fulltext_fields if search_params[:q].present? - with(:subject_ids).any_of(search_params[:subject_ids]) if search_params[:subject_ids].present? + with(:subject_ids).any_of(search_params[:subject_ids].map(&:to_i)) if search_params[:subject_ids].present? - with(:user_ids).any_of(search_params[:user_ids]) if search_params[:user_ids].present? + with(:user_ids).any_of(search_params[:user_ids].map(&:to_i)) if search_params[:user_ids].present? if search_params[:created_at].present? with(:created_at).between(Date.parse(search_params[:created_at])..Time.zone.today.to_date) diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb new file mode 100644 index 0000000..47b63d5 --- /dev/null +++ b/app/controllers/reports_controller.rb @@ -0,0 +1,17 @@ +class ReportsController < ApplicationController + include DoctrineSearch + + def index + authorize! :display, Doctrine + + search = doctrine_search(search_params) + @results = search.results + @users = User.all + end + + private + + def search_params + params.permit(:created_at, :q, :page, :per_page, exclude_ids: [], subject_ids: [], user_ids: []) + end +end diff --git a/app/javascript/controllers/reports_controller.js b/app/javascript/controllers/reports_controller.js new file mode 100644 index 0000000..042d57f --- /dev/null +++ b/app/javascript/controllers/reports_controller.js @@ -0,0 +1,17 @@ +import ApplicationController from './application_controller' +export default class extends ApplicationController { + static targets = ["q", "headnote", "date_created"] + + connect () { + super.connect() + } + + search () { + var $search_box = $('.advanced-search-box'), + search_params = { q: this.qTarget.value, headnote: this.headnoteTarget.value, + subject_ids: $search_box.find("select[name='subject_ids[]']").val(), + user_ids: $search_box.find("select[name='user_ids[]']").val() } + + this.stimulate("ReportsReflex#render_search_results", search_params) + } +} diff --git a/app/reflexes/reports_reflex.rb b/app/reflexes/reports_reflex.rb new file mode 100644 index 0000000..fbfbbb9 --- /dev/null +++ b/app/reflexes/reports_reflex.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class ReportsReflex < ApplicationReflex + include DoctrineSearch + + def render_search_results(search_params) + search = doctrine_search(search_params.reject { |k, v| v.blank? }) + morph "div#searchResultsTable", render(partial: "search_results_table", locals: { search: search, current_user: current_user }) + end +end diff --git a/app/views/reports/_search_results_table.html.erb b/app/views/reports/_search_results_table.html.erb new file mode 100644 index 0000000..498f70a --- /dev/null +++ b/app/views/reports/_search_results_table.html.erb @@ -0,0 +1,12 @@ +<% if search.results.present? %> + <%= render(ReportsSearchResultsComponent.with_collection(search.results, current_user: current_user, opts: { is_render: true })) %> +<% else %> +
+
+ <%= image_pack_tag 'application/search-icon.png', class: "search-doc-icon"%> +
+ +
+<% end %> \ No newline at end of file diff --git a/app/views/reports/index.html.erb b/app/views/reports/index.html.erb new file mode 100644 index 0000000..4baedcd --- /dev/null +++ b/app/views/reports/index.html.erb @@ -0,0 +1,41 @@ +
+
+ +
+
+
<%= render PaginationComponent.new(data: @results, opts: { is_subject_breadcrums: true, subject_ids: params[:subject_ids] }) %>
+ <% if @results.present? %> + <%= render(ReportsSearchResultsComponent.with_collection(@results, current_user: current_user, opts: { is_render: true })) %> + <% else %> +
+
+ <%= image_pack_tag 'application/search-icon.png', class: "search-doc-icon"%> +
+ +
+ <% end %> +
+
diff --git a/app/views/shared/_reports_pagination.html.erb b/app/views/shared/_reports_pagination.html.erb new file mode 100644 index 0000000..ff3e030 --- /dev/null +++ b/app/views/shared/_reports_pagination.html.erb @@ -0,0 +1,15 @@ + diff --git a/config/routes.rb b/config/routes.rb index 0ecb35b..729b481 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,6 +25,8 @@ Rails.application.routes.draw do end end + resources :reports, only: %i[index] + namespace :api, defaults: { format: :json } do resources :doctrines do scope module: :doctrine do