Commit 20e322c5799e77ab6629f30a017d1a96eb809ee3

Authored by Michel Felipe
Committed by Leandro Santos
1 parent 2905bc6e

Added filter by tags in tasks list

app/controllers/my_profile/tasks_controller.rb
... ... @@ -7,10 +7,14 @@ class TasksController < MyProfileController
7 7 @filter_type = params[:filter_type].presence
8 8 @filter_text = params[:filter_text].presence
9 9 @filter_responsible = params[:filter_responsible]
  10 + @filter_tags = params[:filter_tags]
  11 +
10 12 @task_types = Task.pending_types_for(profile)
  13 + @task_tags = [OpenStruct.new(:name => _('All'), :id => nil) ] + Task.all_tags
11 14  
12 15 @tasks = Task.pending_all(profile, @filter_type, @filter_text).order_by('created_at', 'asc')
13 16 @tasks = @tasks.where(:responsible_id => @filter_responsible.to_i != -1 ? @filter_responsible : nil) if @filter_responsible.present?
  17 + @tasks = @tasks.tagged_with(@filter_tags, any: true) if @filter_tags.present?
14 18 @tasks = @tasks.paginate(:per_page => Task.per_page, :page => params[:page])
15 19  
16 20 @failed = params ? params[:failed] : {}
... ...
app/views/tasks/index.html.erb
... ... @@ -35,6 +35,11 @@
35 35 </p>
36 36 <% end %>
37 37 <p>
  38 + <%= labelled_select(_('Tags')+': ', :filter_tags, :id, :name, @filter_tags, @task_tags, {:id => 'filter-add-tag'}) %>
  39 + <%= text_field_tag( :filter_tags, @filter_tags, :size => 36, :class => 'filter-tags' ) %>
  40 + </p>
  41 +
  42 + <p>
38 43 <%= submit_button(:search, _('Search')) %>
39 44 </p>
40 45 <% end %>
... ... @@ -72,46 +77,6 @@
72 77 <% end %>
73 78 </ul>
74 79  
75   - <script>
76   - jQuery('.tag-list').inputosaurus({
77   - autoCompleteSource: <%= "'/myprofile/#{profile.identifier}/cms/search_tags'," %>
78   - activateFinalResult: true,
79   - submitTags: {
80   - url: <%= "'/myprofile/#{profile.identifier}/tasks/save_tags'" %>,
81   - beforeSend: function(){
82   - this.element.parents('.task_box')
83   - .prev('.fg-state-error')
84   - .remove();
85   - },
86   - success: function(response){
87   -
88   - this.element.parents('.task_box')
89   - .prev('.fg-state-error')
90   - .remove();
91   -
92   - if(!response.success){
93   -
94   - var errorIcon = $('<span/>',{
95   - 'class':'ui-icon ui-icon-alert',
96   - style:'float: left; margin-right: .3em;'
97   - });
98   -
99   - var content = $('<p/>',{
100   - html:'<strong>'+response.message+'</strong>'
101   - }).prepend(errorIcon);
102   -
103   - var div = $('<div/>',{
104   - 'class':'alert fg-state-error ui-state-error'
105   - }).append(content);
106   -
107   - this.element.parents('.task_box').before(div);
108   - }
109   -
110   - }
111   - }
112   - })
113   - </script>
114   -
115 80 <%= pagination_links(@tasks)%>
116 81  
117 82 <% button_bar(:class => 'task-actions') do %>
... ... @@ -127,3 +92,55 @@
127 92  
128 93  
129 94 <%= javascript_include_tag 'tasks' %>
  95 +
  96 +<script type="text/javascript">
  97 +
  98 + jQuery('.filter-tags').inputosaurus({
  99 + hideInput: true
  100 + });
  101 +
  102 + $('#filter-add-tag').change(function(){
  103 +
  104 + if($(this).val() != ''){
  105 + jQuery('.filter-tags').inputosaurus('addTags',$(this).children(':selected').text());
  106 + }
  107 + });
  108 +
  109 + jQuery('.tag-list').inputosaurus({
  110 + autoCompleteSource: <%= "'/myprofile/#{profile.identifier}/cms/search_tags'," %>
  111 + activateFinalResult: true,
  112 + submitTags: {
  113 + url: <%= "'/myprofile/#{profile.identifier}/tasks/save_tags'" %>,
  114 + beforeSend: function(){
  115 + this.element.parents('.task_box')
  116 + .prev('.fg-state-error')
  117 + .remove();
  118 + },
  119 + success: function(response){
  120 +
  121 + this.element.parents('.task_box')
  122 + .prev('.fg-state-error')
  123 + .remove();
  124 +
  125 + if(!response.success){
  126 +
  127 + var errorIcon = $('<span/>',{
  128 + 'class':'ui-icon ui-icon-alert',
  129 + style:'float: left; margin-right: .3em;'
  130 + });
  131 +
  132 + var content = $('<p/>',{
  133 + html:'<strong>'+response.message+'</strong>'
  134 + }).prepend(errorIcon);
  135 +
  136 + var div = $('<div/>',{
  137 + 'class':'alert fg-state-error ui-state-error'
  138 + }).append(content);
  139 +
  140 + this.element.parents('.task_box').before(div);
  141 + }
  142 +
  143 + }
  144 + }
  145 + })
  146 +</script>
... ...
public/javascripts/inputosaurus.js
... ... @@ -63,6 +63,9 @@
63 63 // when you check for duplicates it check for the case
64 64 caseSensitiveDuplicates: false,
65 65  
  66 + //Hide input to inform tags. This is cool when you create tags from another way
  67 + hideInput: false,
  68 +
66 69 //Ajax options to send tags
67 70 submitTags: null
68 71 },
... ... @@ -204,6 +207,31 @@
204 207 widget._resetPlaceholder();
205 208 },
206 209  
  210 + addTags: function(list){
  211 +
  212 + if(arguments.length == 1){
  213 + list = [list];
  214 + }
  215 +
  216 + if(arguments[1]){
  217 + list = Array.prototype.slice.call(arguments);
  218 + }
  219 +
  220 + if(!$.isArray(list)){
  221 + var msg = 'Tag list needs be an Array';
  222 +
  223 + if(console){
  224 + console.error(msg);
  225 +
  226 + return false;
  227 + }else{
  228 + throw new Error(msg);
  229 + }
  230 +
  231 + }
  232 + this._setChosen(list);
  233 + },
  234 +
207 235 _inputFocus : function(ev) {
208 236 var widget = ev.data.widget || this;
209 237  
... ... @@ -399,6 +427,10 @@
399 427 }
400 428 });
401 429 self._setValue(self._buildValue());
  430 +
  431 + if(this.options.hideInput){
  432 + this.elements.input.parent().hide();
  433 + }
402 434 },
403 435  
404 436 _buildValue : function() {
... ...