diff --git a/app/controllers/my_profile/tasks_controller.rb b/app/controllers/my_profile/tasks_controller.rb index 1888ca4..22398a6 100644 --- a/app/controllers/my_profile/tasks_controller.rb +++ b/app/controllers/my_profile/tasks_controller.rb @@ -26,7 +26,11 @@ class TasksController < MyProfileController end def processed - @tasks = Task.to(profile).without_spam.closed.sort_by(&:created_at) + @tasks = Task.to(profile).without_spam.closed.order('tasks.created_at DESC') + @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 def change_responsible @@ -102,4 +106,37 @@ class TasksController < MyProfileController render :json => result.map { |task| {:label => task.data[:name], :value => task.data[:name]} } end + protected + + def filter_by_closed_date(filter, tasks) + 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.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 + end + + def filter_by_creation_date(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? + + 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 + end + + def filter_tasks(filter, tasks) + tasks = tasks.eager_load(:requestor, :closed_by) + tasks = tasks.of(filter[:type].presence) + tasks = tasks.where(:status => filter[:status]) unless filter[:status].blank? + tasks = filter_by_creation_date(filter, tasks) + tasks = filter_by_closed_date(filter, tasks) + + tasks = tasks.where('profiles.name LIKE ?', filter[:requestor]) unless filter[:requestor].blank? + tasks = tasks.where('closed_bies_tasks.name LIKE ?', filter[:closed_by]) unless filter[:closed_by].blank? + tasks = tasks.where('tasks.data LIKE ?', "%#{filter[:text]}%") unless filter[:text].blank? + tasks + end + end diff --git a/app/models/task.rb b/app/models/task.rb index 6507bae..2477704 100644 --- a/app/models/task.rb +++ b/app/models/task.rb @@ -329,6 +329,10 @@ class Task < ActiveRecord::Base Task.to(profile).pending.select('distinct type').map { |t| [t.class.name, t.title] } end + def self.closed_types_for(profile) + Task.to(profile).closed.select('distinct type').map { |t| [t.class.name, t.title] } + end + def opened? status == Task::Status::ACTIVE || status == Task::Status::HIDDEN end diff --git a/app/views/tasks/_task_processed.html.erb b/app/views/tasks/_task_processed.html.erb new file mode 100644 index 0000000..7f35285 --- /dev/null +++ b/app/views/tasks/_task_processed.html.erb @@ -0,0 +1,23 @@ +
+ <%= task_information(task) %> +
+
+ <%= _(Task::Status.names[task.status]) %> +
+
+ + <%= _('Created:') %> + <%= show_date(task.created_at) %> + +   —   + + <%= _('Processed:') %> + <%= show_date(task.end_date) %> + +
+<% if task.closed_by.present? %> +
+ <%= _('Closed by:') %> + <%= link_to(task.closed_by.name, task.closed_by.url) %> +
+<% end %> diff --git a/app/views/tasks/index.html.erb b/app/views/tasks/index.html.erb index 82ae899..2a30675 100644 --- a/app/views/tasks/index.html.erb +++ b/app/views/tasks/index.html.erb @@ -57,7 +57,9 @@ <% end %>
- <%= render :partial => 'task', :collection => @tasks %> + <% @tasks.each do |task| %> + <%= render :partial => partial_for_class(task.class, nil, nil), :locals => {:task => task} %> + <% end %>
<% unless @view_only %> diff --git a/app/views/tasks/processed.html.erb b/app/views/tasks/processed.html.erb index b76fac6..6c7773b 100644 --- a/app/views/tasks/processed.html.erb +++ b/app/views/tasks/processed.html.erb @@ -1,24 +1,54 @@ +<%= stylesheet_link_tag 'tasks' %> + +

<%= _("%s's processed tasks") % profile.name %>

+
+<% + type_collection = [[nil, _('All')]] + @task_types +%> + <%= 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_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_form_field(_('Creation date'), date_range_field('filter[created_from]', 'filter[created_until]', @filter[:created_from], @filter[:created_until], { :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], { :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')) %> +
+ <% end %> + <% end %> +
+

<% if @tasks.empty? %> <%= _('No processed tasks.') %> <% else %> -

diff --git a/public/stylesheets/tasks.scss b/public/stylesheets/tasks.scss index 81e1654..c9b666b 100644 --- a/public/stylesheets/tasks.scss +++ b/public/stylesheets/tasks.scss @@ -82,3 +82,47 @@ div.pending-tasks { .task_responsible { text-align: right; } + +.task-processed li { + background-color: rgb(240, 240, 240); + border-radius: 8px; + margin: 10px 0; + list-style-type: none; + padding: 12px; +} + +.task-processed .task.status-3 { + background-color: rgb(205, 252, 218); +} + +.task-processed .task.status-2 { + background-color: rgb(255, 203, 203); +} + +.task-processed ul { + padding: 0; +} + +.task-processed .task-list .task .title { + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + font-weight: bold; + color: rgb(44, 44, 44); +} + +.task-processed .task .status { + float: right; + color: rgb(156, 156, 156); + font-weight: bold; +} + +.task-processed .task .dates { + font-size: 11px; +} + +.task-processed .task .closed-by { + font-size: 11px; +} + +.task-processed .task .label { + font-weight: bold +} diff --git a/test/functional/tasks_controller_test.rb b/test/functional/tasks_controller_test.rb index 290d0f8..4f7e0bc 100644 --- a/test/functional/tasks_controller_test.rb +++ b/test/functional/tasks_controller_test.rb @@ -75,7 +75,8 @@ class TasksControllerTest < ActionController::TestCase assert_response :success assert_template 'processed' - assert_kind_of Array, assigns(:tasks) + assert !assigns(:tasks).nil? + assert_kind_of ActiveRecord::Relation, assigns(:tasks) end should 'display task created_at' do @@ -762,4 +763,30 @@ class TasksControllerTest < ActionController::TestCase assert_equal [email_template], assigns(:rejection_email_templates) 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