diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index dd463d4a..a48146ee 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -115,21 +115,4 @@ class ApplicationController < ActionController::Base redirect_to request.url.gsub('.co/', '.com/'), allow_other_host: true, status: :moved_permanently end - - def date_range(key) - p = params.permit(key => %i[from to]).fetch(key, {}) - timezone = ActiveSupport::TimeZone[current_account.timezone] || Time.zone - start_date = timezone.parse(p[:from]) if p[:from].present? - end_date = timezone.parse(p[:to]) if p[:to].present? - - if start_date.present? && end_date.present? && start_date < end_date - start_date..end_date - elsif start_date.present? && end_date.present? && start_date == end_date - start_date.beginning_of_day..end_date.end_of_day - elsif start_date.present? - start_date.. - elsif end_date.present? - ..end_date - end - end end diff --git a/app/controllers/submissions_archived_controller.rb b/app/controllers/submissions_archived_controller.rb index d0e6d764..c13745ff 100644 --- a/app/controllers/submissions_archived_controller.rb +++ b/app/controllers/submissions_archived_controller.rb @@ -9,7 +9,14 @@ class SubmissionsArchivedController < ApplicationController .or(@submissions.where.not(templates: { archived_at: nil })) .preload(:created_by_user, template: :author) @submissions = Submissions.search(@submissions, params[:q], search_template: true) + @submissions = Submissions::Filter.call(@submissions, current_user, params) - @pagy, @submissions = pagy(@submissions.preload(:submitters).order(id: :desc)) + @submissions = if params[:completed_at_from].present? || params[:completed_at_to].present? + @submissions.order(Submitter.arel_table[:completed_at].maximum.desc) + else + @submissions.order(id: :desc) + end + + @pagy, @submissions = pagy(@submissions.preload(submitters: :start_form_submission_events)) end end diff --git a/app/controllers/submissions_dashboard_controller.rb b/app/controllers/submissions_dashboard_controller.rb index aa17b5c4..164e893a 100644 --- a/app/controllers/submissions_dashboard_controller.rb +++ b/app/controllers/submissions_dashboard_controller.rb @@ -11,10 +11,17 @@ class SubmissionsDashboardController < ApplicationController .preload(:created_by_user, template: :author) @submissions = Submissions.search(@submissions, params[:q], search_template: true) + @submissions = Submissions::Filter.call(@submissions, current_user, params) @submissions = @submissions.pending if params[:status] == 'pending' @submissions = @submissions.completed if params[:status] == 'completed' - @pagy, @submissions = pagy(@submissions.preload(submitters: :start_form_submission_events).order(id: :desc)) + @submissions = if params[:completed_at_from].present? || params[:completed_at_to].present? + @submissions.order(Submitter.arel_table[:completed_at].maximum.desc) + else + @submissions.order(id: :desc) + end + + @pagy, @submissions = pagy(@submissions.preload(submitters: :start_form_submission_events)) end end diff --git a/app/controllers/submissions_filters_controller.rb b/app/controllers/submissions_filters_controller.rb new file mode 100644 index 00000000..bd5eae1e --- /dev/null +++ b/app/controllers/submissions_filters_controller.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class SubmissionsFiltersController < ApplicationController + ALLOWED_NAMES = %w[ + author + completed_at + created_at + ].freeze + + skip_authorization_check + + def show + return head :not_found unless ALLOWED_NAMES.include?(params[:name]) + + render params[:name] + end +end diff --git a/app/controllers/templates_archived_submissions_controller.rb b/app/controllers/templates_archived_submissions_controller.rb index e0bdca25..bf023677 100644 --- a/app/controllers/templates_archived_submissions_controller.rb +++ b/app/controllers/templates_archived_submissions_controller.rb @@ -7,8 +7,15 @@ class TemplatesArchivedSubmissionsController < ApplicationController def index @submissions = @submissions.where.not(archived_at: nil) @submissions = Submissions.search(@submissions, params[:q], search_values: true) + @submissions = Submissions::Filter.call(@submissions, current_user, params) - @pagy, @submissions = pagy(@submissions.preload(:submitters).order(id: :desc)) + @submissions = if params[:completed_at_from].present? || params[:completed_at_to].present? + @submissions.order(Submitter.arel_table[:completed_at].maximum.desc) + else + @submissions.order(id: :desc) + end + + @pagy, @submissions = pagy(@submissions.preload(submitters: :start_form_submission_events)) rescue ActiveRecord::RecordNotFound redirect_to root_path end diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb index 6b483df6..04d63e1c 100644 --- a/app/controllers/templates_controller.rb +++ b/app/controllers/templates_controller.rb @@ -4,51 +4,29 @@ class TemplatesController < ApplicationController load_and_authorize_resource :template before_action :load_base_template, only: %i[new create] - helper_method :created_at_range, :completed_at_range def show submissions = @template.submissions.accessible_by(current_ability) submissions = submissions.active if @template.archived_at.blank? submissions = Submissions.search(submissions, params[:q], search_values: true) + submissions = Submissions::Filter.call(submissions, current_user, params) @base_submissions = submissions submissions = submissions.pending if params[:status] == 'pending' submissions = submissions.completed if params[:status] == 'completed' - submissions = submissions.where(created_at: created_at_range) if created_at_range.present? - - if completed_at_range.present? - submissions = - Submission.from(submissions.completed - .joins(:submitters) - .select('submissions.*, max(completed_at) AS last_completed_at') - .group('submissions.id'), :submissions) - .where(last_completed_at: completed_at_range) - end - if params[:author].present? - submissions = - submissions.joins(:created_by_user) - .where("concat_ws(' ', NULLIF(users.first_name, ''), NULLIF(last_name, '')) = ?", params[:author]) - end + submissions = if params[:completed_at_from].present? || params[:completed_at_to].present? + submissions.order(Submitter.arel_table[:completed_at].maximum.desc) + else + submissions.order(id: :desc) + end - @pagy, @submissions = pagy(submissions.preload(submitters: :start_form_submission_events).order(id: :desc)) + @pagy, @submissions = pagy(submissions.preload(submitters: :start_form_submission_events)) rescue ActiveRecord::RecordNotFound redirect_to root_path end - def filter - return unless params[:filter] == 'author' - - submissions = @template.submissions.accessible_by(current_ability) - submissions = submissions.active if @template.archived_at.blank? - @creator_names = submissions.includes(:created_by_user) - .filter_map(&:created_by_user) - .map(&:full_name) - .uniq - .sort - end - def new @template.name = "#{@base_template.name} (#{I18n.t('clone')})" if @base_template end @@ -176,12 +154,4 @@ class TemplatesController < ApplicationController @base_template = Template.accessible_by(current_ability).find_by(id: params[:base_template_id]) end - - def created_at_range - @created_at_range ||= date_range(:created_at) - end - - def completed_at_range - @completed_at_range ||= date_range(:completed_at) - end end diff --git a/app/javascript/elements/set_date_button.js b/app/javascript/elements/set_date_button.js index f61543d7..409619de 100644 --- a/app/javascript/elements/set_date_button.js +++ b/app/javascript/elements/set_date_button.js @@ -1,17 +1,20 @@ export default class extends HTMLElement { connectedCallback () { - this.dateFrom = this.dataset.fromValue - this.dateTo = this.dataset.toValue - this.dateFromInput = document.getElementById(this.dataset.fromId) - this.dateToInput = document.getElementById(this.dataset.toId) - this.button.addEventListener('click', () => { - this.dateFromInput.value = this.dateFrom || '' - this.dateToInput.value = this.dateTo || '' + this.fromInput.value = this.dataset.fromValue || '' + this.toInput.value = this.dataset.toValue || '' }) } get button () { return this.querySelector('button') } + + get fromInput () { + return document.getElementById(this.dataset.fromId) + } + + get toInput () { + return document.getElementById(this.dataset.toId) + } } diff --git a/app/models/submission.rb b/app/models/submission.rb index 3972b6e5..e6aa35df 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -62,8 +62,11 @@ class Submission < ApplicationRecord through: :template, source: :documents_attachments scope :active, -> { where(archived_at: nil) } - scope :pending, -> { joins(:submitters).where(submitters: { completed_at: nil }).distinct } - scope :completed, -> { where.not(id: pending.select(:submission_id)) } + scope :pending, -> { joins(:submitters).where(submitters: { completed_at: nil }).group(:id) } + scope :completed, lambda { + where.not(Submitter.where(Submitter.arel_table[:submission_id].eq(Submission.arel_table[:id]) + .and(Submitter.arel_table[:completed_at].eq(nil))).select(1).arel.exists) + } enum :source, { invite: 'invite', diff --git a/app/views/shared/_search_input.html.erb b/app/views/shared/_search_input.html.erb index 3a003a19..5a6fae26 100644 --- a/app/views/shared/_search_input.html.erb +++ b/app/views/shared/_search_input.html.erb @@ -2,6 +2,11 @@ <% if params[:status].present? %> <% end %> + <% Submissions::Filter::ALLOWED_PARAMS.each do |key| %> + <% if params[key].present? %> + + <% end %> + <% end %> <% if params[:q].present? %>
<%= t('there_are_no_submissions') %>
- <% if @template.archived_at.blank? && params[:q].blank? %> + <% if @template.archived_at.blank? && params[:q].blank? && filter_params.blank? %><%= t('send_an_invitation_to_fill_and_complete_the_form') %>