Commit 4c381ac2e65742587ce267f679a35bf4ad803c1c

Authored by Evandro Junior
2 parents 04566995 4e9c7fe3

Merge branch 'master' into I4-Video-Gallery-Plugin

Showing 776 changed files with 58370 additions and 34996 deletions   Show diff stats

Too many changes.

To preserve performance only 100 of 776 files displayed.

@@ -120,16 +120,21 @@ Diego Araujo + Rodrigo Souto + Rafael Manzo <rr.manzo@gmail.com> @@ -120,16 +120,21 @@ Diego Araujo + Rodrigo Souto + Rafael Manzo <rr.manzo@gmail.com>
120 Diego + Jefferson <diegoamc90@gmail.com> 120 Diego + Jefferson <diegoamc90@gmail.com>
121 Diego Martinez <diegoamc90@gmail.com> 121 Diego Martinez <diegoamc90@gmail.com>
122 Diego + Renan <renanteruoc@gmail.com> 122 Diego + Renan <renanteruoc@gmail.com>
  123 +DylanGuedes <djmgguedes@gmail.com>
  124 +Eduardo Passos <eduardo@risa.localdomain.localhost>
  125 +Eduardo Passos <eduardosteps@gmail.com>
123 Eduardo Tourinho Edington <eduardo.edington@serpro.gov.br> 126 Eduardo Tourinho Edington <eduardo.edington@serpro.gov.br>
124 Evandro Jr <evandrojr@gmail.com> 127 Evandro Jr <evandrojr@gmail.com>
125 Evandro Junior <evandrojr@gmail.com> 128 Evandro Junior <evandrojr@gmail.com>
126 Fabio Teixeira <fabio1079@gmail.com> 129 Fabio Teixeira <fabio1079@gmail.com>
  130 +FAMMA TV NOTICIAS MEDIOS DE CO <revistafammatvmusic.oficial@gmail.com>
127 Fernanda Lopes <nanda.listas+psl@gmail.com> 131 Fernanda Lopes <nanda.listas+psl@gmail.com>
128 Francisco Marcelo A. Lima Júnior <francisco.lima-junior@serpro.gov.br> 132 Francisco Marcelo A. Lima Júnior <francisco.lima-junior@serpro.gov.br>
129 Francisco Marcelo de Araujo Lima Junior <79350259591@serpro-1457614.(none)> 133 Francisco Marcelo de Araujo Lima Junior <79350259591@serpro-1457614.(none)>
130 Francisco Marcelo de Araújo Lima Júnior <francisco.lima-junior@serpro.gov.br> 134 Francisco Marcelo de Araújo Lima Júnior <francisco.lima-junior@serpro.gov.br>
131 Francisco Marcelo de Araújo Lima Júnior <maljunior@gmail.com> 135 Francisco Marcelo de Araújo Lima Júnior <maljunior@gmail.com>
132 Gabriela Navarro <navarro1703@gmail.com> 136 Gabriela Navarro <navarro1703@gmail.com>
  137 +Gonzalo Exequiel Pedone <hipersayan.x@gmail.com>
133 Grazieno Pellegrino <grazieno@gmail.com> 138 Grazieno Pellegrino <grazieno@gmail.com>
134 Gust <darksshades@hotmail.com> 139 Gust <darksshades@hotmail.com>
135 Hebert Douglas <hebertdougl@gmail.com> 140 Hebert Douglas <hebertdougl@gmail.com>
@@ -186,18 +191,23 @@ Leandro Nunes dos Santos &lt;81665687568@serpro-1541727.(none)&gt; @@ -186,18 +191,23 @@ Leandro Nunes dos Santos &lt;81665687568@serpro-1541727.(none)&gt;
186 Leandro Nunes dos Santos <leandronunes@gmail.com> 191 Leandro Nunes dos Santos <leandronunes@gmail.com>
187 Leandro Nunes dos Santos <leandro.santos@serpro.gov.br> 192 Leandro Nunes dos Santos <leandro.santos@serpro.gov.br>
188 LinguÁgil 2010 <linguagil.bahia@gmail.com> 193 LinguÁgil 2010 <linguagil.bahia@gmail.com>
  194 +Lucas Kanashiro <kanashiro.duarte@gmail.com>
189 Lucas Melo <lucas@colivre.coop.br> 195 Lucas Melo <lucas@colivre.coop.br>
190 Lucas Melo <lucaspradomelo@gmail.com> 196 Lucas Melo <lucaspradomelo@gmail.com>
191 Luciano <lucianopcbr@gmail.com> 197 Luciano <lucianopcbr@gmail.com>
192 Luciano Prestes Cavalcanti <lucianopcbr@gmail.com> 198 Luciano Prestes Cavalcanti <lucianopcbr@gmail.com>
193 Luis David Aguilar Carlos <ludwig9003@gmail.com> 199 Luis David Aguilar Carlos <ludwig9003@gmail.com>
194 Luiz Fernando de Freitas Matos <luiz@luizff.matos@gmail.com> 200 Luiz Fernando de Freitas Matos <luiz@luizff.matos@gmail.com>
  201 +Marcos <marcos.rpj2@gmail.com>
195 Marcos Ramos <ms.ramos@outlook.com> 202 Marcos Ramos <ms.ramos@outlook.com>
196 Martín Olivera <molivera@solar.org.ar> 203 Martín Olivera <molivera@solar.org.ar>
  204 +Maurilio Atila <cabelotaina@gmail.com>
  205 +M for Momo <mo@rtnp.org>
197 Michal Čihař <michal@cihar.com> 206 Michal Čihař <michal@cihar.com>
198 Moises Machado <moises@colivre.coop.br> 207 Moises Machado <moises@colivre.coop.br>
199 Naíla Alves <naila@colivre.coop.br> 208 Naíla Alves <naila@colivre.coop.br>
200 Nanda Lopes <nanda.listas+psl@gmail.com> 209 Nanda Lopes <nanda.listas+psl@gmail.com>
  210 +Niemand Jedermann <predatorix@web.de>
201 Parley Martins <parleypachecomartins@gmail.com> 211 Parley Martins <parleypachecomartins@gmail.com>
202 Paulo Meirelles + Alessandro Palmeira + João M. M. da Silva <paulo@softwarelivre.org> 212 Paulo Meirelles + Alessandro Palmeira + João M. M. da Silva <paulo@softwarelivre.org>
203 Paulo Meirelles + Alessandro Palmeira <paulo@softwarelivre.org> 213 Paulo Meirelles + Alessandro Palmeira <paulo@softwarelivre.org>
@@ -234,8 +244,11 @@ Ronny Kursawe &lt;kursawe.ronny@googlemail.com&gt; @@ -234,8 +244,11 @@ Ronny Kursawe &lt;kursawe.ronny@googlemail.com&gt;
234 root <root@debian.sdr.serpro> 244 root <root@debian.sdr.serpro>
235 Samuel R. C. Vale <srcvale@holoscopio.com> 245 Samuel R. C. Vale <srcvale@holoscopio.com>
236 Tallys Martins <tallysmartins@gmail.com> 246 Tallys Martins <tallysmartins@gmail.com>
  247 +Tallys Martins <tallysmartins@yahoo.com.br>
  248 +tallys <tallys@tallys>
237 tallys <tallys@tallys.(none)> 249 tallys <tallys@tallys.(none)>
238 Thiago Zoroastro <thiago.zoroastro@bol.com.br> 250 Thiago Zoroastro <thiago.zoroastro@bol.com.br>
  251 +Tuux <tuxa@galaxie.eu.org>
239 Valessio Brito <contato@valessiobrito.com.br> 252 Valessio Brito <contato@valessiobrito.com.br>
240 Valessio Brito <contato@valessiobrito.info> 253 Valessio Brito <contato@valessiobrito.info>
241 Valessio Brito <valessio@gmail.com> 254 Valessio Brito <valessio@gmail.com>
@@ -2,9 +2,7 @@ source &quot;https://rubygems.org&quot; @@ -2,9 +2,7 @@ source &quot;https://rubygems.org&quot;
2 gem 'rails', '~> 3.2.21' 2 gem 'rails', '~> 3.2.21'
3 gem 'minitest', '~> 3.2.0' 3 gem 'minitest', '~> 3.2.0'
4 gem 'fast_gettext', '~> 0.6.8' 4 gem 'fast_gettext', '~> 0.6.8'
5 -gem 'acts-as-taggable-on', '~> 3.0.2'  
6 -gem 'prototype-rails', '~> 3.2.1'  
7 -gem 'prototype_legacy_helper', '0.0.0', :path => 'vendor/prototype_legacy_helper' 5 +gem 'acts-as-taggable-on', '~> 3.4.2'
8 gem 'rails_autolink', '~> 1.1.5' 6 gem 'rails_autolink', '~> 1.1.5'
9 gem 'pg', '~> 0.13.2' 7 gem 'pg', '~> 0.13.2'
10 gem 'rmagick', '~> 2.13.1' 8 gem 'rmagick', '~> 2.13.1'
@@ -13,18 +11,14 @@ gem &#39;will_paginate&#39;, &#39;~&gt; 3.0.3&#39; @@ -13,18 +11,14 @@ gem &#39;will_paginate&#39;, &#39;~&gt; 3.0.3&#39;
13 gem 'ruby-feedparser', '~> 0.7' 11 gem 'ruby-feedparser', '~> 0.7'
14 gem 'daemons', '~> 1.1.5' 12 gem 'daemons', '~> 1.1.5'
15 gem 'thin', '~> 1.3.1' 13 gem 'thin', '~> 1.3.1'
16 -gem 'hpricot', '~> 0.8.6'  
17 gem 'nokogiri', '~> 1.5.5' 14 gem 'nokogiri', '~> 1.5.5'
18 gem 'rake', :require => false 15 gem 'rake', :require => false
19 gem 'rest-client', '~> 1.6.7' 16 gem 'rest-client', '~> 1.6.7'
20 gem 'exception_notification', '~> 4.0.1' 17 gem 'exception_notification', '~> 4.0.1'
21 -gem 'gettext', '~> 2.2.1', :require => false, :group => :development 18 +gem 'gettext', '~> 2.2.1', :require => false
22 gem 'locale', '~> 2.0.5' 19 gem 'locale', '~> 2.0.5'
23 -  
24 gem 'whenever', :require => false 20 gem 'whenever', :require => false
25 -  
26 -# FIXME list here all actual dependencies (i.e. the ones in debian/control),  
27 -# with their GEM names (not the Debian package names) 21 +gem 'eita-jrails', '>= 0.9.5', :require => 'jrails'
28 22
29 group :production do 23 group :production do
30 gem 'dalli', '~> 2.7.0' 24 gem 'dalli', '~> 2.7.0'
@@ -44,6 +38,9 @@ group :cucumber do @@ -44,6 +38,9 @@ group :cucumber do
44 gem 'selenium-webdriver', '~> 2.39.0' 38 gem 'selenium-webdriver', '~> 2.39.0'
45 end 39 end
46 40
  41 +# Requires custom dependencies
  42 +eval(File.read('config/Gemfile'), binding) rescue nil
  43 +
47 # include gemfiles from enabled plugins 44 # include gemfiles from enabled plugins
48 # plugins in baseplugins/ are not included on purpose. They should not have any 45 # plugins in baseplugins/ are not included on purpose. They should not have any
49 # dependencies. 46 # dependencies.
@@ -21,7 +21,7 @@ Noosfero is written in Ruby with the &quot;[Rails framework](http://www.rubyonrails.o @@ -21,7 +21,7 @@ Noosfero is written in Ruby with the &quot;[Rails framework](http://www.rubyonrails.o
21 You need to install some packages Noosfero depends on. On Debian GNU/Linux or Debian-based systems, all of these packages are available through the Debian archive. You can install them with the following command: 21 You need to install some packages Noosfero depends on. On Debian GNU/Linux or Debian-based systems, all of these packages are available through the Debian archive. You can install them with the following command:
22 22
23 # apt-get install ruby rake po4a libgettext-ruby-util libgettext-ruby1.8 \ 23 # apt-get install ruby rake po4a libgettext-ruby-util libgettext-ruby1.8 \
24 - libsqlite3-ruby rcov librmagick-ruby libredcloth-ruby libhpricot-ruby \ 24 + libsqlite3-ruby rcov librmagick-ruby libredcloth-ruby \
25 libwill-paginate-ruby iso-codes libfeedparser-ruby libdaemons-ruby thin \ 25 libwill-paginate-ruby iso-codes libfeedparser-ruby libdaemons-ruby thin \
26 tango-icon-theme 26 tango-icon-theme
27 27
@@ -40,7 +40,6 @@ On other systems, they may or may not be available through your regular package @@ -40,7 +40,6 @@ On other systems, they may or may not be available through your regular package
40 * Daemons - http://daemons.rubyforge.org 40 * Daemons - http://daemons.rubyforge.org
41 * Thin: http://code.macournoyer.com/thin 41 * Thin: http://code.macournoyer.com/thin
42 * tango-icon-theme: http://tango.freedesktop.org/Tango_Icon_Library 42 * tango-icon-theme: http://tango.freedesktop.org/Tango_Icon_Library
43 -* Hpricot: http://hpricot.com  
44 43
45 If you manage to install Noosfero successfully on other systems than Debian, 44 If you manage to install Noosfero successfully on other systems than Debian,
46 please feel free to contact the Noosfero development mailing with the 45 please feel free to contact the Noosfero development mailing with the
INSTALL.multitenancy.md
@@ -26,7 +26,7 @@ The file config/database.yml must follow a structure in order to achieve multite @@ -26,7 +26,7 @@ The file config/database.yml must follow a structure in order to achieve multite
26 26
27 Each "hosted" environment must have an entry like this: 27 Each "hosted" environment must have an entry like this:
28 28
29 - env1_production: 29 + env1_production: &DEFAULT
30 adapter: postgresql 30 adapter: postgresql
31 encoding: unicode 31 encoding: unicode
32 database: noosfero 32 database: noosfero
@@ -61,7 +61,7 @@ The &quot;hosted&quot; environments define, besides the `schema_search_path`, a list of do @@ -61,7 +61,7 @@ The &quot;hosted&quot; environments define, besides the `schema_search_path`, a list of do
61 You must also tell the application which is the default environment. 61 You must also tell the application which is the default environment.
62 62
63 production: 63 production:
64 - env1_production 64 + <<: *DEFAULT
65 65
66 On the example above there are only three hosted environments, but it can be more than three. The schemas `env2` and `env3` must already exist in the same database of the hosting environment. As postgres user, you can create them typing: 66 On the example above there are only three hosted environments, but it can be more than three. The schemas `env2` and `env3` must already exist in the same database of the hosting environment. As postgres user, you can create them typing:
67 67
Rakefile.release 0 → 100644
@@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
  1 +# This Rakefile is intentionally independent from Rails to it can be used to
  2 +# handle release-related tasks without having to load the entire Rails
  3 +# environment (which is slow, requires a database connection and several other
  4 +# inconveniences).
  5 +
  6 +$: << 'lib'
  7 +require 'noosfero'
  8 +require 'noosfero/version'
  9 +
  10 +load 'lib/tasks/gettext.rake'
  11 +load 'lib/tasks/doc.rake'
  12 +load 'lib/tasks/error_messages.rake'
  13 +load 'lib/tasks/translation.rake'
  14 +
  15 +load 'lib/tasks/package.rake'
  16 +load 'lib/tasks/release.rake'
  17 +
  18 +task :default => 'noosfero:translations:compile'
SECURITY.md 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +# Noosfero security
  2 +
  3 +## Reporting security issues in Noosfero
  4 +
  5 +Security vulnerabilities should be reported via an email to
  6 +noosfero-security@listas.softwarelivre.org, which ia a private mailing list.
  7 +Reported problems will be published after fixes are available.
  8 +
  9 +The members of the mailing list are people who provide Noosfero (Noosfero
  10 +committers, mainly).
app/controllers/admin/admin_panel_controller.rb
@@ -87,6 +87,6 @@ class AdminPanelController &lt; AdminController @@ -87,6 +87,6 @@ class AdminPanelController &lt; AdminController
87 scope = scope.order('name ASC') 87 scope = scope.order('name ASC')
88 88
89 @q = params[:q] 89 @q = params[:q]
90 - @collection = find_by_contents(:organizations, scope, @q, {:per_page => 10, :page => params[:npage]})[:results] 90 + @collection = find_by_contents(:organizations, environment, scope, @q, {:per_page => 10, :page => params[:npage]})[:results]
91 end 91 end
92 end 92 end
app/controllers/application_controller.rb
@@ -28,6 +28,7 @@ class ApplicationController &lt; ActionController::Base @@ -28,6 +28,7 @@ class ApplicationController &lt; ActionController::Base
28 unless environment.access_control_allow_methods.blank? 28 unless environment.access_control_allow_methods.blank?
29 response.headers["Access-Control-Allow-Methods"] = environment.access_control_allow_methods 29 response.headers["Access-Control-Allow-Methods"] = environment.access_control_allow_methods
30 end 30 end
  31 + response.headers["Access-Control-Allow-Credentials"] = 'true'
31 elsif environment.restrict_to_access_control_origins 32 elsif environment.restrict_to_access_control_origins
32 render_access_denied _('Origin not in allowed.') 33 render_access_denied _('Origin not in allowed.')
33 end 34 end
@@ -59,15 +60,7 @@ class ApplicationController &lt; ActionController::Base @@ -59,15 +60,7 @@ class ApplicationController &lt; ActionController::Base
59 helper :document 60 helper :document
60 helper :language 61 helper :language
61 62
62 - def self.no_design_blocks  
63 - @no_design_blocks = true  
64 - end  
65 - def self.uses_design_blocks?  
66 - !@no_design_blocks  
67 - end  
68 - def uses_design_blocks?  
69 - !@no_design_blocks && self.class.uses_design_blocks?  
70 - end 63 + include DesignHelper
71 64
72 # Be sure to include AuthenticationSystem in Application Controller instead 65 # Be sure to include AuthenticationSystem in Application Controller instead
73 include AuthenticatedSystem 66 include AuthenticatedSystem
app/controllers/public/chat_controller.rb
@@ -6,6 +6,7 @@ class ChatController &lt; PublicController @@ -6,6 +6,7 @@ class ChatController &lt; PublicController
6 def start_session 6 def start_session
7 login = user.jid 7 login = user.jid
8 password = current_user.crypted_password 8 password = current_user.crypted_password
  9 + session[:chat] ||= {:rooms => []}
9 begin 10 begin
10 jid, sid, rid = RubyBOSH.initialize_session(login, password, "http://#{environment.default_hostname}/http-bind", 11 jid, sid, rid = RubyBOSH.initialize_session(login, password, "http://#{environment.default_hostname}/http-bind",
11 :wait => 30, :hold => 1, :window => 5) 12 :wait => 30, :hold => 1, :window => 5)
@@ -16,6 +17,31 @@ class ChatController &lt; PublicController @@ -16,6 +17,31 @@ class ChatController &lt; PublicController
16 end 17 end
17 end 18 end
18 19
  20 + def toggle
  21 + session[:chat][:status] = session[:chat][:status] == 'opened' ? 'closed' : 'opened'
  22 + render :nothing => true
  23 + end
  24 +
  25 + def tab
  26 + session[:chat][:tab_id] = params[:tab_id]
  27 + render :nothing => true
  28 + end
  29 +
  30 + def join
  31 + session[:chat][:rooms] << params[:room_id]
  32 + session[:chat][:rooms].uniq!
  33 + render :nothing => true
  34 + end
  35 +
  36 + def leave
  37 + session[:chat][:rooms].delete(params[:room_id])
  38 + render :nothing => true
  39 + end
  40 +
  41 + def my_session
  42 + render :text => session[:chat].to_json, :layout => false
  43 + end
  44 +
19 def avatar 45 def avatar
20 profile = environment.profiles.find_by_identifier(params[:id]) 46 profile = environment.profiles.find_by_identifier(params[:id])
21 filename, mimetype = profile_icon(profile, :minor, true) 47 filename, mimetype = profile_icon(profile, :minor, true)
@@ -28,15 +54,6 @@ class ChatController &lt; PublicController @@ -28,15 +54,6 @@ class ChatController &lt; PublicController
28 end 54 end
29 end 55 end
30 56
31 - def index  
32 - presence = current_user.last_chat_status  
33 - if presence.blank? or presence == 'chat'  
34 - render :action => 'auto_connect_online'  
35 - else  
36 - render :action => 'auto_connect_busy'  
37 - end  
38 - end  
39 -  
40 def update_presence_status 57 def update_presence_status
41 if request.xhr? 58 if request.xhr?
42 current_user.update_attributes({:chat_status_at => DateTime.now}.merge(params[:status] || {})) 59 current_user.update_attributes({:chat_status_at => DateTime.now}.merge(params[:status] || {}))
@@ -44,6 +61,44 @@ class ChatController &lt; PublicController @@ -44,6 +61,44 @@ class ChatController &lt; PublicController
44 render :nothing => true 61 render :nothing => true
45 end 62 end
46 63
  64 + def save_message
  65 + to = environment.profiles.find_by_identifier(params[:to])
  66 + body = params[:body]
  67 +
  68 + ChatMessage.create!(:to => to, :from => user, :body => body)
  69 + render :text => 'ok'
  70 + end
  71 +
  72 + def recent_messages
  73 + other = environment.profiles.find_by_identifier(params[:identifier])
  74 + if other.kind_of?(Organization)
  75 + messages = ChatMessage.where('to_id=:other', :other => other.id)
  76 + else
  77 + messages = ChatMessage.where('(to_id=:other and from_id=:me) or (to_id=:me and from_id=:other)', {:me => user.id, :other => other.id})
  78 + end
  79 +
  80 + messages = messages.order('created_at DESC').includes(:to, :from).offset(params[:offset]).limit(20)
  81 + messages_json = messages.map do |message|
  82 + {
  83 + :body => message.body,
  84 + :to => {:id => message.to.identifier, :name => message.to.name},
  85 + :from => {:id => message.from.identifier, :name => message.from.name},
  86 + :created_at => message.created_at
  87 + }
  88 + end
  89 + render :json => messages_json.reverse
  90 + end
  91 +
  92 + def recent_conversations
  93 + conversations_order = ActiveRecord::Base.connection.execute("select profiles.identifier from profiles inner join (select distinct r.id as id, MAX(r.created_at) as created_at from (select from_id, to_id, created_at, (case when from_id=#{user.id} then to_id else from_id end) as id from chat_messages where from_id=#{user.id} or to_id=#{user.id}) as r group by id order by created_at desc, id) as t on profiles.id=t.id order by t.created_at desc").entries.map {|e| e['identifier']}
  94 + render :json => {:order => conversations_order.reverse, :domain => environment.default_hostname.gsub('.','-')}.to_json
  95 + end
  96 +
  97 + #TODO Ideally this is done through roster table on ejabberd.
  98 + def roster_groups
  99 + render :text => user.memberships.map {|m| {:jid => m.jid, :name => m.name}}.to_json
  100 + end
  101 +
47 protected 102 protected
48 103
49 def check_environment_feature 104 def check_environment_feature
app/controllers/public/contact_controller.rb
1 class ContactController < PublicController 1 class ContactController < PublicController
2 2
3 needs_profile 3 needs_profile
  4 + before_filter :allow_access_to_page
4 5
5 def new 6 def new
6 @contact = build_contact 7 @contact = build_contact
app/controllers/public/content_viewer_controller.rb
@@ -107,10 +107,12 @@ class ContentViewerController &lt; ApplicationController @@ -107,10 +107,12 @@ class ContentViewerController &lt; ApplicationController
107 if translation.language == locale 107 if translation.language == locale
108 @page = translation 108 @page = translation
109 redirect_to :profile => @page.profile.identifier, :page => @page.explode_path 109 redirect_to :profile => @page.profile.identifier, :page => @page.explode_path
  110 + return true
110 end 111 end
111 end 112 end
112 end 113 end
113 end 114 end
  115 + false
114 end 116 end
115 117
116 def pass_without_comment_captcha? 118 def pass_without_comment_captcha?
@@ -221,7 +223,7 @@ class ContentViewerController &lt; ApplicationController @@ -221,7 +223,7 @@ class ContentViewerController &lt; ApplicationController
221 # relation. 223 # relation.
222 posts = posts.native_translations if blog_with_translation?(@page) 224 posts = posts.native_translations if blog_with_translation?(@page)
223 225
224 - @posts = posts.paginate({ :page => params[:npage], :per_page => @page.posts_per_page }.merge(Article.display_filter(user, profile))).to_a 226 + @posts = posts.display_filter(user, profile).paginate({ :page => params[:npage], :per_page => @page.posts_per_page }).to_a
225 227
226 if blog_with_translation?(@page) 228 if blog_with_translation?(@page)
227 @posts.replace @posts.map{ |p| p.get_translation_to(FastGettext.locale) }.compact 229 @posts.replace @posts.map{ |p| p.get_translation_to(FastGettext.locale) }.compact
app/controllers/public/events_controller.rb
1 class EventsController < PublicController 1 class EventsController < PublicController
2 2
3 needs_profile 3 needs_profile
  4 + before_filter :allow_access_to_page
4 5
5 def events 6 def events
6 @events = [] 7 @events = []
app/controllers/public/home_controller.rb
@@ -2,13 +2,13 @@ class HomeController &lt; PublicController @@ -2,13 +2,13 @@ class HomeController &lt; PublicController
2 2
3 def index 3 def index
4 @has_news = false 4 @has_news = false
5 - if environment.enabled?('use_portal_community') && environment.portal_community 5 + if environment.portal_enabled
6 @has_news = true 6 @has_news = true
7 @news_cache_key = environment.portal_news_cache_key(FastGettext.locale) 7 @news_cache_key = environment.portal_news_cache_key(FastGettext.locale)
8 if !read_fragment(@news_cache_key) 8 if !read_fragment(@news_cache_key)
9 portal_community = environment.portal_community 9 portal_community = environment.portal_community
10 - @highlighted_news = portal_community.news(2, true)  
11 - @portal_news = portal_community.news(7, true) - @highlighted_news 10 + @highlighted_news = portal_community.news(environment.highlighted_news_amount, true)
  11 + @portal_news = portal_community.news(environment.portal_news_amount, true).offset(environment.highlighted_news_amount)
12 @area_news = environment.portal_folders 12 @area_news = environment.portal_folders
13 end 13 end
14 end 14 end
app/controllers/public/profile_controller.rb
@@ -16,13 +16,7 @@ class ProfileController &lt; PublicController @@ -16,13 +16,7 @@ class ProfileController &lt; PublicController
16 @activities = @profile.activities.paginate(:per_page => 15, :page => params[:page]) 16 @activities = @profile.activities.paginate(:per_page => 15, :page => params[:page])
17 end 17 end
18 @tags = profile.article_tags 18 @tags = profile.article_tags
19 - unless profile.display_info_to?(user)  
20 - if profile.visible?  
21 - private_profile  
22 - else  
23 - invisible_profile  
24 - end  
25 - end 19 + allow_access_to_page
26 end 20 end
27 21
28 def tags 22 def tags
@@ -396,17 +390,6 @@ class ProfileController &lt; PublicController @@ -396,17 +390,6 @@ class ProfileController &lt; PublicController
396 end 390 end
397 end 391 end
398 392
399 - def private_profile  
400 - private_profile_partial_parameters  
401 - render :action => 'index', :status => 403  
402 - end  
403 -  
404 - def invisible_profile  
405 - unless profile.is_template?  
406 - render_access_denied(_("This profile is inaccessible. You don't have the permission to view the content here."), _("Oops ... you cannot go ahead here"))  
407 - end  
408 - end  
409 -  
410 def per_page 393 def per_page
411 Noosfero::Constants::PROFILE_PER_PAGE 394 Noosfero::Constants::PROFILE_PER_PAGE
412 end 395 end
app/controllers/public/search_controller.rb
@@ -61,7 +61,7 @@ class SearchController &lt; PublicController @@ -61,7 +61,7 @@ class SearchController &lt; PublicController
61 end 61 end
62 62
63 def articles 63 def articles
64 - @scope = @environment.articles.public 64 + @scope = @environment.articles.public.paginate(paginate_options)
65 full_text_search 65 full_text_search
66 end 66 end
67 67
@@ -75,7 +75,7 @@ class SearchController &lt; PublicController @@ -75,7 +75,7 @@ class SearchController &lt; PublicController
75 end 75 end
76 76
77 def products 77 def products
78 - @scope = @environment.products 78 + @scope = @environment.products.paginate(paginate_options)
79 full_text_search 79 full_text_search
80 end 80 end
81 81
@@ -238,7 +238,7 @@ class SearchController &lt; PublicController @@ -238,7 +238,7 @@ class SearchController &lt; PublicController
238 def visible_profiles(klass, *extra_relations) 238 def visible_profiles(klass, *extra_relations)
239 relations = [:image, :domains, :environment, :preferred_domain] 239 relations = [:image, :domains, :environment, :preferred_domain]
240 relations += extra_relations 240 relations += extra_relations
241 - @environment.send(klass.name.underscore.pluralize).visible.includes(relations) 241 + @environment.send(klass.name.underscore.pluralize).visible.includes(relations).paginate(paginate_options)
242 end 242 end
243 243
244 def per_page 244 def per_page
app/controllers/public_controller.rb
1 class PublicController < ApplicationController 1 class PublicController < ApplicationController
  2 + protected
  3 +
  4 + def allow_access_to_page
  5 + unless profile.display_info_to?(user)
  6 + if profile.visible?
  7 + private_profile
  8 + else
  9 + invisible_profile
  10 + end
  11 + end
  12 + end
  13 +
  14 + def private_profile
  15 + private_profile_partial_parameters
  16 + render :template => 'profile/_private_profile', :status => 403, :formats => [:html]
  17 + end
  18 +
  19 + def invisible_profile
  20 + unless profile.is_template?
  21 + render_access_denied(_("This profile is inaccessible. You don't have the permission to view the content here."), _("Oops ... you cannot go ahead here"))
  22 + end
  23 + end
2 end 24 end
app/helpers/application_helper.rb
@@ -8,11 +8,7 @@ module ApplicationHelper @@ -8,11 +8,7 @@ module ApplicationHelper
8 8
9 include PermissionNameHelper 9 include PermissionNameHelper
10 10
11 - include LightboxHelper  
12 -  
13 - include ThickboxHelper  
14 -  
15 - include ColorboxHelper 11 + include ModalHelper
16 12
17 include BoxesHelper 13 include BoxesHelper
18 14
@@ -46,6 +42,8 @@ module ApplicationHelper @@ -46,6 +42,8 @@ module ApplicationHelper
46 42
47 include CatalogHelper 43 include CatalogHelper
48 44
  45 + include PluginsHelper
  46 +
49 def locale 47 def locale
50 (@page && !@page.language.blank?) ? @page.language : FastGettext.locale 48 (@page && !@page.language.blank?) ? @page.language : FastGettext.locale
51 end 49 end
@@ -594,7 +592,7 @@ module ApplicationHelper @@ -594,7 +592,7 @@ module ApplicationHelper
594 extra_info = extra_info.nil? ? '' : content_tag( 'span', extra_info, :class => 'extra_info' ) 592 extra_info = extra_info.nil? ? '' : content_tag( 'span', extra_info, :class => 'extra_info' )
595 links = links_for_balloon(profile) 593 links = links_for_balloon(profile)
596 content_tag('div', content_tag(tag, 594 content_tag('div', content_tag(tag,
597 - (environment.enabled?(:show_balloon_with_profile_links_when_clicked) ? link_to( content_tag( 'span', _('Profile links')), '#', :onclick => "toggleSubmenu(this, '#{profile.short_name}', #{CGI::escapeHTML(links.to_json)}); return false", :class => "menu-submenu-trigger #{trigger_class}", :url => url) : "") + 595 + (environment.enabled?(:show_balloon_with_profile_links_when_clicked) ? popover_menu(_('Profile links'),profile.short_name,links,{:class => trigger_class, :url => url}) : "") +
598 link_to( 596 link_to(
599 content_tag( 'span', profile_image( profile, size ), :class => 'profile-image' ) + 597 content_tag( 'span', profile_image( profile, size ), :class => 'profile-image' ) +
600 content_tag( 'span', h(name), :class => ( profile.class == Person ? 'fn' : 'org' ) ) + 598 content_tag( 'span', h(name), :class => ( profile.class == Person ? 'fn' : 'org' ) ) +
@@ -606,6 +604,14 @@ module ApplicationHelper @@ -606,6 +604,14 @@ module ApplicationHelper
606 :class => 'vcard'), :class => 'common-profile-list-block') 604 :class => 'vcard'), :class => 'common-profile-list-block')
607 end 605 end
608 606
  607 + def popover_menu(title,menu_title,links,html_options={})
  608 + html_options[:class] = "" unless html_options[:class]
  609 + html_options[:class] << " menu-submenu-trigger"
  610 + html_options[:onclick] = "toggleSubmenu(this, '#{menu_title}', #{CGI::escapeHTML(links.to_json)}); return false"
  611 +
  612 + link_to(content_tag(:span, title), '#', html_options)
  613 + end
  614 +
609 def gravatar_default 615 def gravatar_default
610 (respond_to?(:theme_option) && theme_option.present? && theme_option['gravatar']) || NOOSFERO_CONF['gravatar'] || 'mm' 616 (respond_to?(:theme_option) && theme_option.present? && theme_option['gravatar']) || NOOSFERO_CONF['gravatar'] || 'mm'
611 end 617 end
@@ -649,8 +655,8 @@ module ApplicationHelper @@ -649,8 +655,8 @@ module ApplicationHelper
649 ' onfocus="if(this.value==\''+s+'\'){this.value=\'\'} this.form.className=\'focus-in\'"'+ 655 ' onfocus="if(this.value==\''+s+'\'){this.value=\'\'} this.form.className=\'focus-in\'"'+
650 ' onblur="if(/^\s*$/.test(this.value)){this.value=\''+s+'\'} this.form.className=\'focus-out\'">'+ 656 ' onblur="if(/^\s*$/.test(this.value)){this.value=\''+s+'\'} this.form.className=\'focus-out\'">'+
651 '</form>' 657 '</form>'
652 - else #opt == 'lightbox_link' is default  
653 - lightbox_link_to '<span class="icon-menu-search"></span>'+ _('Search'), { 658 + else
  659 + modal_link_to '<span class="icon-menu-search"></span>'+ _('Search'), {
654 :controller => 'search', 660 :controller => 'search',
655 :action => 'popup', 661 :action => 'popup',
656 :category_path => (@category ? @category.explode_path : nil)}, 662 :category_path => (@category ? @category.explode_path : nil)},
@@ -720,7 +726,7 @@ module ApplicationHelper @@ -720,7 +726,7 @@ module ApplicationHelper
720 class NoosferoFormBuilder < ActionView::Helpers::FormBuilder 726 class NoosferoFormBuilder < ActionView::Helpers::FormBuilder
721 extend ActionView::Helpers::TagHelper 727 extend ActionView::Helpers::TagHelper
722 728
723 - def self.output_field(text, field_html, field_id = nil) 729 + def self.output_field(text, field_html, field_id = nil, options = {})
724 # try to guess an id if none given 730 # try to guess an id if none given
725 if field_id.nil? 731 if field_id.nil?
726 field_html =~ /id=['"]([^'"]*)['"]/ 732 field_html =~ /id=['"]([^'"]*)['"]/
@@ -1048,11 +1054,11 @@ module ApplicationHelper @@ -1048,11 +1054,11 @@ module ApplicationHelper
1048 {s_('contents|Most commented') => {:href => url_for({:controller => 'search', :action => 'contents', :filter => 'more_comments'})}} 1054 {s_('contents|Most commented') => {:href => url_for({:controller => 'search', :action => 'contents', :filter => 'more_comments'})}}
1049 ] 1055 ]
1050 if logged_in? 1056 if logged_in?
1051 - links.push(_('New content') => colorbox_options({:href => url_for({:controller => 'cms', :action => 'new', :profile => current_user.login, :cms => true})})) 1057 + links.push(_('New content') => modal_options({:href => url_for({:controller => 'cms', :action => 'new', :profile => current_user.login, :cms => true})}))
1052 end 1058 end
1053 1059
1054 link_to(content_tag(:span, _('Contents'), :class => 'icon-menu-articles'), {:controller => "search", :action => 'contents', :category_path => nil}, :id => 'submenu-contents') + 1060 link_to(content_tag(:span, _('Contents'), :class => 'icon-menu-articles'), {:controller => "search", :action => 'contents', :category_path => nil}, :id => 'submenu-contents') +
1055 - link_to(content_tag(:span, _('Contents menu')), '#', :onclick => "toggleSubmenu(this,'',#{CGI::escapeHTML(links.to_json)}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-contents-trigger') 1061 + popover_menu(_('Contents menu'),'',links,:class => 'up', :id => 'submenu-contents-trigger')
1056 end 1062 end
1057 alias :browse_contents_menu :search_contents_menu 1063 alias :browse_contents_menu :search_contents_menu
1058 1064
@@ -1068,7 +1074,7 @@ module ApplicationHelper @@ -1068,7 +1074,7 @@ module ApplicationHelper
1068 end 1074 end
1069 1075
1070 link_to(content_tag(:span, _('People'), :class => 'icon-menu-people'), {:controller => "search", :action => 'people', :category_path => ''}, :id => 'submenu-people') + 1076 link_to(content_tag(:span, _('People'), :class => 'icon-menu-people'), {:controller => "search", :action => 'people', :category_path => ''}, :id => 'submenu-people') +
1071 - link_to(content_tag(:span, _('People menu')), '#', :onclick => "toggleSubmenu(this,'',#{CGI::escapeHTML(links.to_json)}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-people-trigger') 1077 + popover_menu(_('People menu'),'',links,:class => 'up', :id => 'submenu-people-trigger')
1072 end 1078 end
1073 alias :browse_people_menu :search_people_menu 1079 alias :browse_people_menu :search_people_menu
1074 1080
@@ -1084,7 +1090,7 @@ module ApplicationHelper @@ -1084,7 +1090,7 @@ module ApplicationHelper
1084 end 1090 end
1085 1091
1086 link_to(content_tag(:span, _('Communities'), :class => 'icon-menu-community'), {:controller => "search", :action => 'communities'}, :id => 'submenu-communities') + 1092 link_to(content_tag(:span, _('Communities'), :class => 'icon-menu-community'), {:controller => "search", :action => 'communities'}, :id => 'submenu-communities') +
1087 - link_to(content_tag(:span, _('Communities menu')), '#', :onclick => "toggleSubmenu(this,'',#{CGI::escapeHTML(links.to_json)}); return false", :class => 'menu-submenu-trigger up', :id => 'submenu-communities-trigger') 1093 + popover_menu(_('Communities menu'),'',links,:class => 'up', :id => 'submenu-communities-trigger')
1088 end 1094 end
1089 alias :browse_communities_menu :search_communities_menu 1095 alias :browse_communities_menu :search_communities_menu
1090 1096
@@ -1396,16 +1402,16 @@ module ApplicationHelper @@ -1396,16 +1402,16 @@ module ApplicationHelper
1396 end 1402 end
1397 1403
1398 def convert_macro(html, source) 1404 def convert_macro(html, source)
1399 - doc = Hpricot(html) 1405 + doc = Nokogiri::HTML.fragment html
1400 #TODO This way is more efficient but do not support macro inside of 1406 #TODO This way is more efficient but do not support macro inside of
1401 # macro. You must parse them from the inside-out in order to enable 1407 # macro. You must parse them from the inside-out in order to enable
1402 # that. 1408 # that.
1403 - doc.search('.macro').each do |macro| 1409 + doc.css('.macro').each do |macro|
1404 macro_name = macro['data-macro'] 1410 macro_name = macro['data-macro']
1405 result = @plugins.parse_macro(macro_name, macro, source) 1411 result = @plugins.parse_macro(macro_name, macro, source)
1406 macro.inner_html = result.kind_of?(Proc) ? self.instance_exec(&result) : result 1412 macro.inner_html = result.kind_of?(Proc) ? self.instance_exec(&result) : result
1407 end 1413 end
1408 - doc.html 1414 + doc.to_html
1409 end 1415 end
1410 1416
1411 def default_folder_for_image_upload(profile) 1417 def default_folder_for_image_upload(profile)
app/helpers/article_helper.rb
1 module ArticleHelper 1 module ArticleHelper
2 2
3 - include PrototypeHelper  
4 include TokenHelper 3 include TokenHelper
5 4
6 def article_reported_version(article) 5 def article_reported_version(article)
@@ -35,7 +34,7 @@ module ArticleHelper @@ -35,7 +34,7 @@ module ArticleHelper
35 'div', 34 'div',
36 check_box(:article, :notify_comments) + 35 check_box(:article, :notify_comments) +
37 content_tag('label', _('I want to receive a notification of each comment written by e-mail'), :for => 'article_notify_comments') + 36 content_tag('label', _('I want to receive a notification of each comment written by e-mail'), :for => 'article_notify_comments') +
38 - observe_field(:article_accept_comments, :function => "$('article_notify_comments').disabled = ! $('article_accept_comments').checked;$('article_moderate_comments').disabled = ! $('article_accept_comments').checked") 37 + observe_field(:article_accept_comments, :function => "jQuery('#article_notify_comments')[0].disabled = ! jQuery('#article_accept_comments')[0].checked;jQuery('#article_moderate_comments')[0].disabled = ! jQuery('#article_accept_comments')[0].checked")
39 ) + 38 ) +
40 39
41 content_tag( 40 content_tag(
app/helpers/block_helper.rb
@@ -19,7 +19,7 @@ module BlockHelper @@ -19,7 +19,7 @@ module BlockHelper
19 content_tag('span', _('Title')) + 19 content_tag('span', _('Title')) +
20 text_field_tag('block[images][][title]', image[:title], :class => 'highlight-title', :size => 45) 20 text_field_tag('block[images][][title]', image[:title], :class => 'highlight-title', :size => 45)
21 }</label></td> 21 }</label></td>
22 - <td>#{link_to '', '#', :class=>'button icon-button icon-delete delete-highlight', :confirm=>_('Are you sure you want to remove this highlight')}</td> 22 + <td>#{button_without_text(:delete, _('Remove'), '#', class: 'delete-highlight', :confirm=>_('Are you sure you want to remove this highlight'))}</td>
23 </tr> 23 </tr>
24 " 24 "
25 end 25 end
app/helpers/boxes_helper.rb
@@ -38,8 +38,12 @@ module BoxesHelper @@ -38,8 +38,12 @@ module BoxesHelper
38 end 38 end
39 end 39 end
40 40
  41 + def boxes_limit holder
  42 + controller.send(:custom_design)[:boxes_limit] || holder.boxes_limit(controller.send(:custom_design)[:layout_template])
  43 + end
  44 +
41 def display_boxes(holder, main_content) 45 def display_boxes(holder, main_content)
42 - boxes = holder.boxes.with_position.first(holder.boxes_limit) 46 + boxes = holder.boxes.with_position.first(boxes_limit(holder))
43 content = boxes.reverse.map { |item| display_box(item, main_content) }.join("\n") 47 content = boxes.reverse.map { |item| display_box(item, main_content) }.join("\n")
44 content = main_content if (content.blank?) 48 content = main_content if (content.blank?)
45 49
@@ -65,11 +69,13 @@ module BoxesHelper @@ -65,11 +69,13 @@ module BoxesHelper
65 end 69 end
66 70
67 def display_box_content(box, main_content) 71 def display_box_content(box, main_content)
68 - context = { :article => @page, :request_path => request.path, :locale => locale, :params => request.params, :user => user }  
69 - box_decorator.select_blocks(box.blocks.includes(:box), context).map { |item| display_block(item, main_content) }.join("\n") + box_decorator.block_target(box) 72 + context = { :article => @page, :request_path => request.path, :locale => locale, :params => request.params, :user => user, :controller => controller }
  73 + box_decorator.select_blocks(box, box.blocks.includes(:box), context).map do |item|
  74 + display_block item, main_content
  75 + end.join("\n") + box_decorator.block_target(box)
70 end 76 end
71 77
72 - def select_blocks(arr, context) 78 + def select_blocks box, arr, context
73 arr 79 arr
74 end 80 end
75 81
@@ -150,8 +156,22 @@ module BoxesHelper @@ -150,8 +156,22 @@ module BoxesHelper
150 def self.block_edit_buttons(block) 156 def self.block_edit_buttons(block)
151 '' 157 ''
152 end 158 end
153 - def self.select_blocks(arr, context)  
154 - arr.select { |block| block.visible?(context) } 159 + def self.select_blocks box, arr, context
  160 + arr = arr.select{ |block| block.visible? context }
  161 +
  162 + custom_design = context[:controller].send(:custom_design)
  163 + inserts = [custom_design[:insert]].flatten.compact
  164 + inserts.each do |insert_opts|
  165 + next unless box.position == insert_opts[:box]
  166 + position, block = insert_opts[:position], insert_opts[:block]
  167 + block = block.new box: box if block.is_a? Class
  168 +
  169 + if not insert_opts[:uniq] or not box.blocks.map(&:class).include? block.klass
  170 + arr = arr.insert position, block
  171 + end
  172 + end
  173 +
  174 + arr
155 end 175 end
156 end 176 end
157 177
@@ -211,7 +231,7 @@ module BoxesHelper @@ -211,7 +231,7 @@ module BoxesHelper
211 end 231 end
212 232
213 if block.editable? 233 if block.editable?
214 - buttons << colorbox_icon_button(:edit, _('Edit'), { :action => 'edit', :id => block.id }) 234 + buttons << modal_icon_button(:edit, _('Edit'), { :action => 'edit', :id => block.id })
215 end 235 end
216 236
217 if !block.main? 237 if !block.main?
@@ -221,7 +241,7 @@ module BoxesHelper @@ -221,7 +241,7 @@ module BoxesHelper
221 end 241 end
222 242
223 if block.respond_to?(:help) 243 if block.respond_to?(:help)
224 - buttons << thickbox_inline_popup_icon(:help, _('Help on this block'), {}, "help-on-box-#{block.id}") << content_tag('div', content_tag('h2', _('Help')) + content_tag('div', block.help, :style => 'margin-bottom: 1em;') + thickbox_close_button(_('Close')), :style => 'display: none;', :id => "help-on-box-#{block.id}") 244 + buttons << modal_inline_icon(:help, _('Help on this block'), {}, "#help-on-box-#{block.id}") << content_tag('div', content_tag('h2', _('Help')) + content_tag('div', block.help, :style => 'margin-bottom: 1em;') + modal_close_button(_('Close')), :style => 'display: none;', :id => "help-on-box-#{block.id}")
225 end 245 end
226 246
227 if block.embedable? 247 if block.embedable?
app/helpers/categories_helper.rb
@@ -25,10 +25,13 @@ module CategoriesHelper @@ -25,10 +25,13 @@ module CategoriesHelper
25 ) 25 )
26 end 26 end
27 27
28 - def update_categories_link(body, category_id=nil, html_options={}) 28 + #TODO: remove this function and, in views, use existing basic buttons
  29 + def update_categories_link(type, body, category_id=nil, html_options={})
  30 + html_class = 'select-subcategory-link'
  31 + html_class = " icon-#{type} btn btn-primary btn-xs" if type.present?
29 link_to body, 32 link_to body,
30 { :action => "update_categories", :category_id => category_id, :id => @object }, 33 { :action => "update_categories", :category_id => category_id, :id => @object },
31 - {:id => category_id ? "select-category-#{category_id}-link" : nil, :remote => true, :class => 'select-subcategory-link'}.merge(html_options) 34 + {:id => category_id ? "select-category-#{category_id}-link" : nil, :remote => true, :class => html_class}.merge(html_options)
32 end 35 end
33 36
34 end 37 end
app/helpers/chat_helper.rb
@@ -6,8 +6,9 @@ module ChatHelper @@ -6,8 +6,9 @@ module ChatHelper
6 ['icon-menu-busy', _('Busy'), 'chat-busy'], 6 ['icon-menu-busy', _('Busy'), 'chat-busy'],
7 ['icon-menu-offline', _('Sign out of chat'), 'chat-disconnect'], 7 ['icon-menu-offline', _('Sign out of chat'), 'chat-disconnect'],
8 ] 8 ]
  9 + avatar = profile_image(user, :portrait, :class => 'avatar')
9 content_tag('span', 10 content_tag('span',
10 - link_to(content_tag('span', status) + ui_icon('ui-icon-triangle-1-s'), 11 + link_to(avatar + content_tag('span', user.name) + ui_icon('ui-icon-triangle-1-s'),
11 '#', 12 '#',
12 :onclick => 'toggleMenu(this); return false', 13 :onclick => 'toggleMenu(this); return false',
13 :class => icon_class + ' simplemenu-trigger' 14 :class => icon_class + ' simplemenu-trigger'
app/helpers/cms_helper.rb
@@ -9,12 +9,6 @@ module CmsHelper @@ -9,12 +9,6 @@ module CmsHelper
9 mime_type.gsub('/', '_').gsub('-', '') 9 mime_type.gsub('/', '_').gsub('-', '')
10 end 10 end
11 11
12 - def add_upload_file_field(name, locals)  
13 - button_to_function :add, name, nil do |page|  
14 - page.insert_html :bottom, :uploaded_files, CGI::escapeHTML(render(:partial => 'upload_file', :locals => locals, :object => UploadedFile.new))  
15 - end  
16 - end  
17 -  
18 def pagination_links(collection, options={}) 12 def pagination_links(collection, options={})
19 options = {:previous_label => '&laquo; ', :next_label => ' &raquo;', :page_links => false}.merge(options) 13 options = {:previous_label => '&laquo; ', :next_label => ' &raquo;', :page_links => false}.merge(options)
20 will_paginate(collection, options) 14 will_paginate(collection, options)
app/helpers/colorbox_helper.rb
@@ -1,25 +0,0 @@ @@ -1,25 +0,0 @@
1 -module ColorboxHelper  
2 -  
3 - def colorbox_close_button(text, options = {})  
4 - button(:close, text, '#', colorbox_options(options, :close))  
5 - end  
6 -  
7 - def colorbox_button(type, label, url, options = {})  
8 - button(type, label, url, colorbox_options(options))  
9 - end  
10 -  
11 - def colorbox_icon_button(type, label, url, options = {})  
12 - icon_button(type, label, url, colorbox_options(options))  
13 - end  
14 -  
15 - # options must be an HTML options hash as passed to link_to etc.  
16 - #  
17 - # returns a new hash with colorbox class added. Keeps existing classes.  
18 - def colorbox_options(options, type=nil)  
19 - the_class = 'colorbox'  
20 - the_class += "-#{type.to_s}" unless type.nil?  
21 - the_class << " #{options[:class]}" if options.has_key?(:class)  
22 - options.merge(:class => the_class)  
23 - end  
24 -  
25 -end  
app/helpers/comment_helper.rb
@@ -65,7 +65,7 @@ module CommentHelper @@ -65,7 +65,7 @@ module CommentHelper
65 65
66 def link_for_edit(comment) 66 def link_for_edit(comment)
67 if comment.can_be_updated_by?(user) 67 if comment.can_be_updated_by?(user)
68 - {:link => expirable_comment_link(comment, :edit, _('Edit'), url_for(:profile => profile.identifier, :controller => :comment, :action => :edit, :id => comment.id),:class => 'colorbox')} 68 + {:link => expirable_comment_link(comment, :edit, _('Edit'), url_for(:profile => profile.identifier, :controller => :comment, :action => :edit, :id => comment.id),:class => 'modal')}
69 end 69 end
70 end 70 end
71 71
app/helpers/dates_helper.rb
@@ -2,24 +2,16 @@ require &#39;noosfero/i18n&#39; @@ -2,24 +2,16 @@ require &#39;noosfero/i18n&#39;
2 2
3 module DatesHelper 3 module DatesHelper
4 4
5 - # FIXME Date#strftime should translate this for us !!!!  
6 - MONTHS = [  
7 - N_('January'),  
8 - N_('February'),  
9 - N_('March'),  
10 - N_('April'),  
11 - N_('May'),  
12 - N_('June'),  
13 - N_('July'),  
14 - N_('August'),  
15 - N_('September'),  
16 - N_('October'),  
17 - N_('November'),  
18 - N_('December')  
19 - ]  
20 -  
21 - def month_name(n)  
22 - _(MONTHS[n-1]) 5 + def months
  6 + I18n.t('date.month_names')
  7 + end
  8 +
  9 + def month_name(n, abbreviated = false)
  10 + if abbreviated
  11 + I18n.t('date.abbr_month_names')[n]
  12 + else
  13 + months[n]
  14 + end
23 end 15 end
24 16
25 # formats a date for displaying. 17 # formats a date for displaying.
@@ -47,7 +39,7 @@ module DatesHelper @@ -47,7 +39,7 @@ module DatesHelper
47 end 39 end
48 end 40 end
49 41
50 - # formats a datetime for displaying. 42 + # formats a datetime for displaying.
51 def show_time(time) 43 def show_time(time)
52 if time 44 if time
53 _('%{day} %{month} %{year}, %{hour}:%{minutes}') % { :year => time.year, :month => month_name(time.month), :day => time.day, :hour => time.hour, :minutes => time.strftime("%M") } 45 _('%{day} %{month} %{year}, %{hour}:%{minutes}') % { :year => time.year, :month => month_name(time.month), :day => time.day, :hour => time.hour, :minutes => time.strftime("%M") }
@@ -91,15 +83,7 @@ module DatesHelper @@ -91,15 +83,7 @@ module DatesHelper
91 _(date.strftime("%a")) 83 _(date.strftime("%a"))
92 else 84 else
93 # FIXME Date#strftime should translate this for us !!!! 85 # FIXME Date#strftime should translate this for us !!!!
94 - _([  
95 - N_('Sunday'),  
96 - N_('Monday'),  
97 - N_('Tuesday'),  
98 - N_('Wednesday'),  
99 - N_('Thursday'),  
100 - N_('Friday'),  
101 - N_('Saturday'),  
102 - ][date.wday]) 86 + I18n.t('date.day_names')[date.wday]
103 end 87 end
104 end 88 end
105 89
@@ -111,7 +95,7 @@ module DatesHelper @@ -111,7 +95,7 @@ module DatesHelper
111 date = date << 1 95 date = date << 1
112 end 96 end
113 if opts[:only_month] 97 if opts[:only_month]
114 - _('%{month}') % {:month => month_name(date.month.to_i) } 98 + _('%{month}') % { :month => month_name(date.month.to_i) }
115 else 99 else
116 _('%{month} %{year}') % { :year => date.year, :month => month_name(date.month.to_i) } 100 _('%{month} %{year}') % { :year => date.year, :month => month_name(date.month.to_i) }
117 end 101 end
@@ -156,7 +140,7 @@ module DatesHelper @@ -156,7 +140,7 @@ module DatesHelper
156 else 140 else
157 order = [:day, :month, :year] 141 order = [:day, :month, :year]
158 end 142 end
159 - date_select(object, method, html_options.merge(options.merge(:include_blank => true, :order => order, :use_month_names => MONTHS.map {|item| gettext(item)}))) 143 + date_select(object, method, html_options.merge(options.merge(:include_blank => true, :order => order, :use_month_names => months)))
160 end 144 end
161 145
162 end 146 end
app/helpers/design_helper.rb 0 → 100644
@@ -0,0 +1,50 @@ @@ -0,0 +1,50 @@
  1 +module DesignHelper
  2 +
  3 + extend ActiveSupport::Concern
  4 +
  5 + included do
  6 + extend ClassMethods
  7 + include InstanceMethods
  8 + before_filter :load_custom_design if self.respond_to? :before_filter
  9 + end
  10 +
  11 + module ClassMethods
  12 +
  13 + def no_design_blocks
  14 + @no_design_blocks = true
  15 + end
  16 +
  17 + def use_custom_design options = {}
  18 + @custom_design = options
  19 + end
  20 +
  21 + def custom_design
  22 + @custom_design ||= {}
  23 + end
  24 +
  25 + def uses_design_blocks?
  26 + !@no_design_blocks
  27 + end
  28 +
  29 + end
  30 +
  31 + module InstanceMethods
  32 +
  33 + protected
  34 +
  35 + def uses_design_blocks?
  36 + !@no_design_blocks && self.class.uses_design_blocks?
  37 + end
  38 +
  39 + def load_custom_design
  40 + # see also: LayoutHelper#body_classes
  41 + @layout_template = self.class.custom_design[:layout_template]
  42 + end
  43 +
  44 + def custom_design
  45 + @custom_design || self.class.custom_design
  46 + end
  47 +
  48 + end
  49 +
  50 +end
app/helpers/language_helper.rb
1 module LanguageHelper 1 module LanguageHelper
2 def language 2 def language
3 - locale 3 + locale.to_s
4 end 4 end
5 5
6 def tinymce_language 6 def tinymce_language
@@ -20,7 +20,7 @@ module LanguageHelper @@ -20,7 +20,7 @@ module LanguageHelper
20 separator = options[:separator] || ' &mdash; ' 20 separator = options[:separator] || ' &mdash; '
21 21
22 if options[:element] == 'dropdown' 22 if options[:element] == 'dropdown'
23 - select_tag('lang', 23 + select_tag('lang',
24 options_for_select(locales.map{|code,name| [name, code]}, current), 24 options_for_select(locales.map{|code,name| [name, code]}, current),
25 :onchange => "document.location.href= #{url_for(params.merge(:lang => 'LANGUAGE'))}.replace(/LANGUAGE/, this.value) ;", 25 :onchange => "document.location.href= #{url_for(params.merge(:lang => 'LANGUAGE'))}.replace(/LANGUAGE/, this.value) ;",
26 :help => _('The language you choose here is the language used for options, buttons, etc. It does not affect the language of the content created by other users.') 26 :help => _('The language you choose here is the language used for options, buttons, etc. It does not affect the language of the content created by other users.')
app/helpers/layout_helper.rb
@@ -31,12 +31,12 @@ module LayoutHelper @@ -31,12 +31,12 @@ module LayoutHelper
31 plugins_javascripts = @plugins.map { |plugin| [plugin.js_files].flatten.map { |js| plugin.class.public_path(js) } }.flatten 31 plugins_javascripts = @plugins.map { |plugin| [plugin.js_files].flatten.map { |js| plugin.class.public_path(js) } }.flatten
32 32
33 output = '' 33 output = ''
34 - output += render :file => 'layouts/_javascript'  
35 - output += javascript_tag 'render_all_jquery_ui_widgets()' 34 + output += render 'layouts/javascript'
36 unless plugins_javascripts.empty? 35 unless plugins_javascripts.empty?
37 output += javascript_include_tag plugins_javascripts, :cache => "cache/plugins-#{Digest::MD5.hexdigest plugins_javascripts.to_s}" 36 output += javascript_include_tag plugins_javascripts, :cache => "cache/plugins-#{Digest::MD5.hexdigest plugins_javascripts.to_s}"
38 end 37 end
39 output += theme_javascript_ng.to_s 38 output += theme_javascript_ng.to_s
  39 + output += javascript_tag 'render_all_jquery_ui_widgets()'
40 40
41 output 41 output
42 end 42 end
@@ -45,11 +45,10 @@ module LayoutHelper @@ -45,11 +45,10 @@ module LayoutHelper
45 standard_stylesheets = [ 45 standard_stylesheets = [
46 'application', 46 'application',
47 'search', 47 'search',
48 - 'thickbox',  
49 - 'lightbox',  
50 'colorbox', 48 'colorbox',
51 'selectordie', 49 'selectordie',
52 'inputosaurus', 50 'inputosaurus',
  51 + 'chat',
53 pngfix_stylesheet_path, 52 pngfix_stylesheet_path,
54 ] + tokeninput_stylesheets 53 ] + tokeninput_stylesheets
55 plugins_stylesheets = @plugins.select(&:stylesheet?).map { |plugin| plugin.class.public_path('style.css') } 54 plugins_stylesheets = @plugins.select(&:stylesheet?).map { |plugin| plugin.class.public_path('style.css') }
@@ -86,6 +85,7 @@ module LayoutHelper @@ -86,6 +85,7 @@ module LayoutHelper
86 end 85 end
87 end 86 end
88 87
  88 +
89 def icon_theme_stylesheet_path 89 def icon_theme_stylesheet_path
90 icon_themes = [] 90 icon_themes = []
91 theme_icon_themes = theme_option(:icon_theme) || [] 91 theme_icon_themes = theme_option(:icon_theme) || []
@@ -116,8 +116,5 @@ module LayoutHelper @@ -116,8 +116,5 @@ module LayoutHelper
116 end 116 end
117 end 117 end
118 118
119 - def meta_description_tag(article=nil)  
120 - article ? CGI.escapeHTML(truncate(strip_tags(article.body.to_s), :length => 200)) : environment.name  
121 - end  
122 end 119 end
123 120
app/helpers/lightbox_helper.rb
@@ -1,36 +0,0 @@ @@ -1,36 +0,0 @@
1 -module LightboxHelper  
2 -  
3 - def lightbox_link_to(text, url, options = {})  
4 - link_to(text, url, lightbox_options(options))  
5 - end  
6 -  
7 - def lightbox_close_button(text, options = {})  
8 - button(:close, text, '#', lightbox_options(options, 'lbAction').merge(:rel => 'deactivate'))  
9 - end  
10 -  
11 - def lightbox_button(type, label, url, options = {})  
12 - button(type, label, url, lightbox_options(options))  
13 - end  
14 -  
15 - def lightbox_icon_button(type, label, url, options = {})  
16 - icon_button(type, label, url, lightbox_options(options))  
17 - end  
18 -  
19 - # options must be an HTML options hash as passed to link_to etc.  
20 - #  
21 - # returns a new hash with lightbox class added. Keeps existing classes.  
22 - def lightbox_options(options, lightbox_type = 'lbOn')  
23 - the_class = lightbox_type  
24 - the_class << " #{options[:class]}" if options.has_key?(:class)  
25 - options.merge(:class => the_class)  
26 - end  
27 -  
28 - def lightbox?  
29 - request.xhr?  
30 - end  
31 -  
32 - def lightbox_remote_button(type, label, url, options = {})  
33 - button(type, label, url, lightbox_options(options, 'remote-lbOn'))  
34 - end  
35 -  
36 -end  
app/helpers/manage_products_helper.rb
@@ -137,7 +137,7 @@ module ManageProductsHelper @@ -137,7 +137,7 @@ module ManageProductsHelper
137 ui_button_to_remote(label, 137 ui_button_to_remote(label,
138 {:update => "product-#{field}", 138 {:update => "product-#{field}",
139 :url => { :controller => 'manage_products', :action => "edit", :id => product.id, :field => field }, 139 :url => { :controller => 'manage_products', :action => "edit", :id => product.id, :field => field },
140 - :complete => "$('edit-product-button-ui-#{field}').hide()", 140 + :complete => "jQuery('#edit-product-button-ui-#{field}').hide()",
141 :method => :get, 141 :method => :get,
142 :loading => "loading_for_button('##{id}')"}, 142 :loading => "loading_for_button('##{id}')"},
143 options) 143 options)
app/helpers/modal_helper.rb 0 → 100644
@@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
  1 +module ModalHelper
  2 +
  3 + def modal_inline_link_to title, url, selector, options = {}
  4 + link_to title, url, modal_options(options.merge(:inline => selector))
  5 + end
  6 +
  7 + def modal_inline_icon type, title, url, selector, options = {}
  8 + icon_button type, title, url, modal_options(options.merge(:inline => selector))
  9 + end
  10 +
  11 + def modal_link_to title, url, options = {}
  12 + link_to title, url, modal_options(options)
  13 + end
  14 +
  15 + def modal_close_link text, options = {}
  16 + link_to text, '#', modal_options(options, :close)
  17 + end
  18 +
  19 + def modal_close_button(text, options = {})
  20 + button :close, text, '#', modal_options(options, :close).merge(:rel => 'deactivate')
  21 + end
  22 +
  23 + def modal_button(type, label, url, options = {})
  24 + button type, label, url, modal_options(options)
  25 + end
  26 +
  27 + def modal_icon_button(type, label, url, options = {})
  28 + icon_button type, label, url, modal_options(options)
  29 + end
  30 +
  31 + # options must be an HTML options hash as passed to link_to etc.
  32 + #
  33 + # returns a new hash with modal class added. Keeps existing classes.
  34 + def modal_options(options, type=nil)
  35 + inline_selector = options.delete :inline
  36 + options[:onclick] = "return noosfero.modal.inline('#{inline_selector}')" if inline_selector
  37 +
  38 + classes = if inline_selector then '' else 'modal-toggle' end
  39 + classes += " modal-#{type.to_s}" if type.present?
  40 + classes << " #{options[:class]}" if options.has_key? :class
  41 + options.merge!(:class => classes)
  42 +
  43 + options
  44 + end
  45 +
  46 +end
app/helpers/plugins_helper.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +module PluginsHelper
  2 +
  3 + def plugins_product_tabs
  4 + @plugins.dispatch(:product_tabs, @product).map do |tab|
  5 + {:title => tab[:title], :id => tab[:id], :content => instance_eval(&tab[:content])}
  6 + end
  7 + end
  8 +
  9 +end
app/helpers/thickbox_helper.rb
@@ -1,11 +0,0 @@ @@ -1,11 +0,0 @@
1 -module ThickboxHelper  
2 - def thickbox_inline_popup_link(title, url, id, options = {})  
3 - link_to(title, url_for(url) + "#TB_inline?height=300&width=500&inlineId=#{id}&modal=true", {:class => 'thickbox'}.merge(options))  
4 - end  
5 - def thickbox_inline_popup_icon(type, title, url, id, options = {})  
6 - icon_button(type, title, url_for(url) + "#TB_inline?height=300&width=500&inlineId=#{id}&modal=true", {:class => "thickbox"}.merge(options))  
7 - end  
8 - def thickbox_close_button(title)  
9 - button_to_function(:close, title, 'tb_remove();')  
10 - end  
11 -end  
app/mailers/comment_notifier.rb
1 -class Comment::Notifier < ActionMailer::Base 1 +class CommentNotifier < ActionMailer::Base
2 def notification(comment) 2 def notification(comment)
3 profile = comment.article.profile 3 profile = comment.article.profile
4 @recipient = profile.nickname || profile.name 4 @recipient = profile.nickname || profile.name
app/mailers/scrap_notifier.rb
1 -class Scrap::Notifier < ActionMailer::Base 1 +class ScrapNotifier < ActionMailer::Base
2 def notification(scrap) 2 def notification(scrap)
3 sender, receiver = scrap.sender, scrap.receiver 3 sender, receiver = scrap.sender, scrap.receiver
4 @recipient = receiver.name 4 @recipient = receiver.name
app/models/add_friend.rb
@@ -4,7 +4,7 @@ class AddFriend &lt; Task @@ -4,7 +4,7 @@ class AddFriend &lt; Task
4 4
5 validates_presence_of :requestor_id, :target_id 5 validates_presence_of :requestor_id, :target_id
6 6
7 - validates_uniqueness_of :target_id, :scope => [ :requestor_id ] 7 + validates_uniqueness_of :target_id, scope: [ :requestor_id, :status ], if: proc{ |t| t.status == Task::Status::ACTIVE }
8 8
9 validates_length_of :group_for_person, :group_for_friend, :maximum => 150, :allow_nil => true 9 validates_length_of :group_for_person, :group_for_friend, :maximum => 150, :allow_nil => true
10 10
app/models/article.rb
1 -require 'hpricot'  
2 1
3 class Article < ActiveRecord::Base 2 class Article < ActiveRecord::Base
4 3
@@ -390,6 +389,10 @@ class Article &lt; ActiveRecord::Base @@ -390,6 +389,10 @@ class Article &lt; ActiveRecord::Base
390 {} 389 {}
391 end 390 end
392 391
  392 + def alternate_languages
  393 + self.translations.map(&:language)
  394 + end
  395 +
393 scope :native_translations, :conditions => { :translation_of_id => nil } 396 scope :native_translations, :conditions => { :translation_of_id => nil }
394 397
395 def translatable? 398 def translatable?
@@ -483,15 +486,18 @@ class Article &lt; ActiveRecord::Base @@ -483,15 +486,18 @@ class Article &lt; ActiveRecord::Base
483 scope :more_comments, :order => "comments_count DESC" 486 scope :more_comments, :order => "comments_count DESC"
484 scope :more_recent, :order => "created_at DESC" 487 scope :more_recent, :order => "created_at DESC"
485 488
486 - def self.display_filter(user, profile)  
487 - return {:conditions => ['articles.published = ?', true]} if !user  
488 - {:conditions => [" articles.published = ? OR  
489 - articles.last_changed_by_id = ? OR  
490 - articles.profile_id = ? OR  
491 - ? OR articles.show_to_followers = ? AND ?",  
492 - true, user.id, user.id, user.has_permission?(:view_private_content, profile),  
493 - true, user.follows?(profile)]}  
494 - end 489 + scope :display_filter, lambda {|user, profile|
  490 + return published if (user.nil? && profile && profile.public?)
  491 + return [] if user.nil? || (profile && !profile.public? && !user.follows?(profile))
  492 + where(
  493 + [
  494 + "published = ? OR last_changed_by_id = ? OR profile_id = ? OR ?
  495 + OR (show_to_followers = ? AND ?)", true, user.id, user.id,
  496 + profile.nil? ? false : user.has_permission?(:view_private_content, profile),
  497 + true, user.follows?(profile)
  498 + ]
  499 + )
  500 + }
495 501
496 502
497 def display_unpublished_article_to?(user) 503 def display_unpublished_article_to?(user)
@@ -703,7 +709,7 @@ class Article &lt; ActiveRecord::Base @@ -703,7 +709,7 @@ class Article &lt; ActiveRecord::Base
703 end 709 end
704 710
705 def first_paragraph 711 def first_paragraph
706 - paragraphs = Hpricot(to_html).search('p') 712 + paragraphs = Nokogiri::HTML.fragment(to_html).css('p')
707 paragraphs.empty? ? '' : paragraphs.first.to_html 713 paragraphs.empty? ? '' : paragraphs.first.to_html
708 end 714 end
709 715
@@ -725,8 +731,8 @@ class Article &lt; ActiveRecord::Base @@ -725,8 +731,8 @@ class Article &lt; ActiveRecord::Base
725 731
726 def body_images_paths 732 def body_images_paths
727 require 'uri' 733 require 'uri'
728 - Hpricot(self.body.to_s).search('img[@src]').collect do |i|  
729 - (self.profile && self.profile.environment) ? URI.join(self.profile.environment.top_url, URI.escape(i.attributes['src'])).to_s : i.attributes['src'] 734 + Nokogiri::HTML.fragment(self.body.to_s).css('img[src]').collect do |i|
  735 + (self.profile && self.profile.environment) ? URI.join(self.profile.environment.top_url, URI.escape(i['src'])).to_s : i['src']
730 end 736 end
731 end 737 end
732 738
@@ -763,11 +769,11 @@ class Article &lt; ActiveRecord::Base @@ -763,11 +769,11 @@ class Article &lt; ActiveRecord::Base
763 end 769 end
764 770
765 def first_image 771 def first_image
766 - img = Hpricot(self.lead.to_s).search('img[@src]').first || Hpricot(self.body.to_s).search('img').first  
767 - img.nil? ? '' : img.attributes['src'] 772 + img = Nokogiri::HTML.fragment(self.lead.to_s).css('img[src]').first || Nokogiri::HTML.fragment(self.body.to_s).search('img').first
  773 + img.nil? ? '' : img['src']
768 end 774 end
769 775
770 - delegate :region, :region_id, :environment, :environment_id, :to => :profile, :allow_nil => true 776 + delegate :lat, :lng, :region, :region_id, :environment, :environment_id, :to => :profile, :allow_nil => true
771 777
772 def has_macro? 778 def has_macro?
773 true 779 true
app/models/blog_archives_block.rb
@@ -36,8 +36,7 @@ class BlogArchivesBlock &lt; Block @@ -36,8 +36,7 @@ class BlogArchivesBlock &lt; Block
36 results << content_tag('li', content_tag('strong', "#{year} (#{count})")) 36 results << content_tag('li', content_tag('strong', "#{year} (#{count})"))
37 results << "<ul class='#{year}-archive'>" 37 results << "<ul class='#{year}-archive'>"
38 posts.except(:order).count(:all, :conditions => ['EXTRACT(YEAR FROM published_at)=?', year], :group => 'EXTRACT(MONTH FROM published_at)').sort_by {|month, count| -month.to_i}.each do |month, count| 38 posts.except(:order).count(:all, :conditions => ['EXTRACT(YEAR FROM published_at)=?', year], :group => 'EXTRACT(MONTH FROM published_at)').sort_by {|month, count| -month.to_i}.each do |month, count|
39 - month_name = gettext(MONTHS[month.to_i - 1])  
40 - results << content_tag('li', link_to("#{month_name} (#{count})", owner_blog.url.merge(:year => year, :month => month))) 39 + results << content_tag('li', link_to("#{month_name(month.to_i)} (#{count})", owner_blog.url.merge(:year => year, :month => month)))
41 end 40 end
42 results << "</ul>" 41 results << "</ul>"
43 end 42 end
app/models/box.rb
@@ -14,8 +14,8 @@ class Box &lt; ActiveRecord::Base @@ -14,8 +14,8 @@ class Box &lt; ActiveRecord::Base
14 end 14 end
15 15
16 def acceptable_blocks 16 def acceptable_blocks
17 - blocks_classes = central? ? Box.acceptable_center_blocks + plugins.dispatch(:extra_blocks, :type => owner.class, :position => 1) : Box.acceptable_side_blocks + plugins.dispatch(:extra_blocks, :type => owner.class, :position => [2, 3])  
18 - to_css_class_name(blocks_classes) 17 + blocks_classes = if central? then Box.acceptable_center_blocks + plugins.dispatch(:extra_blocks, :type => owner.class, :position => 1) else Box.acceptable_side_blocks + plugins.dispatch(:extra_blocks, :type => owner.class, :position => [2, 3]) end
  18 + to_css_selector blocks_classes
19 end 19 end
20 20
21 def central? 21 def central?
@@ -74,8 +74,8 @@ class Box &lt; ActiveRecord::Base @@ -74,8 +74,8 @@ class Box &lt; ActiveRecord::Base
74 74
75 private 75 private
76 76
77 - def to_css_class_name(blocks_classes)  
78 - blocks_classes.map{ |block_class| block_class.name.to_css_class } 77 + def to_css_selector(blocks_classes)
  78 + blocks_classes.map{ |block_class| ".#{block_class.name.to_css_class}" }.join(',')
79 end 79 end
80 80
81 end 81 end
app/models/chat_message.rb 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +class ChatMessage < ActiveRecord::Base
  2 + attr_accessible :body, :from, :to
  3 +
  4 + belongs_to :to, :class_name => 'Profile'
  5 + belongs_to :from, :class_name => 'Profile'
  6 +
  7 +end
app/models/comment.rb
@@ -132,11 +132,11 @@ class Comment &lt; ActiveRecord::Base @@ -132,11 +132,11 @@ class Comment &lt; ActiveRecord::Base
132 def notify_by_mail 132 def notify_by_mail
133 if source.kind_of?(Article) && article.notify_comments? 133 if source.kind_of?(Article) && article.notify_comments?
134 if !notification_emails.empty? 134 if !notification_emails.empty?
135 - Comment::Notifier.notification(self).deliver 135 + CommentNotifier.notification(self).deliver
136 end 136 end
137 emails = article.followers - [author_email] 137 emails = article.followers - [author_email]
138 if !emails.empty? 138 if !emails.empty?
139 - Comment::Notifier.mail_to_followers(self, emails).deliver 139 + CommentNotifier.mail_to_followers(self, emails).deliver
140 end 140 end
141 end 141 end
142 end 142 end
app/models/enterprise.rb
@@ -19,7 +19,8 @@ class Enterprise &lt; Organization @@ -19,7 +19,8 @@ class Enterprise &lt; Organization
19 has_many :inputs, :through => :products 19 has_many :inputs, :through => :products
20 has_many :production_costs, :as => :owner 20 has_many :production_costs, :as => :owner
21 21
22 - has_and_belongs_to_many :fans, :class_name => 'Person', :join_table => 'favorite_enteprises_people' 22 + has_many :favorite_enterprise_people
  23 + has_many :fans, through: :favorite_enterprise_people, source: :person
23 24
24 def product_categories 25 def product_categories
25 ProductCategory.by_enterprise(self) 26 ProductCategory.by_enterprise(self)
app/models/environment.rb
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 # domains. 3 # domains.
4 class Environment < ActiveRecord::Base 4 class Environment < ActiveRecord::Base
5 5
6 - attr_accessible :name, :is_default, :signup_welcome_text_subject, :signup_welcome_text_body, :terms_of_use, :message_for_disabled_enterprise, :news_amount_by_folder, :default_language, :languages, :description, :organization_approval_method, :enabled_plugins, :enabled_features, :redirection_after_login, :redirection_after_signup, :contact_email, :theme, :reports_lower_bound, :noreply_email, :signup_welcome_screen_body, :members_whitelist_enabled, :members_whitelist 6 + attr_accessible :name, :is_default, :signup_welcome_text_subject, :signup_welcome_text_body, :terms_of_use, :message_for_disabled_enterprise, :news_amount_by_folder, :default_language, :languages, :description, :organization_approval_method, :enabled_plugins, :enabled_features, :redirection_after_login, :redirection_after_signup, :contact_email, :theme, :reports_lower_bound, :noreply_email, :signup_welcome_screen_body, :members_whitelist_enabled, :members_whitelist, :highlighted_news_amount, :portal_news_amount
7 7
8 has_many :users 8 has_many :users
9 9
@@ -268,9 +268,12 @@ class Environment &lt; ActiveRecord::Base @@ -268,9 +268,12 @@ class Environment &lt; ActiveRecord::Base
268 settings_items :description, :type => String, :default => '<div style="text-align: center"><a href="http://noosfero.org/"><img src="/images/noosfero-network.png" alt="Noosfero"/></a></div>' 268 settings_items :description, :type => String, :default => '<div style="text-align: center"><a href="http://noosfero.org/"><img src="/images/noosfero-network.png" alt="Noosfero"/></a></div>'
269 settings_items :local_docs, :type => Array, :default => [] 269 settings_items :local_docs, :type => Array, :default => []
270 settings_items :news_amount_by_folder, :type => Integer, :default => 4 270 settings_items :news_amount_by_folder, :type => Integer, :default => 4
  271 + settings_items :highlighted_news_amount, :type => Integer, :default => 2
  272 + settings_items :portal_news_amount, :type => Integer, :default => 5
271 settings_items :help_message_to_add_enterprise, :type => String, :default => '' 273 settings_items :help_message_to_add_enterprise, :type => String, :default => ''
272 settings_items :tip_message_enterprise_activation_question, :type => String, :default => '' 274 settings_items :tip_message_enterprise_activation_question, :type => String, :default => ''
273 275
  276 + settings_items :currency_iso_unit, :type => String, :default => 'USD'
274 settings_items :currency_unit, :type => String, :default => '$' 277 settings_items :currency_unit, :type => String, :default => '$'
275 settings_items :currency_separator, :type => String, :default => '.' 278 settings_items :currency_separator, :type => String, :default => '.'
276 settings_items :currency_delimiter, :type => String, :default => ',' 279 settings_items :currency_delimiter, :type => String, :default => ','
app/models/event.rb
@@ -141,11 +141,13 @@ class Event &lt; Article @@ -141,11 +141,13 @@ class Event &lt; Article
141 result 141 result
142 end 142 end
143 143
  144 + def duration
  145 + ((self.end_date || self.start_date) - self.start_date).to_i
  146 + end
  147 +
  148 + alias_method :article_lead, :lead
144 def lead 149 def lead
145 - content_tag('div',  
146 - show_period(start_date, end_date),  
147 - :class => 'event-dates'  
148 - ) + super 150 + self.class.action_view.render 'content_viewer/event_lead', event: self
149 end 151 end
150 152
151 def event? 153 def event?
app/models/external_feed.rb
@@ -14,9 +14,9 @@ class ExternalFeed &lt; ActiveRecord::Base @@ -14,9 +14,9 @@ class ExternalFeed &lt; ActiveRecord::Base
14 14
15 def add_item(title, link, date, content) 15 def add_item(title, link, date, content)
16 return if content.blank? 16 return if content.blank?
17 - doc = Hpricot(content)  
18 - doc.search('*').each do |p|  
19 - if p.instance_of? Hpricot::Elem 17 + doc = Nokogiri::HTML.fragment content
  18 + doc.css('*').each do |p|
  19 + if p.instance_of? Nokogiri::XML::Element
20 p.remove_attribute 'style' 20 p.remove_attribute 'style'
21 p.remove_attribute 'class' 21 p.remove_attribute 'class'
22 end 22 end
@@ -26,10 +26,10 @@ class ExternalFeed &lt; ActiveRecord::Base @@ -26,10 +26,10 @@ class ExternalFeed &lt; ActiveRecord::Base
26 article = TinyMceArticle.new 26 article = TinyMceArticle.new
27 article.name = title 27 article.name = title
28 article.profile = blog.profile 28 article.profile = blog.profile
29 - article.body = content  
30 - article.published_at = date  
31 - article.source = link  
32 - article.profile = blog.profile 29 + article.body = content
  30 + article.published_at = date
  31 + article.source = link
  32 + article.profile = blog.profile
33 article.parent = blog 33 article.parent = blog
34 article.author_name = self.feed_title 34 article.author_name = self.feed_title
35 unless blog.children.exists?(:slug => article.slug) 35 unless blog.children.exists?(:slug => article.slug)
app/models/favorite_enterprise_person.rb 0 → 100644
@@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
  1 +class FavoriteEnterprisePerson < ActiveRecord::Base
  2 +
  3 + self.table_name = :favorite_enteprises_people
  4 +
  5 + belongs_to :enterprise
  6 + belongs_to :person
  7 +
  8 +end
app/models/forum.rb
@@ -54,7 +54,7 @@ class Forum &lt; Folder @@ -54,7 +54,7 @@ class Forum &lt; Folder
54 54
55 def first_paragraph 55 def first_paragraph
56 return '' if body.blank? 56 return '' if body.blank?
57 - paragraphs = Hpricot(body).search('p') 57 + paragraphs = Nokogiri::HTML.fragment(body).css('p')
58 paragraphs.empty? ? '' : paragraphs.first.to_html 58 paragraphs.empty? ? '' : paragraphs.first.to_html
59 end 59 end
60 60
app/models/input.rb
1 class Input < ActiveRecord::Base 1 class Input < ActiveRecord::Base
2 2
3 - attr_accessible :product, :product_category, :product_category_id, :amount_used, :unit_id, :price_per_unit, :relevant_to_price 3 + attr_accessible :product, :product_id, :product_category, :product_category_id,
  4 + :amount_used, :unit_id, :price_per_unit, :relevant_to_price, :is_from_solidarity_economy
4 5
5 belongs_to :product 6 belongs_to :product
6 belongs_to :product_category 7 belongs_to :product_category
app/models/main_block.rb
@@ -24,4 +24,10 @@ class MainBlock &lt; Block @@ -24,4 +24,10 @@ class MainBlock &lt; Block
24 ['always', 'except_home_page'] 24 ['always', 'except_home_page']
25 end 25 end
26 26
  27 + def display_user_options
  28 + @display_user_options = {
  29 + 'all' => _('All users')
  30 + }
  31 + end
  32 +
27 end 33 end
app/models/person.rb
@@ -150,7 +150,7 @@ roles] } @@ -150,7 +150,7 @@ roles] }
150 end 150 end
151 151
152 def already_request_friendship?(person) 152 def already_request_friendship?(person)
153 - person.tasks.find_by_requestor_id(self.id, :conditions => { :type => 'AddFriend' }) 153 + person.tasks.where(requestor_id: self.id, type: 'AddFriend', status: Task::Status::ACTIVE).first
154 end 154 end
155 155
156 def remove_friend(friend) 156 def remove_friend(friend)
@@ -435,6 +435,7 @@ roles] } @@ -435,6 +435,7 @@ roles] }
435 end 435 end
436 436
437 def follows?(profile) 437 def follows?(profile)
  438 + return false if profile.nil?
438 profile.followed_by?(self) 439 profile.followed_by?(self)
439 end 440 end
440 441
app/models/person_notifier.rb
@@ -22,12 +22,17 @@ class PersonNotifier @@ -22,12 +22,17 @@ class PersonNotifier
22 schedule_next_notification_mail 22 schedule_next_notification_mail
23 end 23 end
24 24
  25 + def notify_from
  26 + @person.last_notification || DateTime.now - @person.notification_time.hours
  27 + end
  28 +
25 def notify 29 def notify
26 if @person.notification_time && @person.notification_time > 0 30 if @person.notification_time && @person.notification_time > 0
27 - from = @person.last_notification || DateTime.now - @person.notification_time.hours  
28 - notifications = @person.tracked_notifications.find(:all, :conditions => ["created_at > ?", from]) 31 + notifications = @person.tracked_notifications.find(:all, :conditions => ["created_at > ?", notify_from])
  32 + tasks = Task.to(@person).without_spam.pending.where("created_at > ?", notify_from).order_by('created_at', 'asc')
  33 +
29 Noosfero.with_locale @person.environment.default_language do 34 Noosfero.with_locale @person.environment.default_language do
30 - Mailer::content_summary(@person, notifications).deliver unless notifications.empty? 35 + Mailer::content_summary(@person, notifications, tasks).deliver unless notifications.empty? && tasks.empty?
31 end 36 end
32 @person.settings[:last_notification] = DateTime.now 37 @person.settings[:last_notification] = DateTime.now
33 @person.save! 38 @person.save!
@@ -59,8 +64,12 @@ class PersonNotifier @@ -59,8 +64,12 @@ class PersonNotifier
59 end 64 end
60 65
61 def failure(job) 66 def failure(job)
62 - person = Person.find(person_id)  
63 - person.notifier.dispatch_notification_mail 67 + begin
  68 + person = Person.find(person_id)
  69 + person.notifier.dispatch_notification_mail
  70 + rescue
  71 + Rails.logger.error "PersonNotifier::NotifyJob: Cannot recover from failure"
  72 + end
64 end 73 end
65 74
66 end 75 end
@@ -73,18 +82,24 @@ class PersonNotifier @@ -73,18 +82,24 @@ class PersonNotifier
73 {:theme => nil} 82 {:theme => nil}
74 end 83 end
75 84
76 - def content_summary(person, notifications) 85 + def content_summary(person, notifications, tasks)
  86 + if person.environment
  87 + ActionMailer::Base.asset_host = person.environment.top_url
  88 + ActionMailer::Base.default_url_options[:host] = person.environment.default_hostname
  89 + end
  90 +
77 @current_theme = 'default' 91 @current_theme = 'default'
78 @profile = person 92 @profile = person
79 @recipient = @profile.nickname || @profile.name 93 @recipient = @profile.nickname || @profile.name
80 @notifications = notifications 94 @notifications = notifications
  95 + @tasks = tasks
81 @environment = @profile.environment.name 96 @environment = @profile.environment.name
82 @url = @profile.environment.top_url 97 @url = @profile.environment.top_url
83 mail( 98 mail(
84 content_type: "text/html", 99 content_type: "text/html",
85 from: "#{@profile.environment.name} <#{@profile.environment.noreply_email}>", 100 from: "#{@profile.environment.name} <#{@profile.environment.noreply_email}>",
86 to: @profile.email, 101 to: @profile.email,
87 - subject: _("[%s] Network Activity") % [@profile.environment.name] 102 + subject: _("[%s] Notifications") % [@profile.environment.name]
88 ) 103 )
89 end 104 end
90 end 105 end
app/models/product.rb
@@ -10,7 +10,8 @@ class Product &lt; ActiveRecord::Base @@ -10,7 +10,8 @@ class Product &lt; ActiveRecord::Base
10 :display => %w[full map] 10 :display => %w[full map]
11 } 11 }
12 12
13 - attr_accessible :name, :product_category, :highlighted, :price, :enterprise, :image_builder, :description, :available, :qualifiers, :unit_id, :discount, :inputs, :qualifiers_list 13 + attr_accessible :name, :product_category, :profile, :profile_id, :enterprise,
  14 + :highlighted, :price, :image_builder, :description, :available, :qualifiers, :unit_id, :discount, :inputs, :qualifiers_list
14 15
15 def self.default_search_display 16 def self.default_search_display
16 'full' 17 'full'
@@ -236,7 +237,7 @@ class Product &lt; ActiveRecord::Base @@ -236,7 +237,7 @@ class Product &lt; ActiveRecord::Base
236 237
237 def percentage_from_solidarity_economy 238 def percentage_from_solidarity_economy
238 se_i = t_i = 0 239 se_i = t_i = 0
239 - self.inputs(true).each{ |i| t_i += 1; se_i += 1 if i.is_from_solidarity_economy } 240 + self.inputs.each{ |i| t_i += 1; se_i += 1 if i.is_from_solidarity_economy }
240 t_i = 1 if t_i == 0 # avoid division by 0 241 t_i = 1 if t_i == 0 # avoid division by 0
241 p = case (se_i.to_f/t_i)*100 242 p = case (se_i.to_f/t_i)*100
242 when 0 then [0, ''] 243 when 0 then [0, '']
app/models/scrap.rb
@@ -25,7 +25,7 @@ class Scrap &lt; ActiveRecord::Base @@ -25,7 +25,7 @@ class Scrap &lt; ActiveRecord::Base
25 25
26 after_create do |scrap| 26 after_create do |scrap|
27 scrap.root.update_attribute('updated_at', DateTime.now) unless scrap.root.nil? 27 scrap.root.update_attribute('updated_at', DateTime.now) unless scrap.root.nil?
28 - Scrap::Notifier.notification(scrap).deliver if scrap.send_notification? 28 + ScrapNotifier.notification(scrap).deliver if scrap.send_notification?
29 end 29 end
30 30
31 before_validation :strip_all_html_tags 31 before_validation :strip_all_html_tags
app/models/text_article.rb
1 require 'noosfero/translatable_content' 1 require 'noosfero/translatable_content'
2 2
3 -# a base class for all text article types. 3 +# a base class for all text article types.
4 class TextArticle < Article 4 class TextArticle < Article
5 5
6 xss_terminate :only => [ :name ], :on => 'validation' 6 xss_terminate :only => [ :name ], :on => 'validation'
@@ -26,10 +26,10 @@ class TextArticle &lt; Article @@ -26,10 +26,10 @@ class TextArticle &lt; Article
26 before_save :set_relative_path 26 before_save :set_relative_path
27 27
28 def set_relative_path 28 def set_relative_path
29 - parsed = Hpricot(self.body.to_s)  
30 - parsed.search('img[@src]').map { |i| change_element_path(i, 'src') }  
31 - parsed.search('a[@href]').map { |i| change_element_path(i, 'href') }  
32 - self.body = parsed.to_s 29 + parsed = Nokogiri::HTML.fragment(self.body.to_s)
  30 + parsed.css('img[src]').each { |i| change_element_path(i, 'src') }
  31 + parsed.css('a[href]').each { |i| change_element_path(i, 'href') }
  32 + self.body = parsed.to_html
33 end 33 end
34 34
35 def change_element_path(el, attribute) 35 def change_element_path(el, attribute)
app/models/user.rb
@@ -54,7 +54,7 @@ class User &lt; ActiveRecord::Base @@ -54,7 +54,7 @@ class User &lt; ActiveRecord::Base
54 54
55 user.person = p 55 user.person = p
56 end 56 end
57 - if user.environment.enabled?('skip_new_user_email_confirmation') 57 + if user.environment.enabled?('skip_new_user_email_confirmation')
58 if user.environment.enabled?('admin_must_approve_new_users') 58 if user.environment.enabled?('admin_must_approve_new_users')
59 create_moderate_task 59 create_moderate_task
60 else 60 else
@@ -102,6 +102,7 @@ class User &lt; ActiveRecord::Base @@ -102,6 +102,7 @@ class User &lt; ActiveRecord::Base
102 validates_length_of :email, :within => 3..100, :if => (lambda {|user| !user.email.blank?}) 102 validates_length_of :email, :within => 3..100, :if => (lambda {|user| !user.email.blank?})
103 validates_uniqueness_of :login, :email, :case_sensitive => false, :scope => :environment_id 103 validates_uniqueness_of :login, :email, :case_sensitive => false, :scope => :environment_id
104 before_save :encrypt_password 104 before_save :encrypt_password
  105 + before_save :normalize_email, if: proc{ |u| u.email.present? }
105 validates_format_of :email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda {|user| !user.email.blank?}) 106 validates_format_of :email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda {|user| !user.email.blank?})
106 107
107 validates_inclusion_of :terms_accepted, :in => [ '1' ], :if => lambda { |u| ! u.terms_of_use.blank? }, :message => N_('{fn} must be checked in order to signup.').fix_i18n 108 validates_inclusion_of :terms_accepted, :in => [ '1' ], :if => lambda { |u| ! u.terms_of_use.blank? }, :message => N_('{fn} must be checked in order to signup.').fix_i18n
@@ -114,6 +115,10 @@ class User &lt; ActiveRecord::Base @@ -114,6 +115,10 @@ class User &lt; ActiveRecord::Base
114 u && u.authenticated?(password) ? u : nil 115 u && u.authenticated?(password) ? u : nil
115 end 116 end
116 117
  118 + def register_login
  119 + self.update_attribute :last_login_at, Time.now
  120 + end
  121 +
117 # Activates the user in the database. 122 # Activates the user in the database.
118 def activate 123 def activate
119 return false unless self.person 124 return false unless self.person
@@ -154,6 +159,7 @@ class User &lt; ActiveRecord::Base @@ -154,6 +159,7 @@ class User &lt; ActiveRecord::Base
154 @task.name = self.name 159 @task.name = self.name
155 @task.email = self.email 160 @task.email = self.email
156 @task.target = self.environment 161 @task.target = self.environment
  162 + @task.requestor = self.person
157 @task.save 163 @task.save
158 end 164 end
159 165
@@ -296,6 +302,10 @@ class User &lt; ActiveRecord::Base @@ -296,6 +302,10 @@ class User &lt; ActiveRecord::Base
296 end 302 end
297 end 303 end
298 304
  305 + def moderate_registration_pending?
  306 + return ModerateUserRegistration.exists?(:requestor_id => self.person.id, :target_id => self.environment.id, :status => Task::Status::ACTIVE)
  307 + end
  308 +
299 def data_hash(gravatar_default = nil) 309 def data_hash(gravatar_default = nil)
300 friends_list = {} 310 friends_list = {}
301 enterprises = person.enterprises.map { |e| { 'name' => e.short_name, 'identifier' => e.identifier } } 311 enterprises = person.enterprises.map { |e| { 'name' => e.short_name, 'identifier' => e.identifier } }
@@ -332,6 +342,11 @@ class User &lt; ActiveRecord::Base @@ -332,6 +342,11 @@ class User &lt; ActiveRecord::Base
332 end 342 end
333 343
334 protected 344 protected
  345 +
  346 + def normalize_email
  347 + self.email = self.email.squish.downcase
  348 + end
  349 +
335 # before filter 350 # before filter
336 def encrypt_password 351 def encrypt_password
337 return if password.blank? 352 return if password.blank?
@@ -359,6 +374,6 @@ class User &lt; ActiveRecord::Base @@ -359,6 +374,6 @@ class User &lt; ActiveRecord::Base
359 374
360 def delay_activation_check 375 def delay_activation_check
361 return if person.is_template? 376 return if person.is_template?
362 - Delayed::Job.enqueue(UserActivationJob.new(self.id), {:priority => 0, :run_at => 72.hours.from_now}) 377 + Delayed::Job.enqueue(UserActivationJob.new(self.id), {:priority => 0, :run_at => (NOOSFERO_CONF['hours_until_user_activation_check'] || 72).hours.from_now})
363 end 378 end
364 end 379 end
app/views/account/_login_form.html.erb
1 <%= labelled_form_for :user, 1 <%= labelled_form_for :user,
2 :url => { :controller => 'account', :action => (params[:enterprise_code] ? 'activate_enterprise' : 'login') } do |f| %> 2 :url => { :controller => 'account', :action => (params[:enterprise_code] ? 'activate_enterprise' : 'login') } do |f| %>
3 3
4 -<%= f.text_field :login,  
5 - :id => ( lightbox? ? 'lightbox_' : '' ) + 'user_login',  
6 - :onchange => 'this.value = convToValidLogin( this.value )' %> 4 +<%= f.text_field :login, :id => 'user_login', :onchange => 'this.value = convToValidLogin( this.value )' %>
7 5
8 -<%= f.password_field :password,  
9 - :id => ( lightbox? ? 'lightbox_' : '' ) + 'user_password' %> 6 +<%= f.password_field :password, :id => 'user_password' %>
10 7
11 <% if params[:enterprise_code] %> 8 <% if params[:enterprise_code] %>
12 <%= hidden_field_tag :enterprise_code, params[:enterprise_code] %> 9 <%= hidden_field_tag :enterprise_code, params[:enterprise_code] %>
@@ -16,7 +13,7 @@ @@ -16,7 +13,7 @@
16 13
17 <% button_bar do %> 14 <% button_bar do %>
18 <%= submit_button( 'login', _('Log in') )%> 15 <%= submit_button( 'login', _('Log in') )%>
19 - <%= lightbox_close_button(_('Cancel')) if lightbox? %> 16 + <%= modal_close_button _('Cancel') if request.xhr? %>
20 <% end %> 17 <% end %>
21 18
22 <% end %> 19 <% end %>
app/views/account/_signup_form.html.erb
@@ -16,7 +16,7 @@ @@ -16,7 +16,7 @@
16 <input type="hidden" id="signup_time_key" name="signup_time_key" /> 16 <input type="hidden" id="signup_time_key" name="signup_time_key" />
17 <script type="text/javascript"> 17 <script type="text/javascript">
18 jQuery.ajax({ 18 jQuery.ajax({
19 - type: "POST", 19 + type: "GET",
20 url: "<%= url_for :controller=>'account', :action=>'signup_time' %>", 20 url: "<%= url_for :controller=>'account', :action=>'signup_time' %>",
21 dataType: 'json', 21 dataType: 'json',
22 success: function(data) { 22 success: function(data) {
app/views/account/activate_enterprise.html.erb
@@ -7,8 +7,8 @@ @@ -7,8 +7,8 @@
7 <p><%= _('Do you have a personal user account in the system?') %></p> 7 <p><%= _('Do you have a personal user account in the system?') %></p>
8 8
9 <div id="enterprise-activation-create-user-or-login-button"> 9 <div id="enterprise-activation-create-user-or-login-button">
10 - <%= button_to_function 'login', _('Yes'), "$('enterprise-activation-create-user-form').hide(); $('enterprise-activation-login-form').show()" %>  
11 - <%= button_to_function 'add', _('No'), "$('enterprise-activation-login-form').hide(); $('enterprise-activation-create-user-form').show()" %> 10 + <%= button_to_function 'login', _('Yes'), "jQuery('#enterprise-activation-create-user-form').hide(); jQuery('#enterprise-activation-login-form').show()" %>
  11 + <%= button_to_function 'add', _('No'), "jQuery('#enterprise-activation-login-form').hide(); jQuery('#enterprise-activation-create-user-form').show()" %>
12 </div> 12 </div>
13 13
14 <div id="enterprise-activation-create-user-form" style="display: none"> 14 <div id="enterprise-activation-create-user-form" style="display: none">
app/views/account/index_anonymous.html.erb
1 <h1><%= _('Identify yourself') %></h1> 1 <h1><%= _('Identify yourself') %></h1>
2 2
3 <p> 3 <p>
4 -<%= lightbox_link_to _('Login.'), { :controller => 'account', :action => 'login_popup' } %> 4 +<%= modal_link_to _('Login.'), { :controller => 'account', :action => 'login_popup' } %>
5 5
6 <%= _('You need to login to be able to use all the features in this environment.') %> 6 <%= _('You need to login to be able to use all the features in this environment.') %>
7 </p> 7 </p>
app/views/account/login.html.erb
@@ -3,11 +3,11 @@ @@ -3,11 +3,11 @@
3 <h2><%= _('Login') %></h2> 3 <h2><%= _('Login') %></h2>
4 4
5 <% @user ||= User.new %> 5 <% @user ||= User.new %>
6 -<% is_thickbox ||= false %> 6 +<% is_popin ||= false %>
7 7
8 <%= @message %> 8 <%= @message %>
9 9
10 -<%= labelled_form_for :user, :url => login_url do |f| %> 10 +<%= labelled_form_for :user, :url => login_url, :horizontal => true do |f| %>
11 11
12 <%= f.text_field :login, :id => 'main_user_login', :onchange => 'this.value = convToValidLogin( this.value )', :value => params[:userlogin] %> 12 <%= f.text_field :login, :id => 'main_user_login', :onchange => 'this.value = convToValidLogin( this.value )', :value => params[:userlogin] %>
13 13
@@ -17,8 +17,8 @@ @@ -17,8 +17,8 @@
17 17
18 <% button_bar do %> 18 <% button_bar do %>
19 <%= submit_button( 'login', _('Log in') )%> 19 <%= submit_button( 'login', _('Log in') )%>
20 - <% if is_thickbox %>  
21 - <%= thickbox_close_button(_('Cancel')) %> 20 + <% if is_popin %>
  21 + <%= modal_close_button(_('Cancel')) %>
22 <% end %> 22 <% end %>
23 <% end %> 23 <% end %>
24 24
app/views/account/login_block.html.erb
@@ -20,9 +20,7 @@ @@ -20,9 +20,7 @@
20 <% button_bar do %> 20 <% button_bar do %>
21 <%= submit_button( 'login', _('Log in') )%> 21 <%= submit_button( 'login', _('Log in') )%>
22 <% unless @plugins.dispatch(:allow_user_registration).include?(false) %> 22 <% unless @plugins.dispatch(:allow_user_registration).include?(false) %>
23 - <%= link_to content_tag( 'span', _('New user') ),  
24 - { :controller => 'account', :action => 'signup' },  
25 - :class => 'button with-text icon-add' %> 23 + <%= button(:add, _('New user'), { :controller => 'account', :action => 'signup' }) %>
26 <% end %> 24 <% end %>
27 <% end %> 25 <% end %>
28 26
app/views/account/logout_popup.html.erb
@@ -2,6 +2,6 @@ @@ -2,6 +2,6 @@
2 <p> 2 <p>
3 <% button_bar do %> 3 <% button_bar do %>
4 <%= button :ok, _('Yes'), { :controller => 'account', :action => 'logout' } %> 4 <%= button :ok, _('Yes'), { :controller => 'account', :action => 'logout' } %>
5 - <%= lightbox_close_button _('No, I want to stay.') %> 5 + <%= modal_close_button _('No, I want to stay.') %>
6 <% end %> 6 <% end %>
7 </p> 7 </p>
app/views/admin_panel/set_portal_community.html.erb
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 <%= button 'ok', _('Enable'), {:action => 'manage_portal_community', :activate => 1} %> 18 <%= button 'ok', _('Enable'), {:action => 'manage_portal_community', :activate => 1} %>
19 <% end %> 19 <% end %>
20 <%= button 'folder', _('Select Portal Folders'), {:action => 'set_portal_folders'} %> 20 <%= button 'folder', _('Select Portal Folders'), {:action => 'set_portal_folders'} %>
21 - <%= button 'edit', _('Define Amount by Folder'), {:action => 'set_portal_news_amount'} %> 21 + <%= button 'edit', _('Define news amount on portal'), {:action => 'set_portal_news_amount'} %>
22 <%= button 'delete', _('Remove'), { :action => 'unset_portal_community'} %> 22 <%= button 'delete', _('Remove'), { :action => 'unset_portal_community'} %>
23 <% end %> 23 <% end %>
24 <% end %> 24 <% end %>
app/views/admin_panel/set_portal_news_amount.html.erb
1 -<h1><%= _('News amount by folder') %></h1> 1 +<h1><%= _('News amount on portal') %></h1>
2 2
3 <%= labelled_form_for :environment do |f| %> 3 <%= labelled_form_for :environment do |f| %>
4 4
5 - <%= labelled_form_field _('Number of news'), select(:environment, :news_amount_by_folder, (1..10).to_a) %> 5 + <%= labelled_form_field _('Number of highlighted news'), select(:environment, :highlighted_news_amount, (0..10).to_a) %>
  6 + <%= labelled_form_field _('Number of portal news'), select(:environment, :portal_news_amount, (0..10).to_a) %>
  7 + <%= labelled_form_field _('Number of news by folder'), select(:environment, :news_amount_by_folder, (1..10).to_a) %>
6 8
7 <% button_bar do %> 9 <% button_bar do %>
8 <%= submit_button(:save, _('Save')) %> 10 <%= submit_button(:save, _('Save')) %>
app/views/blocks/login_block.html.erb
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 <li><%= link_to _('Homepage'), user.public_profile_url %></li> 6 <li><%= link_to _('Homepage'), user.public_profile_url %></li>
7 </ul> 7 </ul>
8 <div class="user-actions"> 8 <div class="user-actions">
9 - <%= link_to content_tag('span', _('Logout')), { :controller => 'account', :action => 'logout' }, :class => 'button with-text icon-menu-logout' %> 9 + <%= button(:'menu-logout', _('Logout'), :controller => 'account', :action => 'logout') %>
10 </div> 10 </div>
11 </div> 11 </div>
12 <% else %> 12 <% else %>
app/views/blocks/profile_info_actions/_community.html.erb
@@ -5,11 +5,11 @@ @@ -5,11 +5,11 @@
5 <% if logged_in? %> 5 <% if logged_in? %>
6 <% if profile.enable_contact? %> 6 <% if profile.enable_contact? %>
7 <li> 7 <li>
8 - <%= link_to content_tag('span', _('Send an e-mail')),  
9 - { :profile => profile.identifier,  
10 - :controller => 'contact',  
11 - :action => 'new' },  
12 - {:class => 'button with-text icon-menu-mail', :title => _('Send an e-mail to the administrators')} %> 8 + <%= button(:'menu-mail', _('Send an e-mail'),
  9 + { :profile => profile.identifier,
  10 + :controller => 'contact',
  11 + :action => 'new' },
  12 + { :title => _('Send an e-mail to the administrators')}) %>
13 </li> 13 </li>
14 <% end %> 14 <% end %>
15 15
app/views/blocks/profile_info_actions/_enterprise.html.erb
1 <ul> 1 <ul>
2 <%if logged_in? %> 2 <%if logged_in? %>
3 <%if !user.favorite_enterprises.include?(profile) %> 3 <%if !user.favorite_enterprises.include?(profile) %>
4 - <li><%= link_to content_tag('span', _('Add as favorite')), { :profile => user.identifier, :controller => 'favorite_enterprises', :action => 'add', :id => profile.id }, :class => 'button with-text icon-add', :title => _('Add enterprise as favorite') %></li> 4 + <li><%= button(:add, _('Add as favorite'), { :profile => user.identifier, :controller => 'favorite_enterprises', :action => 'add', :id => profile.id }, :title => _('Add enterprise as favorite')) %></li>
5 <% end %> 5 <% end %>
6 <% end %> 6 <% end %>
7 <% if profile.enable_contact? %> 7 <% if profile.enable_contact? %>
8 - <li> <%= link_to content_tag('span', _('Send an e-mail')), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}, {:id => 'enterprise-contact-button', :class => 'button with-text icon-menu-mail'} %> </li> 8 + <li><%= button(:'menu-mail', _('Send an e-mail'), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}, {:id => 'enterprise-contact-button'} ) %></li>
9 <% end %> 9 <% end %>
10 10
11 <li><%= report_abuse(profile, :button) %></li> 11 <li><%= report_abuse(profile, :button) %></li>
app/views/blocks/profile_info_actions/_join_leave_community.html.erb
@@ -22,8 +22,6 @@ @@ -22,8 +22,6 @@
22 <% end %> 22 <% end %>
23 <% end %> 23 <% end %>
24 <% else %> 24 <% else %>
25 - <%= link_to content_tag('span', _('Join')), profile.join_not_logged_url,  
26 - :class => 'button with-text icon-add',  
27 - :title => _('Join this community') %> 25 + <%= button(:add, _('Join'), profile.join_not_logged_url, :title => _('Join this community')) %>
28 <% end %> 26 <% end %>
29 </div> 27 </div>
app/views/blocks/profile_info_actions/_person.html.erb
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 <% end %> 8 <% end %>
9 9
10 <% if user.is_a_friend?(profile) && profile.enable_contact? %> 10 <% if user.is_a_friend?(profile) && profile.enable_contact? %>
11 - <li> <%= link_to content_tag('span', _('Send an e-mail')), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}, :class => 'button with-text icon-menu-mail' %> </li> 11 + <li><%= button(:back, _('Send an e-mail'), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}) %></li>
12 <% end %> 12 <% end %>
13 13
14 <li><%= report_abuse(profile, :button) %></li> 14 <li><%= report_abuse(profile, :button) %></li>
app/views/box_organizer/_highlights_block.html.erb
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 </tbody> 15 </tbody>
16 </table> 16 </table>
17 17
18 -<%= link_to(_('New highlight'), '#', :class => 'button icon-add with-text new-highlight-button')%> 18 +<%= button(:add, _('New highlight'), '#', class: 'new-highlight-button') %>
19 19
20 <%= labelled_form_field _('Image transition:'), select('block', 'interval', [[_('No automatic transition'), 0]] + [1, 2, 3, 4, 5, 10, 20, 30, 60].map {|item| [n_('Every 1 second', 'Every %d seconds', item) % item, item]}) %> 20 <%= labelled_form_field _('Image transition:'), select('block', 'interval', [[_('No automatic transition'), 0]] + [1, 2, 3, 4, 5, 10, 20, 30, 60].map {|item| [n_('Every 1 second', 'Every %d seconds', item) % item, item]}) %>
21 21
app/views/box_organizer/add_block.html.erb
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 42
43 <% button_bar do %> 43 <% button_bar do %>
44 <%= submit_button(:add, _("Add")) %> 44 <%= submit_button(:add, _("Add")) %>
45 - <%= colorbox_close_button(_('Close')) %> 45 + <%= modal_close_button(_('Close')) %>
46 <% end %> 46 <% end %>
47 47
48 <% end %> 48 <% end %>
app/views/box_organizer/edit.html.erb
@@ -27,7 +27,7 @@ @@ -27,7 +27,7 @@
27 27
28 <% button_bar do %> 28 <% button_bar do %>
29 <%= submit_button(:save, _('Save')) %> 29 <%= submit_button(:save, _('Save')) %>
30 - <%= colorbox_close_button(_('Cancel')) %> 30 + <%= modal_close_button(_('Cancel')) %>
31 <% end %> 31 <% end %>
32 32
33 <% end %> 33 <% end %>
app/views/box_organizer/index.html.erb
1 <h1><%= _('Editing sideboxes')%></h1> 1 <h1><%= _('Editing sideboxes')%></h1>
2 2
3 <% button_bar :class=>'design-menu' do %> 3 <% button_bar :class=>'design-menu' do %>
4 - <%= colorbox_button('add', _('Add a block'), { :action => 'add_block' }) %> 4 + <%= modal_button('add', _('Add a block'), { :action => 'add_block' }) %>
5 <%= button(:back, _('Back to control panel'), :controller => (profile.nil? ? 'admin_panel': 'profile_editor')) %> 5 <%= button(:back, _('Back to control panel'), :controller => (profile.nil? ? 'admin_panel': 'profile_editor')) %>
6 <% end %> 6 <% end %>
app/views/box_organizer/move_block.rjs
@@ -6,3 +6,4 @@ page.replace_html(to, display_updated_box(@target_box)) @@ -6,3 +6,4 @@ page.replace_html(to, display_updated_box(@target_box))
6 6
7 page.visual_effect(:highlight, from) 7 page.visual_effect(:highlight, from)
8 page.visual_effect(:highlight, to) unless (from == to) 8 page.visual_effect(:highlight, to) unless (from == to)
  9 +
app/views/chat/auto_connect_busy.html.erb
@@ -1,5 +0,0 @@ @@ -1,5 +0,0 @@
1 -<script type='text/javascript'>  
2 - jQuery(function($) {  
3 - $('#chat-busy').trigger('click');  
4 - });  
5 -</script>  
app/views/chat/auto_connect_online.html.erb
@@ -1,5 +0,0 @@ @@ -1,5 +0,0 @@
1 -<script type='text/javascript'>  
2 - jQuery(function($) {  
3 - $('#chat-connect').trigger('click');  
4 - });  
5 -</script>  
app/views/cms/_blog.html.erb
@@ -10,7 +10,8 @@ @@ -10,7 +10,8 @@
10 10
11 <script type="text/javascript"> 11 <script type="text/javascript">
12 function submit_button(index) { 12 function submit_button(index) {
13 - return $("article_slug").form.select("input.submit")[index]; 13 + var form = $($("#article_slug")[0].form)
  14 + return form.find("input[type=submit]")[index];
14 } 15 }
15 function warn_value_change() { 16 function warn_value_change() {
16 show_warning('article-formitem', "slug-change-confirmation"); 17 show_warning('article-formitem', "slug-change-confirmation");
@@ -23,7 +24,7 @@ @@ -23,7 +24,7 @@
23 hide_warning('slug-change-confirmation'); 24 hide_warning('slug-change-confirmation');
24 } 25 }
25 function no_change() { 26 function no_change() {
26 - $("article_slug").value = $("old_article_slug").value; 27 + jQuery("#article_slug").val(jQuery("#old_article_slug").val());
27 enable_button(submit_button(0)); 28 enable_button(submit_button(0));
28 enable_button(submit_button(1)); 29 enable_button(submit_button(1));
29 hide_warning('slug-change-confirmation'); 30 hide_warning('slug-change-confirmation');
@@ -78,7 +79,7 @@ @@ -78,7 +79,7 @@
78 <div id='fetch-external-feed'> 79 <div id='fetch-external-feed'>
79 <% enabled = @article.external_feed && @article.external_feed.enabled %> 80 <% enabled = @article.external_feed && @article.external_feed.enabled %>
80 <% only_once = @article.external_feed ? @article.external_feed.only_once : true %> 81 <% only_once = @article.external_feed ? @article.external_feed.only_once : true %>
81 - <%= labelled_check_box(_('Fetch posts from an external feed'), 'article[external_feed_builder][enabled]', 'true', enabled, {:onchange => "$('external-feed-options').toggle()"}) %> 82 + <%= labelled_check_box(_('Fetch posts from an external feed'), 'article[external_feed_builder][enabled]', 'true', enabled, {:onchange => "jQuery('#external-feed-options').toggle()"}) %>
82 <div id='external-feed-options' style="display: <%= enabled ? 'block' : 'none' %>"> 83 <div id='external-feed-options' style="display: <%= enabled ? 'block' : 'none' %>">
83 <%= efeed.hidden_field(:id) %> 84 <%= efeed.hidden_field(:id) %>
84 <%= labelled_form_field( _('Feed address'), efeed.text_field(:address) ) %> 85 <%= labelled_form_field( _('Feed address'), efeed.text_field(:address) ) %>
app/views/cms/_upload_file.html.erb
1 <p><%= file_field_tag('uploaded_files[]', :size => size) %></p> 1 <p><%= file_field_tag('uploaded_files[]', :size => size) %></p>
2 -<%= javascript_tag("$('uploaded_files').scrollTop = $('uploaded_files').scrollHeight") %>  
app/views/cms/_upload_file_form.html.erb
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 <%= hidden_field_tag('back_to', @back_to) %> 13 <%= hidden_field_tag('back_to', @back_to) %>
14 14
15 <% button_bar do %> 15 <% button_bar do %>
16 - <%= add_upload_file_field(_('More files'), {:size => size}) %> 16 + <%= button_to_function :add, _('More files'), "add_new_file_fields()" %>
17 <% if @back_to %> 17 <% if @back_to %>
18 <%= submit_button :save, _('Upload'), :cancel => @back_to %> 18 <%= submit_button :save, _('Upload'), :cancel => @back_to %>
19 <% else %> 19 <% else %>
app/views/cms/edit.html.erb
@@ -28,7 +28,7 @@ @@ -28,7 +28,7 @@
28 <% end %> 28 <% end %>
29 29
30 <div style='float: right'> 30 <div style='float: right'>
31 - <%= lightbox_button :help, _('Why categorize?'), :action => 'why_categorize' %> 31 + <%= modal_button :help, _('Why categorize?'), :action => 'why_categorize' %>
32 </div> 32 </div>
33 33
34 <%= select_categories(:article, _('Categorize your article')) %> 34 <%= select_categories(:article, _('Categorize your article')) %>
app/views/cms/select_article_type.html.erb
@@ -15,6 +15,6 @@ @@ -15,6 +15,6 @@
15 </ul> 15 </ul>
16 <br style="clear:both" /> 16 <br style="clear:both" />
17 17
18 -<%= colorbox_close_button(_('Cancel')) %> 18 +<%= modal_close_button(_('Cancel')) %>
19 19
20 </div> 20 </div>
app/views/cms/view.html.erb
@@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
17 <% button_bar(:style => 'margin-bottom: 1em;') do %> 17 <% button_bar(:style => 'margin-bottom: 1em;') do %>
18 <% parent_id = ((@article && @article.allow_children?) ? @article : nil) %> 18 <% parent_id = ((@article && @article.allow_children?) ? @article : nil) %>
19 19
20 - <%= colorbox_button('new', _('New content'), :action => 'new', :parent_id => parent_id, :cms => true) %> 20 + <%= modal_button('new', _('New content'), :action => 'new', :parent_id => parent_id, :cms => true) %>
21 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor', :action => "index") %> 21 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor', :action => "index") %>
22 <% end %> 22 <% end %>
23 23
app/views/cms/why_categorize.html.erb
@@ -5,5 +5,5 @@ @@ -5,5 +5,5 @@
5 </p> 5 </p>
6 6
7 <% button_bar do %> 7 <% button_bar do %>
8 - <%= lightbox_close_button _('Close') %> 8 + <%= modal_close_button _('Close') %>
9 <% end %> 9 <% end %>
app/views/comment/_comment_actions.html.erb
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <% if !links_submenu.empty? %> 2 <% if !links_submenu.empty? %>
3 <div class="comment-actions"> 3 <div class="comment-actions">
4 <li class="vcard"> 4 <li class="vcard">
5 - <%= link_to(content_tag(:span, _('Contents menu')), '#', :onclick => "toggleSubmenu(this,'',#{CGI::escapeHTML(links_submenu.to_json)}); return false", :class => 'menu-submenu-trigger comment-trigger', :url => url) %> 5 + <%= popover_menu(_('Contents menu'),'',links_submenu,:class => 'comment-trigger', :url => url) %>
6 </li> 6 </li>
7 </div> 7 </div>
8 <% end %> 8 <% end %>
app/views/comment/_comment_form.html.erb
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %> 10 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %>
11 <% button_bar do %> 11 <% button_bar do %>
12 <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %> 12 <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %>
13 - <%= button_to_function :cancel, _('Cancel'), "jQuery.colorbox.close()" %> 13 + <%= button_to_function :cancel, _('Cancel'), "noosfero.modal.close()" %>
14 <% end %> 14 <% end %>
15 </div> 15 </div>
16 16
@@ -31,10 +31,10 @@ function check_captcha(button, confirm_action) { @@ -31,10 +31,10 @@ function check_captcha(button, confirm_action) {
31 return true; 31 return true;
32 <% else %> 32 <% else %>
33 jQuery('#recaptcha-container').show(); 33 jQuery('#recaptcha-container').show();
34 - jQuery.colorbox({ html: jQuery('#recaptcha-container').html(), maxWidth : '600px', maxHeight : '300px' }); 34 + noosfero.modal.inline('#recaptcha-container', {maxWidth :'600px', maxHeight : '300px' });
35 jQuery('#confirm-captcha').unbind('click'); 35 jQuery('#confirm-captcha').unbind('click');
36 jQuery('#confirm-captcha').bind('click', function() { 36 jQuery('#confirm-captcha').bind('click', function() {
37 - jQuery.colorbox.close(); 37 + noosfero.modal.close();
38 button.form.recaptcha_response_field.value = jQuery('#recaptcha_response_field').val(); 38 button.form.recaptcha_response_field.value = jQuery('#recaptcha_response_field').val();
39 button.form.recaptcha_challenge_field.value = jQuery('#recaptcha_challenge_field').val(); 39 button.form.recaptcha_challenge_field.value = jQuery('#recaptcha_challenge_field').val();
40 button.form.confirm.value = 'true'; 40 button.form.confirm.value = 'true';
@@ -88,7 +88,7 @@ function check_captcha(button, confirm_action) { @@ -88,7 +88,7 @@ function check_captcha(button, confirm_action) {
88 <% if !edition_mode %> 88 <% if !edition_mode %>
89 <%= button :cancel, _('Cancel'), '', :id => 'cancel-comment' %> 89 <%= button :cancel, _('Cancel'), '', :id => 'cancel-comment' %>
90 <% else %> 90 <% else %>
91 - <%= button :cancel, _('Cancel'), '#', :onclick => "jQuery.colorbox.close();" %> 91 + <%= button :cancel, _('Cancel'), '#', :onclick => "noosfero.modal.close();" %>
92 <% end %> 92 <% end %>
93 <% end %> 93 <% end %>
94 <% end %> 94 <% end %>
app/views/comment/notifier/mail_to_followers.html.erb
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -<%= _('Hi!') %>  
2 -  
3 -<%= word_wrap(_('%{sender} (%{sender_link}) commented on the content "%{article_title}".') % { :sender => @sender, :sender_link => url_for(@sender_link), :article_title => @article_title }) %>  
4 -  
5 -<%= word_wrap(_('Title: %s') % @comment_title) if @comment_title %>  
6 -  
7 -<%= _("Comment:") %>  
8 --------------------------------------------------------------------------------  
9 -<%= word_wrap(@comment_body) %>  
10 --------------------------------------------------------------------------------  
11 -  
12 -<%= _('Click on the address below to view this comment:') %>  
13 -<%= url_for @comment_url %>  
14 -  
15 -<%= _('Click on the address below to cancel the notification of new comments:') %>  
16 -<%= url_for @unsubscribe_url %>  
17 -  
18 -<%= _("Greetings,") %>  
19 -  
20 ---  
21 -<%= _('%s team.') % @environment %>  
22 -<%= url_for @url %>  
app/views/comment/notifier/notification.text.erb
@@ -1,19 +0,0 @@ @@ -1,19 +0,0 @@
1 -<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>  
2 -  
3 -<%= word_wrap(_('%{sender} (%{sender_link}) created a new comment on your article "%{article_title}".') % { :sender => @sender, :sender_link => url_for(@sender_link), :article_title => @article_title }) %>  
4 -  
5 -<%= word_wrap(_('Title: %s') % @comment_title) %>  
6 -  
7 -<%= _("Comment:") %>  
8 --------------------------------------------------------------------------------  
9 -<%= word_wrap(@comment_body) %>  
10 --------------------------------------------------------------------------------  
11 -  
12 -<%= _('Access the address below to view this comment:') %>  
13 -<%= url_for @comment_url %>  
14 -  
15 -<%= _("Greetings,") %>  
16 -  
17 ---  
18 -<%= _('%s team.') % @environment %>  
19 -<%= url_for @url %>  
app/views/comment_notifier/mail_to_followers.html.erb 0 → 100644
@@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
  1 +<%= _('Hi!') %>
  2 +
  3 +<%= word_wrap(_('%{sender} (%{sender_link}) commented on the content "%{article_title}".') % { :sender => @sender, :sender_link => url_for(@sender_link), :article_title => @article_title }) %>
  4 +
  5 +<%= word_wrap(_('Title: %s') % @comment_title) if @comment_title %>
  6 +
  7 +<%= _("Comment:") %>
  8 +-------------------------------------------------------------------------------
  9 +<%= word_wrap(@comment_body) %>
  10 +-------------------------------------------------------------------------------
  11 +
  12 +<%= _('Click on the address below to view this comment:') %>
  13 +<%= url_for @comment_url %>
  14 +
  15 +<%= _('Click on the address below to cancel the notification of new comments:') %>
  16 +<%= url_for @unsubscribe_url %>
  17 +
  18 +<%= _("Greetings,") %>
  19 +
  20 +--
  21 +<%= _('%s team.') % @environment %>
  22 +<%= url_for @url %>
app/views/comment_notifier/notification.text.erb 0 → 100644
@@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
  1 +<%= _('Hi, %{recipient}!') % { :recipient => @recipient } %>
  2 +
  3 +<%= word_wrap(_('%{sender} (%{sender_link}) created a new comment on your article "%{article_title}".') % { :sender => @sender, :sender_link => url_for(@sender_link), :article_title => @article_title }) %>
  4 +
  5 +<%= word_wrap(_('Title: %s') % @comment_title) %>
  6 +
  7 +<%= _("Comment:") %>
  8 +-------------------------------------------------------------------------------
  9 +<%= word_wrap(@comment_body) %>
  10 +-------------------------------------------------------------------------------
  11 +
  12 +<%= _('Access the address below to view this comment:') %>
  13 +<%= url_for @comment_url %>
  14 +
  15 +<%= _("Greetings,") %>
  16 +
  17 +--
  18 +<%= _('%s team.') % @environment %>
  19 +<%= url_for @url %>
app/views/content_viewer/_article_toolbar.html.erb
@@ -26,14 +26,14 @@ @@ -26,14 +26,14 @@
26 <%= expirable_button @page, :locale, content, url %> 26 <%= expirable_button @page, :locale, content, url %>
27 <% end %> 27 <% end %>
28 28
29 - <%= colorbox_button(:new, label_for_new_article(@page), profile.admin_url.merge(:controller => 'cms', :action => 'new', :parent_id => (@page.folder? ? @page : (@page.parent.nil? ? nil : @page.parent)))) unless remove_content_button(:new, @page) %> 29 + <%= modal_button(:new, label_for_new_article(@page), profile.admin_url.merge(:controller => 'cms', :action => 'new', :parent_id => (@page.folder? ? @page : (@page.parent.nil? ? nil : @page.parent)))) unless remove_content_button(:new, @page) %>
30 <% end %> 30 <% end %>
31 31
32 <% if @page.accept_uploads? && @page.allow_create?(user) %> 32 <% if @page.accept_uploads? && @page.allow_create?(user) %>
33 <%= button('upload-file', _('Upload files'), profile.admin_url.merge(:controller => 'cms', :action => 'upload_files', :parent_id => (@page.folder? ? @page : @page.parent))) unless remove_content_button(:upload, @page)%> 33 <%= button('upload-file', _('Upload files'), profile.admin_url.merge(:controller => 'cms', :action => 'upload_files', :parent_id => (@page.folder? ? @page : @page.parent))) unless remove_content_button(:upload, @page)%>
34 <% end %> 34 <% end %>
35 35
36 - <% if !@page.allow_create?(user) && profile.community? && (@page.blog? || @page.parent && @page.parent.blog?) && !remove_content_button(:suggest, @page) %> 36 + <% if !@page.allow_create?(user) && profile.organization? && (@page.blog? || @page.parent && @page.parent.blog?) && !remove_content_button(:suggest, @page) %>
37 <% content = content_tag( 'span', _('Suggest an article') ) %> 37 <% content = content_tag( 'span', _('Suggest an article') ) %>
38 <% url = profile.admin_url.merge({ :controller => 'cms', :action => 'suggest_an_article'}) %> 38 <% url = profile.admin_url.merge({ :controller => 'cms', :action => 'suggest_an_article'}) %>
39 <% options = {:id => 'suggest-article-link'} %> 39 <% options = {:id => 'suggest-article-link'} %>
app/views/content_viewer/_comment_form.html.erb
@@ -7,10 +7,10 @@ function submit_comment_form(button) { @@ -7,10 +7,10 @@ function submit_comment_form(button) {
7 return true; 7 return true;
8 <% else %> 8 <% else %>
9 jQuery('#recaptcha-container').show(); 9 jQuery('#recaptcha-container').show();
10 - jQuery.colorbox({ inline : true, href : '#recaptcha-container', maxWidth : '600px', maxHeight : '300px' }); 10 + noosfero.modal.inline('#recaptcha-container', {maxWidth :'600px', maxHeight : '300px' });
11 jQuery('#confirm-captcha').unbind('click'); 11 jQuery('#confirm-captcha').unbind('click');
12 jQuery('#confirm-captcha').bind('click', function() { 12 jQuery('#confirm-captcha').bind('click', function() {
13 - jQuery.colorbox.close(); 13 + noosfero.modal.close();
14 button.form.recaptcha_response_field.value = jQuery('#recaptcha_response_field').val(); 14 button.form.recaptcha_response_field.value = jQuery('#recaptcha_response_field').val();
15 button.form.recaptcha_challenge_field.value = jQuery('#recaptcha_challenge_field').val(); 15 button.form.recaptcha_challenge_field.value = jQuery('#recaptcha_challenge_field').val();
16 button.form.confirm.value = 'true'; 16 button.form.confirm.value = 'true';
@@ -38,7 +38,7 @@ function submit_comment_form(button) { @@ -38,7 +38,7 @@ function submit_comment_form(button) {
38 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %> 38 <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %>
39 <% button_bar do %> 39 <% button_bar do %>
40 <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %> 40 <%= button_to_function :add, _('Confirm'), "return false", :id => "confirm-captcha" %>
41 - <%= button_to_function :cancel, _('Cancel'), "jQuery.colorbox.close()" %> 41 + <%= button_to_function :cancel, _('Cancel'), "noosfero.modal.close()" %>
42 <% end %> 42 <% end %>
43 </div> 43 </div>
44 44
app/views/content_viewer/_event_lead.html.erb 0 → 100644
@@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
  1 +
  2 +<div class="event-dates">
  3 + <%= show_period event.start_date, event.end_date %>
  4 +</div>
  5 +
  6 +<%= event.article_lead %>
  7 +
app/views/events/_month.html.erb
@@ -13,8 +13,8 @@ @@ -13,8 +13,8 @@
13 date.day, 13 date.day,
14 :url => {:action => 'events_by_day', :year => date.year, :month => date.month, :day => date.day, :category_id => @category_id}, 14 :url => {:action => 'events_by_day', :year => date.year, :month => date.month, :day => date.day, :category_id => @category_id},
15 :update => 'events-of-the-day', 15 :update => 'events-of-the-day',
16 - :loading => "$('events-of-the-day').addClassName('loading')",  
17 - :complete => "$('events-of-the-day').removeClassName('loading')" 16 + :loading => "jQuery('#events-of-the-day').addClass('loading')",
  17 + :complete => "jQuery('#events-of-the-day').removeClass('loading')"
18 ) : 18 ) :
19 date.day 19 date.day
20 %> 20 %>
app/views/favorite_enterprises/index.html.erb
@@ -9,10 +9,7 @@ @@ -9,10 +9,7 @@
9 enterprise.identifier, :class => 'profile-link' %> 9 enterprise.identifier, :class => 'profile-link' %>
10 <%# profile_image_link enterprise, :portrait, 'div' %> 10 <%# profile_image_link enterprise, :portrait, 'div' %>
11 <div class="controll"> 11 <div class="controll">
12 - <%= link_to content_tag('span',_('remove')),  
13 - { :action => 'remove', :id => enterprise.id },  
14 - :class => 'button icon-delete',  
15 - :title => _('remove') %> 12 + <%= button(:delete, _('remove'), { :action => 'remove', :id => enterprise.id },:title => _('remove')) %>
16 </div><!-- end class="controll" --> 13 </div><!-- end class="controll" -->
17 </li> 14 </li>
18 <% end %> 15 <% end %>
app/views/invite/_select_address_book.html.erb
@@ -12,16 +12,16 @@ @@ -12,16 +12,16 @@
12 12
13 <script type="text/javascript"> 13 <script type="text/javascript">
14 function hide_invite_friend_login_password() { 14 function hide_invite_friend_login_password() {
15 - $('invite-friends-login-password').hide(); 15 + jQuery('#invite-friends-login-password').hide();
16 } 16 }
17 function show_invite_friend_login_password(option) { 17 function show_invite_friend_login_password(option) {
18 if (option == 'hotmail') { 18 if (option == 'hotmail') {
19 - $('hotmail_username_tip').show(); 19 + jQuery('#hotmail_username_tip').show();
20 } else { 20 } else {
21 - $('hotmail_username_tip').hide(); 21 + jQuery('#hotmail_username_tip').hide();
22 } 22 }
23 - $('invite-friends-login-password').show();  
24 - $('login').focus(); 23 + jQuery('#invite-friends-login-password').show();
  24 + jQuery('#login').focus();
25 } 25 }
26 </script> 26 </script>
27 <div id='invite-friends-login-password' <%= "style='display: none;'" if (@import_from == 'manual') %>> 27 <div id='invite-friends-login-password' <%= "style='display: none;'" if (@import_from == 'manual') %>>
app/views/invite/select_friends.html.erb
@@ -24,8 +24,8 @@ @@ -24,8 +24,8 @@
24 </div> 24 </div>
25 <% if @import_from != 'manual' %> 25 <% if @import_from != 'manual' %>
26 <div> 26 <div>
27 - <%= link_to_function _('Check all'), "$$('input.contact_to_invite').each(function(checkbox) { checkbox.checked = true; });" %>  
28 - <%= link_to_function _('Uncheck all'), "$$('input.contact_to_invite').each(function(checkbox) { checkbox.checked = false; });" %> 27 + <%= link_to_function _('Check all'), "jQuery('input.contact_to_invite').each(function(index,checkbox) { checkbox.checked = true; });" %>
  28 + <%= link_to_function _('Uncheck all'), "jQuery('input.contact_to_invite').each(function(index,checkbox) { checkbox.checked = false; });" %>
29 <div id='contacts-list'></div> 29 <div id='contacts-list'></div>
30 </div> 30 </div>
31 <% end -%> 31 <% end -%>
app/views/layouts/_javascript.html.erb
1 -<%= javascript_include_tag 'prototype.js', 'effects.js', 'dragdrop.js', 'controls.js',  
2 -'jquery-2.1.1.min', 'jquery-migrate-1.2.1',  
3 -'jquery.noconflict.js', 'jquery.cycle.all.min.js', 'thickbox.js', 'lightbox', 'colorbox',  
4 -'jquery-ui-1.10.4/js/jquery-ui-1.10.4.min', 'jquery.scrollTo', 'jquery.form.js', 'jquery-validation/jquery.validate',  
5 -'jquery.cookie', 'jquery.ba-bbq.min.js', 'reflection', 'jquery.tokeninput', 'jquery.typewatch', 'jquery.textchange',  
6 -'add-and-join', 'report-abuse', 'catalog', 'manage-products', 'autogrow', 'select-or-die/_src/selectordie',  
7 -'jquery-timepicker-addon/dist/jquery-ui-timepicker-addon', 'application.js', 'rails.js', 'inputosaurus.js', :cache => 'cache/application' %> 1 +<%= javascript_include_tag 'jquery-2.1.1.min', 'jquery-migrate-1.2.1', 'jrails', 'rails.js',
  2 + 'jquery.cycle.all.min.js', 'jquery.colorbox-min.js',
  3 + 'jquery-ui-1.10.4/js/jquery-ui-1.10.4.min', 'jquery.scrollTo', 'jquery.form.js', 'jquery-validation/jquery.validate',
  4 + 'jquery.cookie', 'jquery.ba-bbq.min.js', 'reflection', 'jquery.tokeninput', 'jquery.typewatch', 'jquery.textchange',
  5 + 'jquery-timepicker-addon/dist/jquery-ui-timepicker-addon', 'inputosaurus.js', 'select-or-die/_src/selectordie',
  6 + # noosfero libraries
  7 + 'application.js', 'modal.js',
  8 + 'add-and-join', 'report-abuse', 'catalog', 'manage-products', 'autogrow',
  9 + :cache => 'cache/application' %>
8 10
9 <% language = FastGettext.locale %> 11 <% language = FastGettext.locale %>
10 <% %w{messages methods}.each do |type| %> 12 <% %w{messages methods}.each do |type| %>
app/views/layouts/_user.html.erb
@@ -7,11 +7,11 @@ @@ -7,11 +7,11 @@
7 </span> 7 </span>
8 <% else %> 8 <% else %>
9 <span class='not-logged-in'> 9 <span class='not-logged-in'>
10 - <%= _("<span class='login'>%s</span>") % thickbox_inline_popup_link('<i class="icon-menu-login"></i><strong>' + _('Login') + '</strong>', login_url, 'inlineLoginBox', :id => 'link_login') %> 10 + <%= _("<span class='login'>%s</span>") % modal_inline_link_to('<i class="icon-menu-login"></i><strong>' + _('Login') + '</strong>', login_url, '#inlineLoginBox', :id => 'link_login') %>
11 <%= @plugins.dispatch(:alternative_authentication_link).collect { |content| instance_exec(&content) }.join("") %> 11 <%= @plugins.dispatch(:alternative_authentication_link).collect { |content| instance_exec(&content) }.join("") %>
12 12
13 <div id='inlineLoginBox' style='display: none;'> 13 <div id='inlineLoginBox' style='display: none;'>
14 - <%= render :file => 'account/login', :locals => { :is_thickbox => true } %> 14 + <%= render :file => 'account/login', :locals => { :is_popin => true } %>
15 </div> 15 </div>
16 16
17 <% unless @plugins.dispatch(:allow_user_registration).include?(false) %> 17 <% unless @plugins.dispatch(:allow_user_registration).include?(false) %>
app/views/layouts/application-ng.html.erb
@@ -5,12 +5,10 @@ @@ -5,12 +5,10 @@
5 <%= yield(:feeds) %> 5 <%= yield(:feeds) %>
6 <!--<meta http-equiv="refresh" content="1"/>--> 6 <!--<meta http-equiv="refresh" content="1"/>-->
7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
8 - <meta name="description" content="<%= @environment.name %>" />  
9 8
10 - <!-- Twitter Card -->  
11 - <meta name="twitter:card" value="summary">  
12 - <meta name="twitter:title" content="<%= h page_title %>">  
13 - <meta name="twitter:description" content="<%= meta_description_tag(@page) %>"> 9 + <% unless defined? MetadataPlugin and environment.enabled_plugins.include? 'MetadataPlugin' %>
  10 + <meta name="description" content="<%= @environment.name %>" />
  11 + <% end %>
14 12
15 <!-- site root --> 13 <!-- site root -->
16 <meta property="noosfero:root" content="<%= Noosfero.root %>"/> 14 <meta property="noosfero:root" content="<%= Noosfero.root %>"/>
@@ -23,7 +21,7 @@ @@ -23,7 +21,7 @@
23 <%= yield :head %> 21 <%= yield :head %>
24 <%= 22 <%=
25 @plugins.dispatch(:head_ending).map do |content| 23 @plugins.dispatch(:head_ending).map do |content|
26 - if content.respond_to?(:call) then instance_exec(&content).html_safe else content.html_safe end 24 + if content.respond_to?(:call) then instance_exec(&content).to_s.html_safe else content.to_s.html_safe end
27 end.join("\n") 25 end.join("\n")
28 %> 26 %>
29 27
@@ -37,7 +35,7 @@ @@ -37,7 +35,7 @@
37 35
38 <%= 36 <%=
39 @plugins.dispatch(:body_beginning).map do |content| 37 @plugins.dispatch(:body_beginning).map do |content|
40 - if content.respond_to?(:call) then instance_exec(&content).html_safe else content.html_safe end 38 + if content.respond_to?(:call) then instance_exec(&content).to_s.html_safe else content.to_s.html_safe end
41 end.join("\n") 39 end.join("\n")
42 %> 40 %>
43 41
@@ -61,7 +59,7 @@ @@ -61,7 +59,7 @@
61 </div><!-- end id="content" --> 59 </div><!-- end id="content" -->
62 </div><!-- end id="wrap-2" --> 60 </div><!-- end id="wrap-2" -->
63 </div><!-- end id="wrap-1" --> 61 </div><!-- end id="wrap-1" -->
64 - <%= render_environment_features(:logged_in) %> 62 + <%= render_environment_features(:logged_in) if logged_in? %>
65 <div id="theme-footer"> 63 <div id="theme-footer">
66 <%= theme_footer %> 64 <%= theme_footer %>
67 </div><!-- end id="theme-footer" --> 65 </div><!-- end id="theme-footer" -->