Commit b9ba56cbacedda34e2f31966dafbe67d48fe481e

Authored by Larissa Reis
1 parent 20c9a186

Improves the removal interface of wall itens

  Instead of a textual feedback to the user when a comment or wall item
  is deleted, this patch uses jQuery .slideUp() so the user feel like
  they see instead of read about the item removal.

  Also updates the Brazilian Portuguese translation.

(ActionItem2403)
app/controllers/public/profile_controller.rb
@@ -212,9 +212,9 @@ class ProfileController < PublicController @@ -212,9 +212,9 @@ class ProfileController < PublicController
212 begin 212 begin
213 scrap = current_user.person.scraps(params[:scrap_id]) 213 scrap = current_user.person.scraps(params[:scrap_id])
214 scrap.destroy 214 scrap.destroy
215 - render :text => _('Scrap successfully removed.') 215 + finish_successful_removal 'Scrap successfully removed.'
216 rescue 216 rescue
217 - render :text => _('You could not remove this scrap') 217 + finish_unsuccessful_removal 'You could not remove this scrap.'
218 end 218 end
219 end 219 end
220 220
@@ -227,9 +227,9 @@ class ProfileController < PublicController @@ -227,9 +227,9 @@ class ProfileController < PublicController
227 else 227 else
228 activity.destroy 228 activity.destroy
229 end 229 end
230 - render :text => _('Activity successfully removed.') 230 + finish_successful_removal 'Activity successfully removed.'
231 rescue 231 rescue
232 - render :text => _('You could not remove this activity') 232 + finish_unsuccessful_removal 'You could not remove this activity.'
233 end 233 end
234 end 234 end
235 235
@@ -244,6 +244,24 @@ class ProfileController < PublicController @@ -244,6 +244,24 @@ class ProfileController < PublicController
244 end 244 end
245 end 245 end
246 246
  247 + def finish_successful_removal(msg)
  248 + if request.xhr?
  249 + render :text => {'ok' => true}.to_json, :content_type => 'application/json'
  250 + else
  251 + session[:notice] = _(msg)
  252 + redirect_to :action => :index
  253 + end
  254 + end
  255 +
  256 + def finish_unsuccessful_removal(msg)
  257 + session[:notice] = _(msg)
  258 + if request.xhr?
  259 + render :text => {'redirect' => url_for(:action => :index)}.to_json, :content_type => 'application/json'
  260 + else
  261 + redirect_to :action => :index
  262 + end
  263 + end
  264 +
247 def profile_info 265 def profile_info
248 begin 266 begin
249 @block = profile.blocks.find(params[:block_id]) 267 @block = profile.blocks.find(params[:block_id])
@@ -303,9 +321,10 @@ class ProfileController < PublicController @@ -303,9 +321,10 @@ class ProfileController < PublicController
303 @comment = Comment.find(params[:comment_id]) 321 @comment = Comment.find(params[:comment_id])
304 if (user == @comment.author || user == profile || user.has_permission?(:moderate_comments, profile)) 322 if (user == @comment.author || user == profile || user.has_permission?(:moderate_comments, profile))
305 @comment.destroy 323 @comment.destroy
306 - session[:notice] = _('Comment successfully deleted') 324 + finish_successful_removal 'Comment successfully removed.'
  325 + else
  326 + finish_unsuccessful_removal 'You could not remove this comment.'
307 end 327 end
308 - redirect_to :action => :index  
309 end 328 end
310 329
311 protected 330 protected
app/views/profile/_comment.rhtml
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 30
31 <% if logged_in? && (user == profile || user == comment.author || user.has_permission?(:moderate_comments, profile)) %> 31 <% if logged_in? && (user == profile || user == comment.author || user.has_permission?(:moderate_comments, profile)) %>
32 <% button_bar(:style => 'float: right; margin-top: 0px;') do %> 32 <% button_bar(:style => 'float: right; margin-top: 0px;') do %>
33 - <%= icon_button(:delete, _('Remove'), { :action => :remove_comment, :comment_id => comment.id }, :method => :get, :confirm => _('Are you sure you want to remove this comment and all its replies?')) %> 33 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, %s, %s, %s); return false ;' % ["'.article-comment'", url_for(:profile => params[:profile], :action => :remove_comment, :comment_id => comment.id, :view => params[:view]).to_json, _('Are you sure you want to remove this comment and all its replies?').to_json], :class => 'button icon-button icon-delete') %>
34 <% end %> 34 <% end %>
35 <% end %> 35 <% end %>
36 <br style="clear: both;" /> 36 <br style="clear: both;" />
app/views/profile/_create_article.rhtml
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> 15 <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p>
16 <div class='profile-wall-actions'> 16 <div class='profile-wall-actions'>
17 <%= link_to s_('profile|Comment'), '#', { :class => 'focus-on-comment'} %> 17 <%= link_to s_('profile|Comment'), '#', { :class => 'focus-on-comment'} %>
18 - <%= link_to_remote(content_tag(:span, _('Remove')), :url =>{:action => 'remove_activity', :activity_id => activity.id, :only_hide => true}, :confirm => _('Are you sure?'), :update => "profile-activity-item-#{activity.id}") if logged_in? && current_person == @profile %> 18 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, %s, %s, %s); return false ;' % ["'.profile-activity-item'", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :only_hide => true, :view => params[:view]).to_json, _('Are you sure you want to remove this activity and all its replies?').to_json]) if logged_in? && current_person == @profile %>
19 </div> 19 </div>
20 </div> 20 </div>
21 21
app/views/profile/_default_activity.rhtml
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> 6 <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p>
7 <div class='profile-wall-actions'> 7 <div class='profile-wall-actions'>
8 <%= link_to s_('profile|Comment'), '#', { :class => 'focus-on-comment'} %> 8 <%= link_to s_('profile|Comment'), '#', { :class => 'focus-on-comment'} %>
9 - <%= link_to_remote(content_tag(:span, _('Remove')), :confirm => _('Are you sure?'), :url =>{:action => 'remove_activity', :activity_id => activity.id}, :update => "profile-activity-item-#{activity.id}") if logged_in? && current_person == @profile %> 9 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, %s, %s, %s); return false ;' % ["'.profile-activity-item'", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]).to_json, _('Are you sure you want to remove this activity and all its replies?').to_json]) if logged_in? && current_person == @profile %>
10 </div> 10 </div>
11 </div> 11 </div>
12 12
app/views/profile/_leave_scrap.rhtml
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> 5 <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p>
6 <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> 6 <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p>
7 <div class='profile-wall-actions'> 7 <div class='profile-wall-actions'>
8 - <%= link_to_remote(content_tag(:span, _('Remove')), :confirm => _('Are you sure?'), :url =>{:action => 'remove_activity', :activity_id => activity.id}, :update => "profile-activity-item-#{activity.id}") if logged_in? && current_person == @profile %> 8 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, %s, %s, %s); return false ;' % ["'.profile-activity-item'", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]).to_json, _('Are you sure you want to remove this activity and all its replies?').to_json]) if logged_in? && current_person == @profile %>
9 </div> 9 </div>
10 </div> 10 </div>
11 11
app/views/profile/_profile_scrap.rhtml
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 <%= link_to_function s_('profile|Comment'), "hide_and_show(['#profile-wall-message-response-#{scrap.id}'],['#profile-wall-reply-#{scrap.id}', '#profile-wall-reply-form-#{scrap.id}']);$('reply_content_#{scrap.id}').value='';$('reply_content_#{scrap.id}').focus();return false", :class => "profile-send-reply" %> 12 <%= link_to_function s_('profile|Comment'), "hide_and_show(['#profile-wall-message-response-#{scrap.id}'],['#profile-wall-reply-#{scrap.id}', '#profile-wall-reply-form-#{scrap.id}']);$('reply_content_#{scrap.id}').value='';$('reply_content_#{scrap.id}').focus();return false", :class => "profile-send-reply" %>
13 </span> 13 </span>
14 <% end %> 14 <% end %>
15 - <%= link_to_remote(content_tag(:span, _('Remove')), :confirm => _('Are you sure?'), :url =>{:action => 'remove_scrap', :scrap_id => scrap.id}, :update => "profile-activity-item-#{scrap.id}") if logged_in? && user.can_control_scrap?(scrap) %> 15 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, %s, %s, %s); return false ;' % ["'.profile-activity-item'", url_for(:profile => params[:profile], :action => :remove_scrap, :scrap_id => scrap.id, :view => params[:view]).to_json, _('Are you sure you want to remove this scrap and all its replies?').to_json]) if logged_in? && user.can_control_scrap?(scrap) %>
16 </div> 16 </div>
17 </div> 17 </div>
18 18
app/views/profile/_upload_image.rhtml
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> 6 <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p>
7 <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> 7 <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p>
8 <div class='profile-wall-actions'> 8 <div class='profile-wall-actions'>
9 - <%= link_to_remote(content_tag(:span, _('Remove')), :confirm => _('Are you sure?'), :url =>{:action => 'remove_activity', :activity_id => activity.id}, :update => "profile-activity-item-#{activity.id}") if logged_in? && current_person == @profile %> 9 + <%= link_to_function(_('Remove'), 'remove_item_wall(this, %s, %s, %s); return false ;' % ["'.profile-activity-item'", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]).to_json, _('Are you sure you want to remove this activity and all its replies?').to_json]) if logged_in? && current_person == @profile %>
10 </div> 10 </div>
11 </div> 11 </div>
12 </div> 12 </div>
po/pt/noosfero.po
@@ -5805,8 +5805,14 @@ msgstr &quot;Remover&quot; @@ -5805,8 +5805,14 @@ msgstr &quot;Remover&quot;
5805 #: app/views/profile/_create_article.rhtml:18 5805 #: app/views/profile/_create_article.rhtml:18
5806 #: app/views/profile/_default_activity.rhtml:9 5806 #: app/views/profile/_default_activity.rhtml:9
5807 #: app/views/profile/_leave_scrap_to_self.rhtml:8 5807 #: app/views/profile/_leave_scrap_to_self.rhtml:8
5808 -#: app/views/profile/_upload_image.rhtml:10 5808 +#: app/views/profile/_upload_image.rhtml:9
  5809 +msgid "Are you sure you want to remove this activity and all its replies?"
  5810 +msgstr "Você tem certeza que quer remover esta atividade e todas as suas respostas?"
  5811 +
5809 #: app/views/profile/_profile_scrap.rhtml:15 5812 #: app/views/profile/_profile_scrap.rhtml:15
  5813 +msgid "Are you sure you want to remove this scrap and all its replies?"
  5814 +msgstr "Você tem certeza que quer remover esta mensagem e todas as suas respostas?"
  5815 +
5810 #: plugins/bsc/views/bsc_plugin_myprofile/manage_contracts.html.erb:35 5816 #: plugins/bsc/views/bsc_plugin_myprofile/manage_contracts.html.erb:35
5811 msgid "Are you sure?" 5817 msgid "Are you sure?"
5812 msgstr "Você tem certeza?" 5818 msgstr "Você tem certeza?"
public/javascripts/application.js
@@ -683,6 +683,24 @@ function add_comment_reply_form(button, comment_id) { @@ -683,6 +683,24 @@ function add_comment_reply_form(button, comment_id) {
683 return f; 683 return f;
684 } 684 }
685 685
  686 +function remove_item_wall(button, item, url, msg) {
  687 + var $ = jQuery;
  688 + var $wall_item = $(button).closest(item);
  689 + $wall_item.addClass('remove-item-loading');
  690 + if (msg && !confirm(msg)) {
  691 + $wall_item.removeClass('remove-item-loading');
  692 + return;
  693 + }
  694 + $.post(url, function(data) {
  695 + if (data.ok) {
  696 + $wall_item.slideUp();
  697 + } else {
  698 + $wall_item.removeClass('remove-item-loading');
  699 + window.location.replace(data.redirect);
  700 + }
  701 + });
  702 +}
  703 +
686 function original_image_dimensions(src) { 704 function original_image_dimensions(src) {
687 var img = new Image(); 705 var img = new Image();
688 img.src = src; 706 img.src = src;
public/stylesheets/application.css
@@ -4772,6 +4772,10 @@ h1#agenda-title { @@ -4772,6 +4772,10 @@ h1#agenda-title {
4772 color: #000; 4772 color: #000;
4773 } 4773 }
4774 4774
  4775 +.remove-item-loading {
  4776 + background: transparent url(../images/loading-small.gif) no-repeat left center !important;
  4777 +}
  4778 +
4775 li.profile-activity-item.upload_image .more, 4779 li.profile-activity-item.upload_image .more,
4776 li.profile-activity-item.upload_image .upimg { 4780 li.profile-activity-item.upload_image .upimg {
4777 display: block; 4781 display: block;