Commit 785b56adcdd6b0a026d4c734063d4705054b0e2f

Authored by Caio Almeida
2 parents cdd1f702 733814ea

Merge branch 'master' into field-of-interest

Showing 310 changed files with 2575 additions and 1519 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 310 files displayed.

app/api/entities.rb
... ... @@ -93,7 +93,9 @@ module Api
93 93 class Box < Entity
94 94 root 'boxes', 'box'
95 95 expose :id, :position
96   - expose :blocks, :using => Block
  96 + expose :blocks, :using => Block do |box, options|
  97 + box.blocks.select {|block| block.visible_to_user?(options[:current_person]) }
  98 + end
97 99 end
98 100  
99 101 class Profile < Entity
... ... @@ -200,12 +202,21 @@ module Api
200 202 expose :accept_comments?, as: :accept_comments
201 203 end
202 204  
  205 + def self.permissions_for_entity(entity, current_person, *method_names)
  206 + method_names.map { |method| entity.send(method, current_person) ? method.to_s.gsub(/\?/,'') : nil }.compact
  207 + end
  208 +
203 209 class Article < ArticleBase
204 210 root 'articles', 'article'
205 211 expose :parent, :using => ArticleBase
206 212 expose :children, :using => ArticleBase do |article, options|
207 213 article.children.published.limit(V1::Articles::MAX_PER_PAGE)
208 214 end
  215 + expose :permissions do |article, options|
  216 + Entities.permissions_for_entity(article, options[:current_person],
  217 + :allow_edit?, :allow_post_content?, :allow_delete?, :allow_create?,
  218 + :allow_publish_content?)
  219 + end
209 220 end
210 221  
211 222 class User < Entity
... ...
app/api/helpers.rb
... ... @@ -121,7 +121,7 @@ module Api
121 121  
122 122 def present_article(asset)
123 123 article = find_article(asset.articles, params[:id])
124   - present_partial article, :with => Entities::Article, :params => params
  124 + present_partial article, with: Entities::Article, params: params, current_person: current_person
125 125 end
126 126  
127 127 def present_articles_for_asset(asset, method = 'articles')
... ... @@ -130,7 +130,7 @@ module Api
130 130 end
131 131  
132 132 def present_articles(articles)
133   - present_partial paginate(articles), :with => Entities::Article, :params => params
  133 + present_partial paginate(articles), :with => Entities::Article, :params => params, current_person: current_person
134 134 end
135 135  
136 136 def find_articles(asset, method = 'articles')
... ... @@ -407,9 +407,11 @@ module Api
407 407  
408 408 def parse_content_type(content_type)
409 409 return nil if content_type.blank?
410   - content_type.split(',').map do |content_type|
411   - content_type.camelcase
  410 + content_types = content_type.split(',').map do |content_type|
  411 + content_type = content_type.camelcase
  412 + content_type == 'TextArticle' ? Article.text_article_types : content_type
412 413 end
  414 + content_types.flatten.uniq
413 415 end
414 416  
415 417 def period(from_date, until_date)
... ...
app/api/v1/activities.rb
1 1 module Api
2 2 module V1
3 3 class Activities < Grape::API
4   - before { authenticate! }
5 4  
6 5 resource :profiles do
7 6  
... ... @@ -9,7 +8,7 @@ module Api
9 8 profile = Profile.find_by id: params[:id]
10 9  
11 10 not_found! if profile.blank? || profile.secret || !profile.visible
12   - forbidden! if !profile.secret && profile.visible && !profile.display_private_info_to?(current_person)
  11 + forbidden! if !profile.display_private_info_to?(current_person)
13 12  
14 13 activities = profile.activities.map(&:activity)
15 14 present activities, :with => Entities::Activity, :current_person => current_person
... ...
app/api/v1/articles.rb
... ... @@ -54,6 +54,17 @@ module Api
54 54 present_partial article, :with => Entities::Article
55 55 end
56 56  
  57 + delete ':id' do
  58 + article = environment.articles.find(params[:id])
  59 + return forbidden! unless article.allow_delete?(current_person)
  60 + begin
  61 + article.destroy
  62 + { :success => true }
  63 + rescue Exception => exception
  64 + render_api_error!(_('The article couldn\'t be removed due to some problem. Please contact the administrator.'), 400)
  65 + end
  66 + end
  67 +
57 68 desc 'Report a abuse and/or violent content in a article by id' do
58 69 detail 'Submit a abuse (in general, a content violation) report about a specific article'
59 70 params Entities::Article.documentation
... ... @@ -262,7 +273,7 @@ module Api
262 273 article = forbidden!
263 274 end
264 275  
265   - present_partial article, :with => Entities::Article
  276 + present_partial article, :with => Entities::Article, current_person: current_person
266 277 else
267 278  
268 279 present_articles_for_asset(profile)
... ...
app/api/v1/boxes.rb
... ... @@ -12,7 +12,8 @@ module Api
12 12 resource :boxes do
13 13 get do
14 14 profile = environment.send(kind.pluralize).find(params["#{kind}_id"])
15   - present profile.boxes, :with => Entities::Box
  15 + return forbidden! unless profile.display_info_to?(current_person)
  16 + present profile.boxes, with: Entities::Box, current_person: current_person
16 17 end
17 18 end
18 19 end
... ... @@ -32,7 +33,7 @@ module Api
32 33 else
33 34 env = Environment.find(params[:environment_id])
34 35 end
35   - present env.boxes, :with => Entities::Box
  36 + present env.boxes, with: Entities::Box, current_person: current_person
36 37 end
37 38 end
38 39 end
... ...
app/api/v1/comments.rb
... ... @@ -34,6 +34,7 @@ module Api
34 34 post ":id/comments" do
35 35 authenticate!
36 36 article = find_article(environment.articles, params[:id])
  37 + return forbidden! unless article.accept_comments?
37 38 options = params.select { |key,v| !['id','private_token'].include?(key) }.merge(:author => current_person, :source => article)
38 39 begin
39 40 comment = Comment.create!(options)
... ... @@ -42,6 +43,19 @@ module Api
42 43 end
43 44 present comment, :with => Entities::Comment, :current_person => current_person
44 45 end
  46 +
  47 + delete ":id/comments/:comment_id" do
  48 + article = find_article(environment.articles, params[:id])
  49 + comment = article.comments.find_by_id(params[:comment_id])
  50 + return not_found! if comment.nil?
  51 + return forbidden! unless comment.can_be_destroyed_by?(current_person)
  52 + begin
  53 + comment.destroy
  54 + present comment, with: Entities::Comment, :current_person => current_person
  55 + rescue => e
  56 + render_api_error!(e.message, 500)
  57 + end
  58 + end
45 59 end
46 60  
47 61 end
... ...
app/api/v1/profiles.rb
... ... @@ -22,6 +22,15 @@ module Api
22 22 not_found!
23 23 end
24 24 end
  25 +
  26 + desc "Update profile information"
  27 + post ':id' do
  28 + authenticate!
  29 + profile = environment.profiles.find_by(id: params[:id])
  30 + return forbidden! unless current_person.has_permission?(:edit_profile, profile)
  31 + profile.update_attributes!(params[:profile])
  32 + present profile, :with => Entities::Profile, :current_person => current_person
  33 + end
25 34  
26 35 delete ':id' do
27 36 authenticate!
... ...
app/concerns/authenticated_system.rb 0 → 100644
... ... @@ -0,0 +1,169 @@
  1 +module AuthenticatedSystem
  2 +
  3 + protected
  4 +
  5 + extend ActiveSupport::Concern
  6 +
  7 + included do
  8 + if self < ActionController::Base
  9 + around_filter :user_set_current
  10 + before_filter :override_user
  11 + before_filter :login_from_cookie
  12 + end
  13 +
  14 + # Inclusion hook to make #current_user and #logged_in?
  15 + # available as ActionView helper methods.
  16 + helper_method :current_user, :logged_in?
  17 + end
  18 +
  19 + # Returns true or false if the user is logged in.
  20 + # Preloads @current_user with the user model if they're logged in.
  21 + def logged_in?
  22 + current_user != nil
  23 + end
  24 +
  25 + # Accesses the current user from the session.
  26 + def current_user user_id = session[:user]
  27 + @current_user ||= begin
  28 + user = User.find_by id: user_id if user_id
  29 + user.session = session if user
  30 + User.current = user
  31 + user
  32 + end
  33 + end
  34 +
  35 + # Store the given user in the session.
  36 + def current_user=(new_user)
  37 + if new_user.nil?
  38 + session.delete(:user)
  39 + else
  40 + session[:user] = new_user.id
  41 + new_user.session = session
  42 + new_user.register_login
  43 + end
  44 + @current_user = User.current = new_user
  45 + end
  46 +
  47 + # See impl. from http://stackoverflow.com/a/2513456/670229
  48 + def user_set_current
  49 + User.current = current_user
  50 + yield
  51 + ensure
  52 + # to address the thread variable leak issues in Puma/Thin webserver
  53 + User.current = nil
  54 + end
  55 +
  56 + # Check if the user is authorized.
  57 + #
  58 + # Override this method in your controllers if you want to restrict access
  59 + # to only a few actions or if you want to check if the user
  60 + # has the correct rights.
  61 + #
  62 + # Example:
  63 + #
  64 + # # only allow nonbobs
  65 + # def authorize?
  66 + # current_user.login != "bob"
  67 + # end
  68 + def authorized?
  69 + true
  70 + end
  71 +
  72 + # Filter method to enforce a login requirement.
  73 + #
  74 + # To require logins for all actions, use this in your controllers:
  75 + #
  76 + # before_filter :login_required
  77 + #
  78 + # To require logins for specific actions, use this in your controllers:
  79 + #
  80 + # before_filter :login_required, :only => [ :edit, :update ]
  81 + #
  82 + # To skip this in a subclassed controller:
  83 + #
  84 + # skip_before_filter :login_required
  85 + #
  86 + def login_required
  87 + username, passwd = get_auth_data
  88 + if username && passwd
  89 + self.current_user ||= User.authenticate(username, passwd) || nil
  90 + end
  91 + if logged_in? && authorized?
  92 + true
  93 + else
  94 + if params[:require_login_popup]
  95 + render :json => { :require_login_popup => true }
  96 + else
  97 + access_denied
  98 + end
  99 + end
  100 + end
  101 +
  102 + # Redirect as appropriate when an access request fails.
  103 + #
  104 + # The default action is to redirect to the login screen.
  105 + #
  106 + # Override this method in your controllers if you want to have special
  107 + # behavior in case the user is not authorized
  108 + # to access the requested action. For example, a popup window might
  109 + # simply close itself.
  110 + def access_denied
  111 + respond_to do |accepts|
  112 + accepts.html do
  113 + if request.xhr?
  114 + render :text => _('Access denied'), :status => 401
  115 + else
  116 + store_location
  117 + redirect_to :controller => '/account', :action => 'login'
  118 + end
  119 + end
  120 + accepts.xml do
  121 + headers["Status"] = "Unauthorized"
  122 + headers["WWW-Authenticate"] = %(Basic realm="Web Password")
  123 + render :text => "Could't authenticate you", :status => '401 Unauthorized'
  124 + end
  125 + end
  126 + false
  127 + end
  128 +
  129 + # Store the URI of the current request in the session.
  130 + #
  131 + # We can return to this location by calling #redirect_back_or_default.
  132 + def store_location(location = request.url)
  133 + session[:return_to] = location
  134 + end
  135 +
  136 + # Redirect to the URI stored by the most recent store_location call or
  137 + # to the passed default.
  138 + def redirect_back_or_default(default)
  139 + if session[:return_to]
  140 + redirect_to(session.delete(:return_to))
  141 + else
  142 + redirect_to(default)
  143 + end
  144 + end
  145 +
  146 + def override_user
  147 + return if params[:override_user].blank?
  148 + return unless logged_in? and user.is_admin? environment
  149 + @current_user = nil
  150 + current_user params[:override_user]
  151 + end
  152 +
  153 + # When called with before_filter :login_from_cookie will check for an :auth_token
  154 + # cookie and log the user back in if apropriate
  155 + def login_from_cookie
  156 + return if cookies[:auth_token].blank? or logged_in?
  157 + user = User.where(remember_token: cookies[:auth_token]).first
  158 + self.current_user = user if user and user.remember_token?
  159 + end
  160 +
  161 + private
  162 + @@http_auth_headers = %w(X-HTTP_AUTHORIZATION HTTP_AUTHORIZATION Authorization)
  163 + # gets BASIC auth info
  164 + def get_auth_data
  165 + auth_key = @@http_auth_headers.detect { |h| request.env.has_key?(h) }
  166 + auth_data = request.env[auth_key].to_s.split unless auth_key.blank?
  167 + return auth_data && auth_data[0] == 'Basic' ? Base64.decode64(auth_data[1]).split(':')[0..1] : [nil, nil]
  168 + end
  169 +end
... ...
app/controllers/application_controller.rb
... ... @@ -13,6 +13,13 @@ class ApplicationController &lt; ActionController::Base
13 13 before_filter :verify_members_whitelist, :if => [:private_environment?, :user]
14 14 before_filter :redirect_to_current_user
15 15  
  16 + before_filter :set_session_theme
  17 + def set_session_theme
  18 + if params[:theme]
  19 + session[:theme] = environment.theme_ids.include?(params[:theme]) ? params[:theme] : nil
  20 + end
  21 + end
  22 +
16 23 def require_login_for_environment
17 24 login_required
18 25 end
... ...
app/controllers/my_profile/profile_themes_controller.rb
... ... @@ -63,12 +63,12 @@ class ProfileThemesController &lt; ThemesController
63 63 end
64 64  
65 65 def start_test
66   - session[:theme] = params[:id]
  66 + session[:user_theme] = params[:id]
67 67 redirect_to :controller => 'content_viewer', :profile => profile.identifier, :action => 'view_page'
68 68 end
69 69  
70 70 def stop_test
71   - session[:theme] = nil
  71 + session[:user_theme] = nil
72 72 redirect_to :action => 'index'
73 73 end
74 74  
... ...
app/controllers/public/content_viewer_controller.rb
... ... @@ -209,7 +209,7 @@ class ContentViewerController &lt; ApplicationController
209 209 end
210 210  
211 211 if @page.published && @page.uploaded_file?
212   - redirect_to @page.public_filename
  212 + redirect_to "#{Noosfero.root}#{@page.public_filename}"
213 213 else
214 214 send_data data, @page.download_headers
215 215 end
... ...
app/helpers/application_helper.rb
... ... @@ -233,13 +233,6 @@ module ApplicationHelper
233 233 link_to(content_tag('span', text), url, html_options.merge(:class => the_class, :title => text))
234 234 end
235 235  
236   - def button_bar(options = {}, &block)
237   - options[:class].nil? ?
238   - options[:class]='button-bar' :
239   - options[:class]+=' button-bar'
240   - concat(content_tag('div', capture(&block).to_s + tag('br', :style => 'clear: left;'), options))
241   - end
242   -
243 236 def render_profile_actions klass
244 237 name = klass.to_s.underscore
245 238 begin
... ... @@ -351,7 +344,7 @@ module ApplicationHelper
351 344 end
352 345  
353 346 def is_testing_theme
354   - !controller.session[:theme].nil?
  347 + !controller.session[:user_theme].nil?
355 348 end
356 349  
357 350 def theme_owner
... ... @@ -600,8 +593,8 @@ module ApplicationHelper
600 593 end
601 594  
602 595 if block
603   - field_html ||= ''
604   - field_html += capture(&block)
  596 + field_html ||= ''.html_safe
  597 + field_html = [field_html, capture(&block)].safe_join
605 598 end
606 599  
607 600 if controller.action_name == 'signup' || controller.action_name == 'new_community' || (controller.controller_name == "enterprise_registration" && controller.action_name == 'index') || (controller.controller_name == 'home' && controller.action_name == 'index' && user.nil?)
... ... @@ -610,7 +603,9 @@ module ApplicationHelper
610 603 end
611 604 else
612 605 if profile.active_fields.include?(name)
613   - result = content_tag('div', field_html + profile_field_privacy_selector(profile, name), :class => 'field-with-privacy-selector')
  606 + result = content_tag :div, class: 'field-with-privacy-selector' do
  607 + [field_html, profile_field_privacy_selector(profile, name)].safe_join
  608 + end
614 609 end
615 610 end
616 611  
... ... @@ -618,10 +613,6 @@ module ApplicationHelper
618 613 result = required(result)
619 614 end
620 615  
621   - if block
622   - concat(result)
623   - end
624   -
625 616 result
626 617 end
627 618  
... ... @@ -866,7 +857,7 @@ module ApplicationHelper
866 857 alias :browse_communities_menu :search_communities_menu
867 858  
868 859 def pagination_links(collection, options={})
869   - options = {:previous_label => content_tag(:span, '&laquo; ', :class => 'previous-arrow') + _('Previous'), :next_label => _('Next') + content_tag(:span, ' &raquo;', :class => 'next-arrow'), :inner_window => 1, :outer_window => 0 }.merge(options)
  860 + options = {:previous_label => content_tag(:span, '&laquo; '.html_safe, :class => 'previous-arrow') + _('Previous'), :next_label => _('Next') + content_tag(:span, ' &raquo;'.html_safe, :class => 'next-arrow'), :inner_window => 1, :outer_window => 0 }.merge(options)
870 861 will_paginate(collection, options)
871 862 end
872 863  
... ... @@ -988,6 +979,7 @@ module ApplicationHelper
988 979 values = {}
989 980 values.merge!(task.information[:variables]) if task.information[:variables]
990 981 values.merge!({:requestor => link_to(task.requestor.name, task.requestor.url)}) if task.requestor
  982 + values.merge!({:target => link_to(task.target.name, task.target.url)}) if (task.target && task.target.respond_to?(:url))
991 983 values.merge!({:subject => content_tag('span', task.subject, :class=>'task_target')}) if task.subject
992 984 values.merge!({:linked_subject => link_to(content_tag('span', task.linked_subject[:text], :class => 'task_target'), task.linked_subject[:url])}) if task.linked_subject
993 985 (task.information[:message] % values).html_safe
... ... @@ -1138,7 +1130,7 @@ module ApplicationHelper
1138 1130 content_tag(:div, :class => 'errorExplanation', :id => 'errorExplanation') do
1139 1131 content_tag(:h2, _('Errors while saving')) +
1140 1132 content_tag(:ul) do
1141   - safe_join(errors.map { |err| content_tag(:li, err) })
  1133 + safe_join(errors.map { |err| content_tag(:li, err.html_safe) })
1142 1134 end
1143 1135 end
1144 1136 end
... ...
app/helpers/article_helper.rb
... ... @@ -187,9 +187,9 @@ module ArticleHelper
187 187 def following_button(page, user)
188 188 if !user.blank? and user != page.author
189 189 if page.is_followed_by? user
190   - button :cancel, unfollow_button_text(page), {:controller => 'profile', :action => 'unfollow_article', :article_id => page.id, :profile => page.profile.identifier}
  190 + button :cancel, unfollow_button_text(page), {controller: :profile, profile: page.profile.identifier, action: :unfollow_article, article_id: page.id}
191 191 else
192   - button :add, follow_button_text(page), {:controller => 'profile', :action => 'follow_article', :article_id => page.id, :profile => page.profile.identifier}
  192 + button :add, follow_button_text(page), {controller: :profile, profile: page.profile.identifier, action: :follow_article, article_id: page.id}
193 193 end
194 194 end
195 195 end
... ...
app/helpers/boxes_helper.rb
... ... @@ -99,15 +99,10 @@ module BoxesHelper
99 99 end
100 100  
101 101 def render_block_content block
102   - # FIXME: this conditional should be removed after all
103   - # block footer from plugins methods get refactored into helpers and views.
104   - # They are a failsafe until all of them are done.
105   - return block.content if block.method(:content).owner != Block
106 102 render_block block
107 103 end
108 104  
109 105 def render_block_footer block
110   - return block.footer if block.method(:footer).owner != Block
111 106 render_block block, 'footers/'
112 107 end
113 108  
... ...
app/helpers/buttons_helper.rb
1 1 module ButtonsHelper
  2 +
  3 + def button_bar(options = {}, &block)
  4 + options[:class] ||= ''
  5 + options[:class] << ' button-bar'
  6 +
  7 + content_tag :div, options do
  8 + [
  9 + capture(&block).to_s,
  10 + tag(:br, style: 'clear: left;'),
  11 + ].safe_join
  12 + end
  13 + end
  14 +
2 15 def button(type, label, url, html_options = {})
3 16 html_options ||= {}
4 17 the_class = 'with-text'
... ...
app/helpers/custom_fields_helper.rb
... ... @@ -61,6 +61,6 @@ module CustomFieldsHelper
61 61  
62 62 def form_for_format(customized_type, format)
63 63 field = CustomField.new(:format => format, :customized_type => customized_type, :environment => environment)
64   - CGI::escapeHTML((render(:partial => 'features/custom_fields/form', :locals => {:field => field})))
  64 + CGI::escapeHTML((render(:partial => 'features/custom_fields/form', :locals => {:field => field}))).html_safe
65 65 end
66 66 end
... ...
app/helpers/theme_loader_helper.rb
... ... @@ -2,8 +2,8 @@ module ThemeLoaderHelper
2 2 def current_theme
3 3 @current_theme ||=
4 4 begin
5   - if session[:theme]
6   - session[:theme]
  5 + if session[:user_theme]
  6 + session[:user_theme]
7 7 else
8 8 # utility for developers: set the theme to 'random' in development mode and
9 9 # you will get a different theme every request. This is interesting for
... ... @@ -11,8 +11,8 @@ module ThemeLoaderHelper
11 11 if Rails.env.development? && environment.theme == 'random'
12 12 @random_theme ||= Dir.glob('public/designs/themes/*').map { |f| File.basename(f) }.rand
13 13 @random_theme
14   - elsif Rails.env.development? && respond_to?(:params) && params[:theme] && File.exists?(Rails.root.join('public/designs/themes', params[:theme]))
15   - params[:theme]
  14 + elsif Rails.env.development? && respond_to?(:params) && params[:user_theme] && File.exists?(Rails.root.join('public/designs/themes', params[:user_theme]))
  15 + params[:user_theme]
16 16 else
17 17 if profile && !profile.theme.nil?
18 18 profile.theme
... ... @@ -34,8 +34,10 @@ module ThemeLoaderHelper
34 34 end
35 35  
36 36 def theme_path
37   - if session[:theme]
  37 + if session[:user_theme]
38 38 '/user_themes/' + current_theme
  39 + elsif session[:theme]
  40 + '/designs/themes/' + session[:theme]
39 41 else
40 42 '/designs/themes/' + current_theme
41 43 end
... ...
app/helpers/url_helper.rb
... ... @@ -4,4 +4,12 @@ module UrlHelper
4 4 'javascript:history.back()'
5 5 end
6 6  
  7 + def default_url_options
  8 + options = {}
  9 +
  10 + options[:override_user] = params[:override_user] if params[:override_user].present?
  11 +
  12 + options
  13 + end
  14 +
7 15 end
... ...
app/helpers/users_helper.rb
1 1 module UsersHelper
2 2  
3   - FILTER_TRANSLATION = {
  3 + def filter_translation
  4 + {
4 5 'all_users' => _('All users'),
5 6 'admin_users' => _('Admin users'),
6 7 'activated_users' => _('Activated users'),
7 8 'deactivated_users' => _('Deativated users'),
8   - }
  9 + }
  10 + end
9 11  
10 12 def filter_selector(filter, float = 'right')
11   - options = options_for_select(FILTER_TRANSLATION.map {|key, name| [name, key]}, :selected => filter)
  13 + options = options_for_select(filter_translation.map {|key, name| [name, key]}, :selected => filter)
12 14 url_params = url_for(params.merge(:filter => 'FILTER'))
13 15 onchange = "document.location.href = '#{url_params}'.replace('FILTER', this.value)"
14 16 select_field = select_tag(:filter, options, :onchange => onchange)
... ... @@ -19,7 +21,7 @@ module UsersHelper
19 21 end
20 22  
21 23 def users_filter_title(filter)
22   - FILTER_TRANSLATION[filter]
  24 + filter_translation[filter]
23 25 end
24 26  
25 27 end
... ...
app/jobs/download_reported_images_job.rb 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +class DownloadReportedImagesJob < Struct.new(:abuse_report, :article)
  2 + def perform
  3 + images_paths = article.image? ? [File.join(article.profile.environment.top_url, article.public_filename(:display))] : article.body_images_paths
  4 + images_paths.each do |image_path|
  5 + image = get_image(image_path)
  6 + reported_image = ReportedImage.create!( :abuse_report => abuse_report,
  7 + :uploaded_data => image,
  8 + :filename => File.basename(image_path),
  9 + :size => image.size )
  10 + abuse_report.content = parse_content(abuse_report, image_path, reported_image)
  11 + end
  12 + abuse_report.save!
  13 + end
  14 +
  15 + def get_image(image_path)
  16 + image = ActionController::UploadedTempfile.new('reported_image')
  17 + image.write(Net::HTTP.get(URI.parse(image_path)))
  18 + image.original_path = 'tmp/' + File.basename(image_path)
  19 + image.content_type = 'image/' + File.extname(image_path).gsub('.','')
  20 + image
  21 + end
  22 +
  23 + def parse_content(report, old_path, image)
  24 + old_path = old_path.gsub(report.reporter.environment.top_url, '')
  25 + report.content.gsub(/#{old_path}/, image.public_filename)
  26 + end
  27 +end
... ...
app/jobs/get_email_contacts_job.rb 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +class GetEmailContactsJob < Struct.new(:import_from, :login, :password, :contact_list_id)
  2 + def perform
  3 + begin
  4 + Invitation.get_contacts(import_from, login, password, contact_list_id)
  5 + rescue Contacts::AuthenticationError => ex
  6 + ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).register_auth_error
  7 + rescue Exception => ex
  8 + ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).register_error
  9 + end
  10 + end
  11 +end
... ...
app/jobs/invitation_job.rb 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +class InvitationJob < Struct.new(:person_id, :contacts_to_invite, :message, :profile_id, :contact_list_id, :locale)
  2 + def perform
  3 + Noosfero.with_locale(locale) do
  4 + person = Person.find(person_id)
  5 + profile = Profile.find(profile_id)
  6 + Invitation.invite(person, contacts_to_invite, message, profile)
  7 + ContactList.exists?(contact_list_id) && ContactList.find(contact_list_id).destroy
  8 + end
  9 + end
  10 +end
... ...
app/jobs/log_memory_consumption_job.rb 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +class LogMemoryConsumptionJob < Struct.new(:last_stat)
  2 + # Number of entries do display
  3 + N = 20
  4 +
  5 + def perform
  6 + logpath = File.join(Rails.root, 'log', "#{ENV['RAILS_ENV']}_memory_consumption.log")
  7 + logger = Logger.new(logpath)
  8 + stats = Hash.new(0)
  9 + ObjectSpace.each_object {|o| stats[o.class.to_s] += 1}
  10 + i = 1
  11 +
  12 + logger << "[#{Time.now.strftime('%F %T %z')}]\n"
  13 + stats.sort {|(k1,v1),(k2,v2)| v2 <=> v1}.each do |k,v|
  14 + logger << (sprintf "%-60s %10d", k, v)
  15 + logger << (sprintf " | delta %10d", (v - last_stat[k])) if last_stat && last_stat[k]
  16 + logger << "\n"
  17 + break if i > N
  18 + i += 1
  19 + end
  20 + logger << "\n"
  21 + end
  22 +end
... ...
app/jobs/mailing_job.rb 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +class MailingJob < Struct.new(:mailing_id)
  2 + def perform
  3 + mailing = Mailing.find(mailing_id)
  4 + Noosfero.with_locale(mailing.locale) do
  5 + mailing.deliver
  6 + end
  7 + end
  8 +end
... ...
app/jobs/notify_activity_to_profiles_job.rb 0 → 100644
... ... @@ -0,0 +1,44 @@
  1 +class NotifyActivityToProfilesJob < Struct.new(:tracked_action_id)
  2 + NOTIFY_ONLY_COMMUNITY = [
  3 + 'add_member_in_community'
  4 + ]
  5 +
  6 + NOT_NOTIFY_COMMUNITY = [
  7 + 'join_community'
  8 + ]
  9 + def perform
  10 + return unless ActionTracker::Record.exists?(tracked_action_id)
  11 + tracked_action = ActionTracker::Record.find(tracked_action_id)
  12 + return unless tracked_action.user.present?
  13 + target = tracked_action.target
  14 + if target.is_a?(Community) && ( NOTIFY_ONLY_COMMUNITY.include?(tracked_action.verb) || ! target.public_profile )
  15 + ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id)
  16 + return
  17 + end
  18 +
  19 + # Notify the user
  20 + ActionTrackerNotification.create(:profile_id => tracked_action.user.id, :action_tracker_id => tracked_action.id)
  21 +
  22 + # Notify all friends
  23 + ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select f.friend_id, #{tracked_action.id} from friendships as f where person_id=#{tracked_action.user.id} and f.friend_id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id})")
  24 +
  25 + if tracked_action.user.is_a? Organization
  26 + ActionTrackerNotification.connection.execute "insert into action_tracker_notifications(profile_id, action_tracker_id) " +
  27 + "select distinct accessor_id, #{tracked_action.id} from role_assignments where resource_id = #{tracked_action.user.id} and resource_type='Profile' " +
  28 + if tracked_action.user.is_a? Enterprise then "union select distinct person_id, #{tracked_action.id} from favorite_enterprise_people where enterprise_id = #{tracked_action.user.id}" else "" end
  29 + end
  30 +
  31 + if target.is_a?(Community)
  32 + ActionTrackerNotification.create(:profile_id => target.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb)
  33 +
  34 + ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select distinct profiles.id, #{tracked_action.id} from role_assignments, profiles where profiles.type = 'Person' and profiles.id = role_assignments.accessor_id and profiles.id != #{tracked_action.user.id} and profiles.id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id}) and role_assignments.resource_type = 'Profile' and role_assignments.resource_id = #{target.id}")
  35 + end
  36 +
  37 + if target.is_a?(Article) && target.profile.is_a?(Community)
  38 + ActionTrackerNotification.create(:profile_id => target.profile.id, :action_tracker_id => tracked_action.id) unless NOT_NOTIFY_COMMUNITY.include?(tracked_action.verb)
  39 +
  40 + ActionTrackerNotification.connection.execute("insert into action_tracker_notifications(profile_id, action_tracker_id) select distinct profiles.id, #{tracked_action.id} from role_assignments, profiles where profiles.type = 'Person' and profiles.id = role_assignments.accessor_id and profiles.id != #{tracked_action.user.id} and profiles.id not in (select atn.profile_id from action_tracker_notifications as atn where atn.action_tracker_id = #{tracked_action.id}) and role_assignments.resource_type = 'Profile' and role_assignments.resource_id = #{target.profile.id}")
  41 + end
  42 +
  43 + end
  44 +end
... ...
app/jobs/profile_suggestions_job.rb 0 → 100644
... ... @@ -0,0 +1,22 @@
  1 +class ProfileSuggestionsJob < Struct.new(:person_id)
  2 +
  3 + def self.exists?(person_id)
  4 + !find(person_id).empty?
  5 + end
  6 +
  7 + def self.find(person_id)
  8 + Delayed::Job.by_handler("--- !ruby/struct:ProfileSuggestionsJob\nperson_id: #{person_id}\n")
  9 + end
  10 +
  11 + def perform
  12 + logger = Delayed::Worker.logger
  13 + begin
  14 + person = Person.find(person_id)
  15 + ProfileSuggestion.calculate_suggestions(person)
  16 + UserMailer.profiles_suggestions_email(person).deliver if person.email_suggestions
  17 + rescue Exception => exception
  18 + logger.error("Error with suggestions for person ID %d: %s" % [person_id, exception.to_s])
  19 + end
  20 + end
  21 +
  22 +end
... ...
app/jobs/user_activation_job.rb 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +class UserActivationJob < Struct.new(:user_id)
  2 + def perform
  3 + user = User.find(user_id)
  4 + user.destroy unless user.activated? || user.person.is_template? || user.moderate_registration_pending?
  5 + end
  6 +end
... ...
app/models/add_member.rb
... ... @@ -37,6 +37,10 @@ class AddMember &lt; Task
37 37 true
38 38 end
39 39  
  40 + def reject_details
  41 + true
  42 + end
  43 +
40 44 def footer
41 45 true
42 46 end
... ... @@ -72,8 +76,9 @@ class AddMember &lt; Task
72 76 end
73 77  
74 78 def task_cancelled_message
75   - _("Your request to enter community \"%{target} with the profile \"%{requestor}\" was not accepted. Please contact any profile admin from %{url} for more information.") %
76   - {:target => self.target.name, :url => self.target.url,
77   - :requestor => self.requestor.name}
  79 + _("Your request to enter community \"%{target}\" with the profile \"%{requestor}\" was not accepted. Please contact any profile admin from %{target} for more information. The following explanation was given: \n\n\"%{explanation}\"") %
  80 + {:target => self.target.name,
  81 + :requestor => self.requestor.name,
  82 + :explanation => self.reject_explanation}
78 83 end
79 84 end
... ...
app/models/article.rb
... ... @@ -29,6 +29,8 @@ class Article &lt; ApplicationRecord
29 29 :display => %w[full]
30 30 }
31 31  
  32 + N_('article')
  33 +
32 34 def initialize(*params)
33 35 super
34 36 if params.present? && params.first.present?
... ...
app/models/block.rb
... ... @@ -181,30 +181,6 @@ class Block &lt; ApplicationRecord
181 181 "/images/block_preview.png"
182 182 end
183 183  
184   - # Returns the content to be used for this block.
185   - #
186   - # This method can return several types of objects:
187   - #
188   - # * <tt>String</tt>: if the string starts with <tt>http://</tt> or <tt>https://</tt>, then it is assumed to be address of an IFRAME. Otherwise it's is used as regular HTML.
189   - # * <tt>Hash</tt>: the hash is used to build an URL that is used as the address for a IFRAME.
190   - # * <tt>Proc</tt>: the Proc is evaluated in the scope of BoxesHelper. The
191   - # block can then use <tt>render</tt>, <tt>link_to</tt>, etc.
192   - #
193   - # The method can also return <tt>nil</tt>, which means "no content".
194   - #
195   - # See BoxesHelper#extract_block_content for implementation details.
196   - def content(args={})
197   - "This is block number %d" % self.id
198   - end
199   -
200   - # A footer to be appended to the end of the block. Returns <tt>nil</tt>.
201   - #
202   - # Override in your subclasses. You can return the same types supported by
203   - # #content.
204   - def footer
205   - nil
206   - end
207   -
208 184 # Is this block editable? (Default to <tt>true</tt>)
209 185 def editable?(user=nil)
210 186 self.edit_modes == "all"
... ...
app/models/comment_handler.rb
1   -class CommentHandler < Struct.new(:comment_id, :method)
  1 +class CommentHandler < Struct.new(:comment_id, :method, :locale)
  2 + def initialize(*args)
  3 + super
  4 + self.locale ||= FastGettext.locale
  5 + end
2 6  
3 7 def perform
  8 + saved_locale = FastGettext.locale
  9 + FastGettext.locale = locale
  10 +
4 11 comment = Comment.find(comment_id)
5 12 comment.send(method)
  13 + FastGettext.locale = saved_locale
6 14 rescue ActiveRecord::RecordNotFound
7 15 # just ignore non-existing comments
8 16 end
... ...
app/models/community.rb
... ... @@ -9,7 +9,7 @@ class Community &lt; Organization
9 9 _('Community')
10 10 end
11 11  
12   - N_('Community')
  12 + N_('community')
13 13 N_('Language')
14 14  
15 15 settings_items :language
... ...
app/models/enterprise.rb
... ... @@ -12,7 +12,7 @@ class Enterprise &lt; Organization
12 12 _('Enterprise')
13 13 end
14 14  
15   - N_('Enterprise')
  15 + N_('enterprise')
16 16  
17 17 acts_as_trackable after_add: proc{ |p, t| notify_activity t }
18 18  
... ...
app/models/environment.rb
... ... @@ -750,6 +750,10 @@ class Environment &lt; ApplicationRecord
750 750 end
751 751 end
752 752  
  753 + def theme_ids
  754 + settings[:themes] || []
  755 + end
  756 +
753 757 def themes=(values)
754 758 settings[:themes] = values
755 759 end
... ...
app/models/link_list_block.rb
... ... @@ -81,10 +81,8 @@ class LinkListBlock &lt; Block
81 81 end
82 82 end
83 83  
84   - def icons_options
85   - ICONS.map do |i|
86   - "<span title=\"#{i[1]}\" class=\"icon-#{i[0]}\" onclick=\"changeIcon(this, '#{i[0]}')\"></span>".html_safe
87   - end
  84 + def icons
  85 + ICONS
88 86 end
89 87  
90 88 end
... ...
app/models/organization.rb
... ... @@ -234,4 +234,7 @@ class Organization &lt; Profile
234 234 self.admins.where(:id => user.id).exists?
235 235 end
236 236  
  237 + def display_private_info_to?(user)
  238 + (public_profile && visible && !secret) || super
  239 + end
237 240 end
... ...
app/models/person.rb
... ... @@ -13,6 +13,8 @@ class Person &lt; Profile
13 13 _('Person')
14 14 end
15 15  
  16 + N_('person')
  17 +
16 18 acts_as_trackable :after_add => Proc.new {|p,t| notify_activity(t)}
17 19 acts_as_accessor
18 20  
... ...
app/models/person_notifier.rb
... ... @@ -82,7 +82,7 @@ class PersonNotifier
82 82 helper ActionTrackerHelper
83 83  
84 84 def session
85   - {:theme => nil}
  85 + {:user_theme => nil}
86 86 end
87 87  
88 88 def content_summary(person, notifications, tasks)
... ...
app/views/account/_login_form.html.erb
... ... @@ -11,7 +11,7 @@
11 11 <%= hidden_field_tag :terms_accepted, params[:terms_accepted] %>
12 12 <% end %>
13 13  
14   -<% button_bar do %>
  14 +<%= button_bar do %>
15 15 <%= submit_button( 'login', _('Log in') )%>
16 16 <%= modal_close_button _('Cancel') if request.xhr? %>
17 17 <% end %>
... ...
app/views/account/accept_terms.html.erb
... ... @@ -20,7 +20,7 @@
20 20 <%= hidden_field_tag :answer, params[:answer] %>
21 21  
22 22 <%= labelled_check_box(environment.terms_of_use_acceptance_text.blank? ? _('I read the terms of use and accepted them') : environment.terms_of_use_acceptance_text, :terms_accepted, '1', false, :id => 'accept-terms') %>
23   - <% button_bar do %>
  23 + <%= button_bar do %>
24 24 <%= button 'cancel', _('Cancel'), :controller => 'home', :action => 'index' %>
25 25 <%= submit_button 'forward', _('Continue'), {:disabled => true, :class => 'disabled', :id => 'submit-accept-terms'} %>
26 26 <% end %>
... ...
app/views/account/activation_question.html.erb
... ... @@ -24,7 +24,7 @@
24 24  
25 25 <div class='activation-box'>
26 26 <h2><%= _('Enterprise activation') + ' - ' + (logged_in? ? _('part 1 of 2') : _('part 1 of 3')) %></h2>
27   - <%= form_tag( {:action => 'accept_terms'}, {:method => 'get', :onsubmit => (@question == :foundation_year ? 'return check_valid_year(this)' : 'return check_valid_cnpj(this)')}) do %>
  27 + <%= form_tag( {:action => 'accept_terms'}, {:method => 'get', :onsubmit => (@question == :foundation_year ? 'return check_valid_year(this)' : 'return check_valid_cnpj(this)')}) do %>
28 28  
29 29 <p> <strong><%= _('Pay atention! You have only one chance!') %></strong> </p>
30 30  
... ... @@ -34,7 +34,7 @@
34 34  
35 35 <%= hidden_field_tag :enterprise_code, params[:enterprise_code] %>
36 36  
37   - <% button_bar do %>
  37 + <%= button_bar do %>
38 38 <%= button 'cancel', _('Cancel'), :action => 'index' %>
39 39 <%= submit_button 'forward', _('Continue') %>
40 40 <% end %>
... ...
app/views/account/forgot_password.html.erb
... ... @@ -9,7 +9,7 @@
9 9 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %>
10 10  
11 11 <div>
12   - <% button_bar do %>
  12 + <%= button_bar do %>
13 13 <%= submit_button('send', _('Send instructions')) %>
14 14 <% end %>
15 15 </div>
... ...
app/views/account/login.html.erb
... ... @@ -22,7 +22,7 @@
22 22  
23 23 <%= safe_join(@plugins.dispatch(:login_extra_contents).collect { |content| instance_exec(&content) }, "") %>
24 24  
25   - <% button_bar do %>
  25 + <%= button_bar do %>
26 26 <%= submit_button( 'login', _('Log in') )%>
27 27 <% if is_popin %>
28 28 <%= modal_close_button(_('Cancel')) %>
... ... @@ -31,7 +31,7 @@
31 31  
32 32 <% end %>
33 33  
34   -<% button_bar do %>
  34 +<%= button_bar do %>
35 35 <% unless @plugins.dispatch(:allow_user_registration).include?(false) %>
36 36 <%= button :add, _("New user"), :controller => 'account', :action => 'signup' %>
37 37 <% end %>
... ...
app/views/account/login_block.html.erb
... ... @@ -17,7 +17,7 @@
17 17  
18 18 <%= safe_join(@plugins.dispatch(:login_extra_contents).collect { |content| instance_eval(&content) }, "") %>
19 19  
20   - <% button_bar do %>
  20 + <%= button_bar do %>
21 21 <%= submit_button( 'login', _('Log in') )%>
22 22 <% unless @plugins.dispatch(:allow_user_registration).include?(false) %>
23 23 <%= button(:add, _('New user'), { :controller => 'account', :action => 'signup' }) %>
... ...
app/views/account/logout_popup.html.erb
1 1 <h2><%= _('Are you sure you want to get out?') %></h2>
2 2 <p>
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button :ok, _('Yes'), { :controller => 'account', :action => 'logout' } %>
5 5 <%= modal_close_button _('No, I want to stay.') %>
6 6 <% end %>
... ...
app/views/account/new_password.html.erb
... ... @@ -10,7 +10,7 @@
10 10  
11 11 <%= labelled_form_field(_('Enter new password'), (f.password_field :password)) %>
12 12 <%= labelled_form_field(_('Confirm the new password'), (f.password_field :password_confirmation)) %>
13   - <% button_bar do %>
  13 + <%= button_bar do %>
14 14 <%= submit_button(:ok, _('Change password')) %>
15 15 <% end %>
16 16  
... ...
app/views/account/welcome.html.erb
... ... @@ -3,8 +3,8 @@
3 3  
4 4 <%= _('%s was successfuly activated. Now you may go to your control panel or to the control panel of your enterprise') % @enterprise.name %>
5 5  
6   - <% button_bar do %>
7   - <%= button 'forward', _('Go to my control panel'), :action => 'index', :controller => 'profile_editor', :profile => current_user.person.identifier %>
  6 + <%= button_bar do %>
  7 + <%= button 'forward', _('Go to my control panel'), :action => 'index', :controller => 'profile_editor', :profile => current_user.person.identifier %>
8 8 <%= button 'forward', _('Go to my enterprise control panel') % @enterprise.name, :action => 'index', :controller => 'profile_editor', :profile => @enterprise.identifier %>
9 9 <% end %>
10 10 <% end %>
... ...
app/views/admin_panel/message_for_disabled_enterprise.html.erb
... ... @@ -6,7 +6,7 @@
6 6  
7 7 <%= f.text_area :message_for_disabled_enterprise, :cols => 40, :style => 'width: 90%' %>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= submit_button(:save, _('Save')) %>
11 11 <%= button(:cancel, _('Cancel'), :action => 'index') %>
12 12 <% end %>
... ...
app/views/admin_panel/set_portal_community.html.erb
... ... @@ -4,14 +4,14 @@
4 4 <%= form_tag do %>
5 5 <%= labelled_form_field(_('Portal identifier'), text_field_tag('portal_community_identifier', @portal_community.identifier, :size => 40) ) %>
6 6  
7   - <% button_bar do %>
  7 + <%= button_bar do %>
8 8 <%= submit_button 'save', _('Save'), :cancel => { :action => 'index' } %>
9 9 <% end %>
10 10 <% end %>
11 11 <% else %>
12 12 <%= _('Portal identifier: %s').html_safe % link_to(@portal_community.identifier, @portal_community.url) %>
13 13  
14   - <% button_bar do %>
  14 + <%= button_bar do %>
15 15 <%if @portal_community.environment.enabled?('use_portal_community') %>
16 16 <%= button 'cancel', _('Disable'), {:action => 'manage_portal_community', :activate => 0} %>
17 17 <% else %>
... ...
app/views/admin_panel/set_portal_folders.html.erb
... ... @@ -37,7 +37,7 @@
37 37 <%= _('The same order in which you arrange the folders here will be used for arranging the boxes in the environment initial page.') %>
38 38 </p>
39 39  
40   - <% button_bar do %>
  40 + <%= button_bar do %>
41 41 <%= submit_button 'save', _('Save'), :cancel => {:action => 'index'} %>
42 42 <% end %>
43 43 <% end %>
... ...
app/views/admin_panel/set_portal_news_amount.html.erb
... ... @@ -6,7 +6,7 @@
6 6 <%= labelled_form_field _('Number of portal news'), select(:environment, :portal_news_amount, (0..10).to_a) %>
7 7 <%= labelled_form_field _('Number of news by folder'), select(:environment, :news_amount_by_folder, (1..10).to_a) %>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= submit_button(:save, _('Save')) %>
11 11 <%= button(:cancel, _('Cancel'), :action => 'index') %>
12 12 <% end %>
... ...
app/views/admin_panel/site_info.html.erb
... ... @@ -20,7 +20,7 @@
20 20 <% tabs << {:title => _('Signup introduction text'), :id => 'signup-intro',
21 21 :content => (render :partial => 'signup_intro', :locals => {:f => f})} %>
22 22 <%= render_tabs(tabs) %>
23   - <% button_bar do %>
  23 + <%= button_bar do %>
24 24 <%= submit_button(:save, _('Save'), :cancel => {:action => 'index'}) %>
25 25 <% end %>
26 26 <% end %>
... ...
app/views/box_organizer/_icon_selector.html.erb
... ... @@ -2,6 +2,8 @@
2 2 <%= hidden_field_tag 'block[links][][icon]', icon %>
3 3 <span class='icon-<%= icon %>' style='display:block; width:16px; height:16px;'></span>
4 4 <div class="icon-selector" style='display:none;'>
5   - <%= @block.icons_options.join %>
  5 + <% @block.icons.map do |i| %>
  6 + <%= content_tag('span', '', :title => i[1], :class => "icon-#{i[0]}", :onclick => "changeIcon(this, '#{i[0]}')") %>
  7 + <% end %>
6 8 </div>
7 9 </div>
... ...
app/views/box_organizer/edit.html.erb
... ... @@ -35,7 +35,7 @@
35 35 </div>
36 36 <% end %>
37 37  
38   - <% button_bar do %>
  38 + <%= button_bar do %>
39 39 <%= submit_button(:save, _('Save')) %>
40 40 <%= modal_close_button(_('Cancel')) %>
41 41 <% end %>
... ...
app/views/box_organizer/index.html.erb
... ... @@ -3,7 +3,7 @@
3 3  
4 4 <h1><%= _('Editing sideboxes')%></h1>
5 5  
6   -<% button_bar :class=>'design-menu' do %>
  6 +<%= button_bar :class=>'design-menu' do %>
7 7 <%= button(:back, _('Back to control panel'), :controller => (profile.nil? ? 'admin_panel': 'profile_editor')) %>
8 8 <% end %>
9 9  
... ...
app/views/categories/_form.html.erb
... ... @@ -28,7 +28,7 @@
28 28 <%= file_field_or_thumbnail(_('Image:'), @category.image, i) %>
29 29 <% end %>
30 30  
31   - <% button_bar do %>
  31 + <%= button_bar do %>
32 32 <%= submit_button('save', _('Save'), :cancel => {:action => 'index'}) %>
33 33 <% end%>
34 34 <% end %>
... ...
app/views/cms/_media_new_folder.html.erb
... ... @@ -9,7 +9,7 @@
9 9 <%= labelled_radio_button _('Folder'), :folder_type, 'Folder', false %>
10 10  
11 11 <%= labelled_form_field _('Name:'), text_field_tag(:new_folder, nil, 'data-url' => url_for({:action => 'new', :profile => profile.identifier})) %>
12   - <% button_bar do %>
  12 + <%= button_bar do %>
13 13 <%= submit_button(:newfolder, _('Create')) %>
14 14 <% end %>
15 15 <% end %>
... ...
app/views/cms/_text_fields.html.erb
1   -<%= labelled_form_field(_('Publish date'), date_field('article[published_at]', @article.published_at || DateTime.current, {:max_date => '+0d', :date_format => 'yy-mm-dd'}, {:id => "article_published_at"})) %>
  1 +<%= labelled_form_field(_('Publish date'), date_field('article[published_at]', @article.published_at || DateTime.current, {:max_date => '+0d', :time => true}, {:id => "article_published_at"})) %>
... ...
app/views/cms/_upload_file_form.html.erb
... ... @@ -12,7 +12,7 @@
12 12  
13 13 <%= hidden_field_tag('back_to', @back_to) %>
14 14  
15   -<% button_bar do %>
  15 +<%= button_bar do %>
16 16 <%= button_to_function :add, _('More files'), "add_new_file_fields()" %>
17 17 <% if @back_to %>
18 18 <%= submit_button :save, _('Upload'), :cancel => @back_to %>
... ...
app/views/cms/destroy.html.erb
... ... @@ -12,7 +12,7 @@
12 12 <% end %>
13 13 </strong>
14 14  
15   - <% button_bar do %>
  15 + <%= button_bar do %>
16 16 <%= submit_button :save, _('Yes, I want.') %>
17 17 <%= button :cancel, _("No, I don't want."), @article.url %>
18 18 <% end %>
... ...
app/views/cms/edit.html.erb
... ... @@ -21,7 +21,7 @@
21 21 </div>
22 22 <% end %>
23 23  
24   - <% button_bar do %>
  24 + <%= button_bar do %>
25 25 <%= submit_button :save, _('Save') %>
26 26 <%= submit_button :save, _('Save and continue'), :name => "continue" %>
27 27 <% end %>
... ... @@ -48,7 +48,7 @@
48 48 <%= options_for_article(@article, @tokenized_children) %>
49 49 </div>
50 50  
51   - <% button_bar do %>
  51 + <%= button_bar do %>
52 52 <%= submit_button :save, _('Save') %>
53 53  
54 54 <% if @back_to %>
... ...
app/views/cms/publish.html.erb
... ... @@ -25,7 +25,7 @@
25 25 <%= hidden_field_tag :back_to, @back_to %>
26 26 <%= labelled_form_field _('Title'), text_field_tag('name', @article.name) %>
27 27  
28   - <% button_bar do %>
  28 + <%= button_bar do %>
29 29 <%= submit_button 'spread', _('Spread this') %>
30 30 <% end %>
31 31 <% end %>
... ... @@ -41,7 +41,7 @@
41 41 <% search_action = url_for(:action => 'search_communities_to_publish') %>
42 42 <%= token_input_field_tag(:q, 'search-communities-to-publish', search_action, { :hint_text => _('Type in a search for your community'), :zindex => 10000, :focus => false }) %>
43 43 <%= labelled_form_field _('Title'), text_field_tag('name', @article.name) %>
44   - <% button_bar do %>
  44 + <%= button_bar do %>
45 45 <%= submit_button 'spread', _('Spread this') %>
46 46 <% end %>
47 47 <% end %>
... ... @@ -58,7 +58,7 @@
58 58 <%= hidden_field_tag :back_to, @back_to %>
59 59 <%= labelled_form_field _('Title'), text_field_tag('name', @article.name) %>
60 60  
61   - <% button_bar do %>
  61 + <%= button_bar do %>
62 62 <%= submit_button 'spread', _('Spread this') %>
63 63 <% end %>
64 64 <% end %>
... ...
app/views/cms/publish_on_portal_community.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= hidden_field_tag :back_to, @back_to %>
6 6 <%= labelled_text_field _('Title') + ': ', :name, @article.name, :style => 'width: 100%' %>
7 7  
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button 'spread', _('Spread this'), :cancel => @back_to %>
10 10 <% end %>
11 11 <% end %>
... ... @@ -14,7 +14,7 @@
14 14 <%= _("There is no portal community in this environment.") %>
15 15 </div>
16 16  
17   - <% button_bar do %>
  17 + <%= button_bar do %>
18 18 <%= button :back, _('Back'), :controller => 'cms' %>
19 19 <% end %>
20 20 <% end %>
... ...
app/views/cms/suggest_an_article.html.erb
... ... @@ -23,7 +23,7 @@
23 23  
24 24 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) unless logged_in? %>
25 25  
26   - <% button_bar do %>
  26 + <%= button_bar do %>
27 27 <%= submit_button :save, _('Save') %>
28 28 <%= button :cancel, _('Cancel'), @back_to %>
29 29 <% end %>
... ...
app/views/cms/view.html.erb
... ... @@ -14,7 +14,7 @@
14 14 </div>
15 15 <% end %>
16 16  
17   -<% button_bar(:style => 'margin-bottom: 1em;') do %>
  17 +<%= button_bar(:style => 'margin-bottom: 1em;') do %>
18 18 <% parent_id = ((@article && @article.allow_children?) ? @article : nil) %>
19 19  
20 20 <%= modal_button('new', _('New content'), url_for({:action => 'new', :parent_id => parent_id, :cms => true}).html_safe) %>
... ...
app/views/cms/why_categorize.html.erb
... ... @@ -4,6 +4,6 @@
4 4 <%= _('By categorizing your content, you increase the possibility that other people access it. When they are looking for, say, articles about Bahia and you categorize your article in "Regions/Bahia", then there is a good change that your article is going to be found.') %>
5 5 </p>
6 6  
7   -<% button_bar do %>
  7 +<%= button_bar do %>
8 8 <%= modal_close_button _('Close') %>
9 9 <% end %>
... ...
app/views/comment/_comment_form.html.erb
... ... @@ -8,7 +8,7 @@
8 8 <div id="recaptcha-container" style="display: none">
9 9 <h3><%= _('Please type the two words below') %></h3>
10 10 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %>
11   - <% button_bar do %>
  11 + <%= button_bar do %>
12 12 <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %>
13 13 <%= button_to_function :cancel, _('Cancel'), "noosfero.modal.close()" %>
14 14 <% end %>
... ... @@ -87,7 +87,7 @@ function check_captcha(button, confirm_action) {
87 87  
88 88 <%= safe_join(@plugins.dispatch(:comment_form_extra_contents, local_assigns.merge(:comment => @comment)).collect { |content| instance_exec(&content) }, "") %>
89 89  
90   - <% button_bar do %>
  90 + <%= button_bar do %>
91 91 <%= submit_button('add', _('Post comment'), :onclick => "if(check_captcha(this)) { save_comment(this) } else { check_captcha(this, save_comment)};return false;") %>
92 92 <% if !edition_mode %>
93 93 <%= button :cancel, _('Cancel'), '', :id => 'cancel-comment' %>
... ...
app/views/content_viewer/_comment_form.html.erb
... ... @@ -36,7 +36,7 @@ function submit_comment_form(button) {
36 36 <div id="recaptcha-container" style="display: none">
37 37 <h3><%= _('Please type the two words below') %></h3>
38 38 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %>
39   - <% button_bar do %>
  39 + <%= button_bar do %>
40 40 <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %>
41 41 <%= button_to_function :cancel, _('Cancel'), "noosfero.modal.close()" %>
42 42 <% end %>
... ... @@ -73,7 +73,7 @@ function submit_comment_form(button) {
73 73 <%= hidden_field_tag(:confirm, 'false') %>
74 74 <%= hidden_field_tag(:view, params[:view])%>
75 75  
76   - <% button_bar do %>
  76 + <%= button_bar do %>
77 77 <%= submit_button('add', _('Post comment'), :onclick => "submit_comment_form(this); return false") %>
78 78 <% if cancel_triggers_hide %>
79 79 <%= button :cancel, _('Cancel'), '', :id => 'cancel-comment' %>
... ...
app/views/content_viewer/_confirm_unfollow.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= form_tag(@page.view_url.merge({:only_path => true}), {:method => 'post', :class => 'comment_form'}) do %>
6 6 <%= hidden_field_tag(:unfollow, 'commit') %>
7 7 <%= labelled_form_field(_('Enter your e-Mail'), text_field_tag(:email, nil, {:size => 40})) %>
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button(:ok, _('Cancel notifications for e-mail above') ) %>
10 10 <% end %>
11 11 <% end %>
... ...
app/views/content_viewer/blog_page.html.erb
... ... @@ -4,7 +4,7 @@
4 4  
5 5 <div>
6 6 <div class='blog-description'>
7   - <%= blog.body %>
  7 + <%= (blog.body || '').html_safe %>
8 8 </div>
9 9 </div>
10 10 <hr class="pre-posts"/>
... ...
app/views/content_viewer/forum_page.html.erb
... ... @@ -16,7 +16,7 @@
16 16 <p><%= @page.terms_of_use %></p>
17 17  
18 18 <%= form_tag @page.url.merge(:terms_accepted => true) do %>
19   - <% button_bar do %>
  19 + <%= button_bar do %>
20 20 <% if user %>
21 21 <%= submit_button :save, _("Accept") %>
22 22 <% else %>
... ...
app/views/enterprise_registration/basic_information.html.erb
... ... @@ -8,7 +8,7 @@
8 8 <%= _('There are no validators to validate the registration of this new enterprise. Contact your administrator for instructions.') %>
9 9 </div>
10 10  
11   - <% button_bar do %>
  11 + <%= button_bar do %>
12 12 <%= button :back, _('Go back'), { :profile => current_user.person.identifier, :action=>"enterprises", :controller=>"profile" }%>
13 13 <% end %>
14 14 <% else %>
... ... @@ -36,7 +36,7 @@
36 36  
37 37 <%= template_options(:enterprises, 'create_enterprise')%>
38 38  
39   - <% button_bar do %>
  39 + <%= button_bar do %>
40 40 <%= submit_button('next', _('Next'), :cancel => {:profile => current_user.person.identifier, :action=>"enterprises", :controller=>"profile"}) %>
41 41 <% end %>
42 42 <% end %>
... ...
app/views/enterprise_registration/creation.html.erb
... ... @@ -4,7 +4,7 @@
4 4  
5 5 <%= render :partial => 'shared/template_welcome_page', :locals => {:template => @enterprise.template, :header => _("What can I do with a %s?")} %>
6 6  
7   -<% button_bar do %>
  7 +<%= button_bar do %>
8 8 <%= button :back, _('Back'), {:controller => 'memberships', :action => 'index', :profile => user.identifier} %>
9 9 <% end %>
10 10  
... ...
app/views/enterprise_registration/select_validator.html.erb
... ... @@ -22,7 +22,7 @@
22 22 <% end %>
23 23 </table>
24 24  
25   - <% button_bar do %>
  25 + <%= button_bar do %>
26 26 <%= submit_button 'save', _('Confirm') %>
27 27 <% end %>
28 28 <% end %>
... ...
app/views/enterprise_validation/details.html.erb
... ... @@ -15,7 +15,7 @@
15 15 <p><%= _('If this enterprise passes the criteria to be considered an solidarity enconomy enterprise, you can approve it by click the button below.') %></p>
16 16  
17 17 <%= form_tag :action => 'approve', :id => @pending.code do %>
18   - <% button_bar do %>
  18 + <%= button_bar do %>
19 19 <%= submit_button('approve', _('Approve')) %>
20 20 <% end %>
21 21 <% end %>
... ... @@ -27,7 +27,7 @@
27 27 <%= form_tag :action => 'reject', :id => @pending.code do %>
28 28 <%= labelled_form_field(_('Please provide an explanation for the rejection. This explanation will be sent to the requestor (required).'), text_area_tag('reject_explanation'))%>
29 29 <div>
30   - <% button_bar do %>
  30 + <%= button_bar do %>
31 31 <%= submit_button('reject', _('Reject')) %>
32 32 <% end %>
33 33 </div>
... ...
app/views/enterprise_validation/edit_validation_info.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= labelled_form_for :info do |f| %>
6 6 <%= f.text_area(:validation_methodology, :cols => 50, :rows => 10) %>
7 7 <%= f.text_area(:restrictions, :cols => 50, :rows => 7) %>
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button('save', _('Save'), :cancel => {:action => 'index'}) %>
10 10 <% end %>
11 11 <% end %>
... ...
app/views/enterprise_validation/index.html.erb
1 1 <h1><%= _('Enterprise validations') %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:edit, _('Edit validation info'), { :action => 'edit_validation_info' }) %>
5 5 <%= button(:back, _('Go Back'), { :controller => 'profile_editor' }) %>
6 6 <% end %>
... ...
app/views/environment_role_manager/affiliate.html.erb
... ... @@ -3,7 +3,7 @@
3 3 <%= form_tag( {:action => 'give_role'}, {:method => :post}) do %>
4 4 <%= select_tag 'role', options_for_select(@roles.map{|r|[r.name,r.id]}) %>
5 5 <%= hidden_field_tag 'person', current_user.person.id %>
6   - <% button_bar do %>
  6 + <%= button_bar do %>
7 7 <%= submit_button('affiliate', _('Affiliate', :cancel => {:action => 'index'}) %>
8 8 <% end %>
9 9 <% end %>
... ...
app/views/environment_role_manager/change_role.html.erb
... ... @@ -7,7 +7,7 @@
7 7 <% end %>
8 8 <%= hidden_field_tag 'person', @admin.id %>
9 9  
10   - <% button_bar do %>
  10 + <%= button_bar do %>
11 11 <%= submit_button('save', _('Save changes'), :cancel => {:action => 'index'}) %>
12 12 <% end %>
13 13 <% end %>
... ...
app/views/environment_role_manager/make_admin.html.erb
... ... @@ -9,7 +9,7 @@
9 9 <% @roles.each do |r| %>
10 10 <%= labelled_form_field(r.name, (check_box_tag "roles[]", r.id)) %>
11 11 <% end %>
12   - <% button_bar do %>
  12 + <%= button_bar do %>
13 13 <%= submit_button( 'save', _('Make'), :cancel => {:action => 'index'} ) %>
14 14 <% end %>
15 15 <% end %>
... ...
app/views/environment_themes/index.html.erb
... ... @@ -3,6 +3,6 @@
3 3  
4 4 <br style="clear:both" />
5 5  
6   -<% button_bar do %>
  6 +<%= button_bar do %>
7 7 <%= button(:back, _('Back'), :controller => 'admin_panel', :action => 'index') %>
8 8 <% end %>
... ...
app/views/favorite_enterprises/index.html.erb
... ... @@ -23,7 +23,7 @@
23 23 </p>
24 24 <% end %>
25 25  
26   -<% button_bar do %>
  26 +<%= button_bar do %>
27 27 <%= button(:back, _('Go back'), :controller => 'profile_editor') %>
28 28 <% end %>
29 29  
... ...
app/views/features/_manage_community_fields.html.erb
... ... @@ -55,7 +55,7 @@
55 55 </script>
56 56  
57 57 <div>
58   - <% button_bar do %>
  58 + <%= button_bar do %>
59 59 <%= submit_button('save', _('Save changes'), :id=>"save_community_fields") %>
60 60 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
61 61 <% end %>
... ...
app/views/features/_manage_custom_fields.html.erb
... ... @@ -22,7 +22,7 @@
22 22 </fieldset>
23 23 </div>
24 24  
25   -<% button_bar do %>
  25 +<%= button_bar do %>
26 26 <%= button(:save, _('Save'), 'javascript: void()', :onClick => "submit_custom_field_form('##{format_values_id}', '##{form_id}');") %>
27 27 <% end %>
28 28  
... ...
app/views/features/_manage_enterprise_fields.html.erb
... ... @@ -55,7 +55,7 @@
55 55 </script>
56 56  
57 57 <div>
58   - <% button_bar do %>
  58 + <%= button_bar do %>
59 59 <%= submit_button('save', _('Save changes'), :id=>"save_enterprise_fields") %>
60 60 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
61 61 <% end %>
... ...
app/views/features/_manage_person_fields.html.erb
... ... @@ -55,7 +55,7 @@
55 55 </script>
56 56  
57 57 <div>
58   - <% button_bar do %>
  58 + <%= button_bar do %>
59 59 <%= submit_button('save', _('Save changes'), :id=>"save_person_fields") %>
60 60 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
61 61 <% end %>
... ...
app/views/features/custom_fields/_form.html.erb
... ... @@ -29,7 +29,7 @@
29 29 </tr>
30 30 </thead>
31 31 <tfoot>
32   - <tr><td colspan=3><%= button(:add, _('Add option'), 'javascript: void()', :id => "btn_opt_#{id}", :onclick => "add_content('##{id} .custom-field-extras', $('#btn_opt_#{id}').attr('value'), 'EXTRAS_ID');", :value => "#{render_extras_field(id)}") %></td></tr>
  32 + <tr><td colspan=3><%= button(:add, _('Add option'), 'javascript: void()', :id => "btn_opt_#{id}", :onclick => "add_content('##{id} .custom-field-extras', $('#btn_opt_#{id}').attr('value'), 'EXTRAS_ID');", :value => "#{render_extras_field(id)}".html_safe) %></td></tr>
33 33 </tfoot>
34 34 <tbody class="custom-field-extras">
35 35 <% if !field.extras.blank?%>
... ...
app/views/features/index.html.erb
... ... @@ -69,7 +69,7 @@ Check all the features you want to enable for your environment, uncheck all the
69 69 <hr/>
70 70  
71 71 <div>
72   - <% button_bar do %>
  72 + <%= button_bar do %>
73 73 <%= submit_button('save', _('Save changes')) %>
74 74 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel', :action => 'index' %>
75 75 <% end %>
... ...
app/views/friends/connections.html.erb
1 1 <h1><%= _("Connections with %s") % @suggestion.suggestion.name %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:back, _('Go to friends list'), :controller => 'friends') %>
5 5 <% end %>
6 6  
... ...
app/views/friends/index.html.erb
... ... @@ -12,7 +12,7 @@
12 12 </p>
13 13 <% end %>
14 14  
15   - <% button_bar do %>
  15 + <%= button_bar do %>
16 16 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %>
17 17 <%= button(:search, _('Find people'), :controller => 'search', :action => 'assets', :asset => 'people') %>
18 18 <% unless @plugins.dispatch(:remove_invite_friends_button).include?(true) %>
... ...
app/views/friends/suggest.html.erb
1 1 <h1><%= _("Friends suggestions for %s") % profile.name %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:back, _('Go to friends list'), :controller => 'friends') %>
5 5 <% end %>
6 6  
... ...
app/views/invite/_select_address_book.html.erb
... ... @@ -34,7 +34,7 @@
34 34 <%= labelled_form_field(_("Password") + ":", password_field_tag(:password)) %>
35 35 </div>
36 36  
37   - <% button_bar do %>
  37 + <%= button_bar do %>
38 38 <%= submit_button(:forward, _("Next")) %>
39 39 <% end %>
40 40 <p><%= _("We won't store your password or contact anyone without your permission.") %></p>
... ...
app/views/invite/invite_friends.html.erb
... ... @@ -24,7 +24,7 @@
24 24 { :hint_text => _('Type in the person\'s %{search_fields}') % {:search_fields => @search_fields},
25 25 :focus => false }) %>
26 26  
27   - <% button_bar do %>
  27 + <%= button_bar do %>
28 28 <%= submit_button('save', _('Invite'))%>
29 29 <%= button('cancel', _('Cancel'), profile.url)%>
30 30 <% end %>
... ...
app/views/invite/select_friends.html.erb
... ... @@ -32,7 +32,7 @@
32 32  
33 33 <%= render :partial => 'invite/personalize_invitation_mail', :locals => {:mail_template => @mail_template } %>
34 34  
35   - <% button_bar do %>
  35 + <%= button_bar do %>
36 36 <%= submit_button(:ok, _("Invite!")) %>
37 37 <% end %>
38 38 <% end %>
... ...
app/views/licenses/_form.html.erb
... ... @@ -5,7 +5,7 @@
5 5 <%= required labelled_form_field(_('Name'), f.text_field(:name)) %>
6 6 <%= labelled_form_field(_('License url'), f.text_field(:url)) %>
7 7  
8   - <% button_bar do %>
  8 + <%= button_bar do %>
9 9 <%= submit_button('save', _('Save'))%>
10 10 <%= button('cancel', _('Cancel'), {:action => 'index'})%>
11 11 <% end %>
... ...
app/views/licenses/index.html.erb
... ... @@ -16,7 +16,7 @@
16 16 <% end %>
17 17 </table>
18 18  
19   -<% button_bar do %>
  19 +<%= button_bar do %>
20 20 <%= button(:add, _('Add a new license'), :action => 'create')%>
21 21 <%= button :back, _('Back to admin panel'), :controller => 'admin_panel' %>
22 22 <% end %>
... ...
app/views/mailconf/index.html.erb
... ... @@ -6,7 +6,7 @@
6 6  
7 7 <p><%= _('You already request activation of your mailbox. Please wait until an administrator approves your request.') %></p>
8 8  
9   - <% button_bar do %>
  9 + <%= button_bar do %>
10 10 <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
11 11 <% end %>
12 12  
... ... @@ -21,10 +21,10 @@
21 21 <h2><%= _('Configuration') %></h2>
22 22 <ul>
23 23 <li>
24   - <%= link_to _('Mail configuration for POP and IMAP'), 'http://www.ynternet.org/move/infos-technique-pour-utiliser-multypass-pop3-smtp-imap-ftp-quotas...' %>
  24 + <%= link_to _('Mail configuration for POP and IMAP'), 'http://www.ynternet.org/move/infos-technique-pour-utiliser-multypass-pop3-smtp-imap-ftp-quotas...' %>
25 25 </li>
26 26 </ul>
27   - <% button_bar do %>
  27 + <%= button_bar do %>
28 28 <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
29 29 <% end %>
30 30  
... ... @@ -33,7 +33,7 @@
33 33 <h2><%= _("Enable e-Mail account below:") %></h2>
34 34 <ul><%= safe_join(profile.email_addresses.map{|i| content_tag('li', i)}, "\n") %></ul>
35 35 <blockquote><%= _("You'll be able to access a webmail from your user menu.") %></blockquote>
36   - <% button_bar do %>
  36 + <%= button_bar do %>
37 37 <%= button(:ok, _('Enable e-Mail'), { :action => 'enable' }, :method => 'post') %>
38 38 <%= button :back, _('Back to control panel'), :controller => 'profile_editor' %>
39 39 <% end %>
... ...
app/views/maps/edit_location.html.erb
... ... @@ -11,7 +11,7 @@
11 11 <%= labelled_form_field _('City'), f.text_field(:city) %>
12 12 <%= labelled_form_field _('ZIP code'), text_field(:profile_data, :zip_code) %>
13 13 <%= labelled_form_field _('Address (street and number)'), text_field(:profile_data, :address) %>
14   - <% button_bar do %>
  14 + <%= button_bar do %>
15 15 <%= button_to_function :search, _('Locate in the map'), "addressToPoint()", :title => _("Locate the address informed above in the map below (note that you'll probably need to adjust the marker to get a precise position)") %>
16 16 <%= submit_button 'save', _('Save') %>
17 17 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %>
... ...
app/views/memberships/connections.html.erb
1 1 <h1><%= _("Connections with %s") % @suggestion.suggestion.name %></h1>
2 2  
3   -<% button_bar do %>
  3 +<%= button_bar do %>
4 4 <%= button(:back, _('Go to groups list'), :controller => 'memberships') %>
5 5 <% end %>
6 6  
... ...
app/views/memberships/index.html.erb
... ... @@ -2,7 +2,7 @@
2 2  
3 3 <h1><%= _('Manage my groups') %></h1>
4 4  
5   -<% button_bar do %>
  5 +<%= button_bar do %>
6 6 <%= button(:add, _('Create a new community'), :controller => 'memberships', :action => 'new_community') %>
7 7 <%= button :add, _('Register a new enterprise'), :controller => 'enterprise_registration' if environment.enabled?('enterprise_registration') %>
8 8 <%= button :back, _('Go back'), :controller => 'profile_editor' %>
... ...