From 0abe320c24f80e6fa07d5568387b8a4d42451d0c Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Tue, 30 Jun 2015 17:34:32 -0300 Subject: [PATCH] Refactor processed task filter --- app/controllers/my_profile/tasks_controller.rb | 46 +++++++++++++++++++++++++--------------------- app/views/tasks/processed.html.erb | 14 +++++++------- test/functional/tasks_controller_test.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 28 deletions(-) diff --git a/app/controllers/my_profile/tasks_controller.rb b/app/controllers/my_profile/tasks_controller.rb index 22b94c8..d669ad4 100644 --- a/app/controllers/my_profile/tasks_controller.rb +++ b/app/controllers/my_profile/tasks_controller.rb @@ -21,29 +21,10 @@ class TasksController < MyProfileController end def processed - @filter_requestor = params[:filter_requestor].presence - @filter_closed_by = params[:filter_closed_by].presence - @filter_type = params[:filter_type].presence - @filter_text = params[:filter_text].presence - @filter_status = params[:filter_status].presence - @filter_created_from = Date.parse(params[:filter_created_from]) unless params[:filter_created_from].blank? - @filter_created_until = Date.parse(params[:filter_created_until]) unless params[:filter_created_until].blank? - @filter_closed_from = Date.parse(params[:filter_closed_from]) unless params[:filter_closed_from].blank? - @filter_closed_until = Date.parse(params[:filter_closed_until]) unless params[:filter_closed_until].blank? - @tasks = Task.to(profile).without_spam.closed.includes(:requestor, :closed_by).order('tasks.created_at DESC') - - @tasks = @tasks.of(@filter_type) - @tasks = @tasks.where(:status => params[:filter_status]) unless @filter_status.blank? - @tasks = @tasks.where('tasks.created_at >= ?', @filter_created_from.beginning_of_day) unless @filter_created_from.blank? - @tasks = @tasks.where('tasks.created_at <= ?', @filter_created_until.end_of_day) unless @filter_created_until.blank? - @tasks = @tasks.like('profiles.name', @filter_requestor) unless @filter_requestor.blank? - @tasks = @tasks.like('closed_bies_tasks.name', @filter_closed_by) unless @filter_closed_by.blank? - - @tasks = @tasks.like('tasks.data', @filter_text) unless @filter_text.blank? - + @filter = params[:filter] || {} + @tasks = filter_tasks(@filter, @tasks) @tasks = @tasks.paginate(:per_page => Task.per_page, :page => params[:page]) - @task_types = Task.closed_types_for(profile) end @@ -112,4 +93,27 @@ class TasksController < MyProfileController @ticket = Ticket.find(:first, :conditions => ['(requestor_id = ? or target_id = ?) and id = ?', profile.id, profile.id, params[:id]]) end + protected + + def filter_tasks(filter, tasks) + filter[:created_from] = Date.parse(filter[:created_from]) unless filter[:created_from].blank? + filter[:created_until] = Date.parse(filter[:created_until]) unless filter[:created_until].blank? + filter[:closed_from] = Date.parse(filter[:closed_from]) unless filter[:closed_from].blank? + filter[:closed_until] = Date.parse(filter[:closed_until]) unless filter[:closed_until].blank? + + tasks = tasks.of(filter[:type].presence) + tasks = tasks.where(:status => filter[:status]) unless filter[:status].blank? + + tasks = tasks.where('tasks.created_at >= ?', filter[:created_from].beginning_of_day) unless filter[:created_from].blank? + tasks = tasks.where('tasks.created_at <= ?', filter[:created_until].end_of_day) unless filter[:created_until].blank? + + tasks = tasks.where('tasks.end_date >= ?', filter[:closed_from].beginning_of_day) unless filter[:closed_from].blank? + tasks = tasks.where('tasks.end_date <= ?', filter[:closed_until].end_of_day) unless filter[:closed_until].blank? + + tasks = tasks.like('profiles.name', filter[:requestor]) unless filter[:requestor].blank? + tasks = tasks.like('closed_bies_tasks.name', filter[:closed_by]) unless filter[:closed_by].blank? + tasks = tasks.like('tasks.data', filter[:text]) unless filter[:text].blank? + tasks + end + end diff --git a/app/views/tasks/processed.html.erb b/app/views/tasks/processed.html.erb index d5d2823..8cdbb61 100644 --- a/app/views/tasks/processed.html.erb +++ b/app/views/tasks/processed.html.erb @@ -10,21 +10,21 @@ <%= form_tag '#', :method => 'get' do %> <%= field_set_tag _('Filter'), :class => 'filter_fields' do %>
- <%= labelled_select(_('Type of task')+': ', :filter_type, :first, :last, @filter_type, type_collection, {:id => 'filter-type'}) %> - <%= labelled_select(_('Status:'), :filter_status, :last, :first, @filter_status, [[_('Any'), nil], [_(Task::Status.names[Task::Status::CANCELLED]), 2], [_(Task::Status.names[Task::Status::FINISHED]), 3] ]) %> + <%= labelled_select(_('Type of task')+': ', 'filter[type]', :first, :last, @filter[:type], type_collection, {:id => 'filter-type'}) %> + <%= labelled_select(_('Status:'), 'filter[status]', :last, :first, @filter[:status], [[_('Any'), nil], [_(Task::Status.names[Task::Status::CANCELLED]), 2], [_(Task::Status.names[Task::Status::FINISHED]), 3] ]) %>
- <%= labelled_text_field(_('Text Filter:'), :filter_text, @filter_text) %> + <%= labelled_text_field(_('Text Filter:'), 'filter[text]', @filter[:text]) %>
- <%= labelled_text_field(_('Requestor:'), :filter_requestor, @filter_requestor) %> - <%= labelled_text_field(_('Closed by:'), :filter_closed_by, @filter_closed_by) %> + <%= labelled_text_field(_('Requestor:'), 'filter[requestor]', @filter[:requestor]) %> + <%= labelled_text_field(_('Closed by:'), 'filter[closed_by]', @filter[:closed_by]) %>
- <%= labelled_form_field(_('Creation date'), date_range_field(:filter_created_from, :filter_created_until, @filter_created_from, @filter_created_until, '%Y-%m-%d', { :change_month => true, :change_year => true, :date_format => 'yy-mm-dd' }, { :size => 14, :from_id => 'filter_created_from', :to_id => 'filter_created_until' })) %> - <%= labelled_form_field(_('Processed date'), date_range_field(:filter_closed_from, :filter_closed_until, @filter_closed_from, @filter_closed_until, '%Y-%m-%d', { :change_month => true, :change_year => true, :date_format => 'yy-mm-dd' }, { :size => 14, :from_id => 'filter_closed_from', :to_id => 'filter_closed_until' })) %> + <%= labelled_form_field(_('Creation date'), date_range_field('filter[created_from]', 'filter[created_until]', @filter[:created_from], @filter[:created_until], '%Y-%m-%d', { :change_month => true, :change_year => true, :date_format => 'yy-mm-dd' }, { :size => 14, :from_id => 'filter_created_from', :to_id => 'filter_created_until' })) %> + <%= labelled_form_field(_('Processed date'), date_range_field('filter[closed_from]', 'filter[closed_until]', @filter[:closed_from], @filter[:closed_until], '%Y-%m-%d', { :change_month => true, :change_year => true, :date_format => 'yy-mm-dd' }, { :size => 14, :from_id => 'filter_closed_from', :to_id => 'filter_closed_until' })) %>
<%= submit_button(:search, _('Search')) %> diff --git a/test/functional/tasks_controller_test.rb b/test/functional/tasks_controller_test.rb index 9379f6c..94415ef 100644 --- a/test/functional/tasks_controller_test.rb +++ b/test/functional/tasks_controller_test.rb @@ -636,4 +636,30 @@ class TasksControllerTest < ActionController::TestCase assert_equal profile, t.reload.closed_by end + should 'filter processed tasks by all filters' do + requestor = fast_create(Person) + closed_by = fast_create(Person) + class AnotherTask < Task; end + + created_date = DateTime.now + processed_date = DateTime.now + + task_params = {:status => Task::Status::FINISHED, :requestor => requestor, :target => profile, :created_at => created_date, :end_date => processed_date, :closed_by => closed_by, :data => {:field => 'some data field'}} + + task = create(AnotherTask, task_params) + create(Task, task_params) + create(AnotherTask, task_params.clone.merge(:status => Task::Status::CANCELLED)) + create(AnotherTask, task_params.clone.merge(:created_at => created_date - 1.day)) + create(AnotherTask, task_params.clone.merge(:created_at => created_date + 1.day)) + create(AnotherTask, task_params.clone.merge(:end_date => processed_date - 1.day)) + create(AnotherTask, task_params.clone.merge(:end_date => processed_date + 1.day)) + create(AnotherTask, task_params.clone.merge(:requestor => fast_create(Person, :name => 'another-requestor'))) + create(AnotherTask, task_params.clone.merge(:closed_by => fast_create(Person, :name => 'another-closer'))) + create(AnotherTask, task_params.clone.merge(:data => {:field => 'other data field'})) + + get :processed, :filter => {:type => AnotherTask, :status => Task::Status::FINISHED, :created_from => created_date, :created_until => created_date, :closed_from => processed_date, :closed_until => processed_date, :requestor => requestor.name, :closed_by => closed_by.name, :text => 'some data field'} + assert_response :success + assert_equal [task], assigns(:tasks) + end + end -- libgit2 0.21.2