Commit 72ec6ae54faf8e48b8dee6c3a99ac89a7e4af722

Authored by Michel Felipe
1 parent f5aeac9a

Refactor in tasks.js to create a singleton 'Task', show success icon after save …

…each tag and tasks.css changes
app/controllers/my_profile/tasks_controller.rb
... ... @@ -94,7 +94,6 @@ class TasksController < MyProfileController
94 94 end
95 95  
96 96 def save_tags
97   -
98 97 if request.post? && params[:tag_list]
99 98 result = {
100 99 success: false,
... ... @@ -103,7 +102,7 @@ class TasksController < MyProfileController
103 102  
104 103 ActsAsTaggableOn.remove_unused_tags = true
105 104  
106   - task = profile.tasks.find_by_id params[:task_id]
  105 + task = Task.to(profile).find_by_id params[:task_id]
107 106 save = user.tag(task, with: params[:tag_list], on: :tags)
108 107  
109 108 if save
... ... @@ -114,15 +113,22 @@ class TasksController < MyProfileController
114 113 render json: result
115 114 end
116 115  
117   - #FIXME make this test
  116 + # FIXME make this test
118 117 # Should not search for article tasks
119 118 # Should not search for other profile tags
120 119 # Should search only task tags
121 120 # Should check the permissions
  121 +
122 122 def search_tags
  123 +
123 124 arg = params[:term].downcase
  125 +
124 126 result = ActsAsTaggableOn::Tag.find(:all, :conditions => ['LOWER(name) LIKE ?', "%#{arg}%"])
  127 +
125 128 render :text => prepare_to_token_input_by_label(result).to_json, :content_type => 'application/json'
  129 +
126 130 end
127 131  
  132 + end
  133 +
128 134 end
... ...
app/views/tasks/index.html.erb
... ... @@ -94,53 +94,7 @@
94 94 <%= javascript_include_tag 'tasks' %>
95 95  
96 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}/tasks/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   - }
  97 + Task.showTags({
  98 + profileIdentifier: <%= "'#{profile.identifier}'" %>
145 99 })
146 100 </script>
... ...
public/javascripts/tasks.js
1 1 (function($) {
2 2  
  3 + /**
  4 + * @class Task singleton created with module pattern
  5 + */
  6 + Task = (function(){
  7 +
  8 + var _showError = function(context,response){
  9 +
  10 + var errorIcon = $('<span/>',{
  11 + 'class':'ui-icon ui-icon-alert',
  12 + style:'float: left; margin-right: .3em;'
  13 + });
  14 +
  15 + var content = $('<p/>',{
  16 + html:'<strong>'+response.message+'</strong>'
  17 + }).prepend(errorIcon);
  18 +
  19 + var div = $('<div/>',{
  20 + 'class':'alert fg-state-error ui-state-error'
  21 + }).append(content);
  22 +
  23 + context.element.parents('.task_box').before(div);
  24 +
  25 + };
  26 +
  27 + var _showSuccess = function(context,response){
  28 + _addIcon(context,'ok');
  29 +
  30 + setTimeout(function(){
  31 + $('.ok').parent().remove();
  32 + },1000);
  33 + };
  34 +
  35 + var _addIcon = function(context,className){
  36 + $('.'+className).parent().remove();
  37 +
  38 + var item = $('<li/>',{
  39 + 'class':'inputosaurus-input tag-saved',
  40 + html:'<i class="'+className+'"></i>'
  41 + });
  42 +
  43 + if(className == 'ok'){
  44 + $('.loading').parent().remove();
  45 + }
  46 + context.elements.input.parent().before(item);
  47 + }
  48 +
  49 + return {
  50 +
  51 + /**
  52 + * @see inputosaurus#_sendTags The 'this' context here is the jquery ui widget component
  53 + */
  54 + onAddTag: function(response){
  55 + this.element.parents('.task_box')
  56 + .prev('.fg-state-error')
  57 + .remove();
  58 +
  59 + if(response.success){
  60 +
  61 + _showSuccess(this,response);
  62 + }else{
  63 +
  64 + _showError(this,response);
  65 + }
  66 + },
  67 + showTags: function(cfg){
  68 +
  69 + jQuery('.filter-tags').inputosaurus({
  70 + hideInput: true
  71 + });
  72 +
  73 + $('#filter-add-tag').change(function(){
  74 +
  75 + if($(this).val() != ''){
  76 + jQuery('.filter-tags').inputosaurus('addTags',$(this).children(':selected').text());
  77 + }
  78 + });
  79 +
  80 + jQuery('.tag-list').inputosaurus({
  81 + autoCompleteSource: '/myprofile/'+cfg.profileIdentifier+'/tasks/search_tags',
  82 + activateFinalResult: true,
  83 + submitTags: {
  84 + url: '/myprofile/'+cfg.profileIdentifier+'/tasks/save_tags',
  85 + beforeSend: function(){
  86 +
  87 + $('.ok').parent().remove();
  88 +
  89 + this.element.parents('.task_box')
  90 + .prev('.fg-state-error')
  91 + .remove();
  92 +
  93 + _addIcon(this,'loading');
  94 +
  95 + //Add loading here!
  96 + },
  97 + success: this.onAddTag
  98 + }
  99 + });
  100 +
  101 + }
  102 +
  103 + };
  104 +
  105 + })();
  106 +
3 107 $("input.task_accept_radio").click(function(){
4 108 task_id = this.getAttribute("task_id");
5 109 $('#on-accept-information-' + task_id).show('fast');
... ... @@ -62,4 +166,3 @@ function change_task_responsible(el) {
62 166 }
63 167 });
64 168 }
65   -
... ...
public/stylesheets/tasks.css
... ... @@ -61,8 +61,9 @@
61 61 margin: 0 5px 0 10px;
62 62 }
63 63  
64   -.formfieldline .inputosaurus-container {
  64 +.inputosaurus-container {
65 65 vertical-align: middle;
  66 + margin-top: -2px;
66 67 }
67 68  
68 69 .tag-list-fields input {
... ... @@ -73,3 +74,23 @@
73 74 background: url('/images/loading-small.gif') right center no-repeat !important;
74 75 background-color: #fff !important;
75 76 }
  77 +
  78 +.tag-saved {
  79 + width: 24px;
  80 + height: 24px;
  81 + background: none !important;
  82 +}
  83 +
  84 +.ok {
  85 + position: absolute;
  86 + width: 24px;
  87 + height: 24px;
  88 + background: url('/images/ok.png') right center no-repeat
  89 +}
  90 +
  91 +.loading {
  92 + position: absolute;
  93 + width: 24px;
  94 + height: 24px;
  95 + background: url('/images/loading-small.gif') right center no-repeat
  96 +}
... ...
test/functional/tasks_controller_test.rb
... ... @@ -684,6 +684,9 @@ class TasksControllerTest &lt; ActionController::TestCase
684 684  
685 685 assert_not_includes task_one.tags_from(nil), 'test'
686 686 end
  687 +#region_validators_controller_test.rb: give_permission('ze', 'manage_environment_validators', environment)
  688 +#profile_editor_controller_test.rb: user2.stubs(:has_permission?).with('edit_profile', anything).returns(true)
  689 +#profile_editor_controller_test.rb: user2.expects(:has_permission?).with(:manage_friends, anything).returns(true)
687 690  
688 691 should 'not tag task with permission but another user' do
689 692 requestor = fast_create(Person)
... ...