Commit 3eaafe7b1e123c7a2a2c1008cc4c52fc8a21d6b3
Exists in
master
and in
9 other branches
Merge branch 'responsive' of gitlab.com:noosfero/noosfero into responsive
Showing
527 changed files
with
25348 additions
and
8883 deletions
Show diff stats
Too many changes.
To preserve performance only 100 of 527 files displayed.
AUTHORS.md
... | ... | @@ -92,6 +92,7 @@ Daniel Alves + Rafael Manzo <rr.manzo@gmail.com> |
92 | 92 | Daniela Soares Feitosa <danielafeitosa@colivre.coop.br> |
93 | 93 | Daniel Bucher <daniel.bucher88@gmail.com> |
94 | 94 | Daniel Cunha <daniel@colivre.coop.br> |
95 | +daniel <dtygel@eita.org.br> | |
95 | 96 | David Carlos <ddavidcarlos1392@gmail.com> |
96 | 97 | diegoamc <diegoamc90@gmail.com> |
97 | 98 | Diego Araújo + Alessandro Palmeira <diegoamc90@gmail.com> |
... | ... | @@ -120,6 +121,7 @@ Diego Araujo + Rodrigo Souto + Rafael Manzo <rr.manzo@gmail.com> |
120 | 121 | Diego + Jefferson <diegoamc90@gmail.com> |
121 | 122 | Diego Martinez <diegoamc90@gmail.com> |
122 | 123 | Diego + Renan <renanteruoc@gmail.com> |
124 | +dtygel <dtygel@gmail.com> | |
123 | 125 | DylanGuedes <djmgguedes@gmail.com> |
124 | 126 | Eduardo Passos <eduardo@risa.localdomain.localhost> |
125 | 127 | Eduardo Passos <eduardosteps@gmail.com> |
... | ... | @@ -144,6 +146,7 @@ Italo Valcy <italo@dcc.ufba.br> |
144 | 146 | Jefferson Fernandes + Diego Araujo + Rafael Manzo <jeffs.fernandes@gmail.com> |
145 | 147 | Jefferson Fernandes + Joao M. M. da Silva <jeffs.fernandes@gmail.com> |
146 | 148 | Jefferson Fernandes + Joao M. M. Silva <jeffs.fernandes@gmail.com> |
149 | +Jérôme Jutteau <j.jutteau@gmail.com> | |
147 | 150 | João da Silva + Eduardo Morais + Rafael Manzo <rr.manzo@gmail.com> |
148 | 151 | João da Silva <jaodsilv@linux.ime.usp.br> |
149 | 152 | João Marco Maciel da Silva + Rafael Manzo + Renan Teruo <jaodsilv@linux.ime.usp.br> |
... | ... | @@ -247,8 +250,10 @@ Tallys Martins <tallysmartins@gmail.com> |
247 | 250 | Tallys Martins <tallysmartins@yahoo.com.br> |
248 | 251 | tallys <tallys@tallys> |
249 | 252 | tallys <tallys@tallys.(none)> |
253 | +Thiago Casotti <thiago.casotti@uol.com.br> | |
250 | 254 | Thiago Zoroastro <thiago.zoroastro@bol.com.br> |
251 | 255 | Tuux <tuxa@galaxie.eu.org> |
256 | +TWS <tablettws@gmail.com> | |
252 | 257 | Valessio Brito <contato@valessiobrito.com.br> |
253 | 258 | Valessio Brito <contato@valessiobrito.info> |
254 | 259 | Valessio Brito <valessio@gmail.com> | ... | ... |
Gemfile
... | ... | @@ -20,18 +20,17 @@ gem 'locale', '~> 2.0.5' |
20 | 20 | gem 'whenever', :require => false |
21 | 21 | gem 'eita-jrails', '>= 0.9.5', :require => 'jrails' |
22 | 22 | |
23 | -group :assets do | |
24 | - gem 'uglifier', '>= 1.0.3' | |
25 | - gem 'sass-rails' | |
26 | -end | |
23 | +# asset pipeline | |
24 | +gem 'uglifier', '>= 1.0.3' | |
25 | +gem 'sass-rails' | |
27 | 26 | |
28 | 27 | group :production do |
29 | 28 | gem 'dalli', '~> 2.7.0' |
30 | 29 | end |
31 | 30 | |
32 | 31 | group :test do |
33 | - gem 'rspec', '~> 2.10.0' | |
34 | - gem 'rspec-rails', '~> 2.10.1' | |
32 | + gem 'rspec', '~> 2.14.0' | |
33 | + gem 'rspec-rails', '~> 2.14.1' | |
35 | 34 | gem 'mocha', '~> 1.1.0', :require => false |
36 | 35 | end |
37 | 36 | ... | ... |
INSTALL.chat.md
1 | -XMPP/Chat Setup | |
2 | -=============== | |
1 | +Automatic XMPP/Chat Setup | |
2 | +========================= | |
3 | + | |
4 | +Since Noosfero 1.2, the XMPP/Chat can be installed via `noosfero-chat` Debian | |
5 | +package. So you don't need to follow the manual instructions here if you | |
6 | +already have it installed on your system. | |
7 | + | |
8 | +But if you are going to install the `noosfero-chat` package on a system that | |
9 | +already has `noosfero` older 1.2 installed then you need to check if apache's | |
10 | +configuration file `/etc/apache2/sites-available/noosfero` has this line below: | |
11 | + | |
12 | + Include /usr/share/noosfero/util/chat/apache/xmpp.conf | |
13 | + | |
14 | +Manual XMPP/Chat Setup | |
15 | +====================== | |
3 | 16 | |
4 | 17 | The samples of config file to configure a XMPP/BOSH server with ejabberd, |
5 | 18 | postgresql and apache2 can be found at util/chat directory. |
... | ... | @@ -8,7 +21,7 @@ This setup supposes that you are using Noosfero installed via Debian package |
8 | 21 | in a production environment. |
9 | 22 | |
10 | 23 | Steps |
11 | -===== | |
24 | +----- | |
12 | 25 | |
13 | 26 | This is a step-by-step guide to get a XMPP service working, in a Debian system. |
14 | 27 | |
... | ... | @@ -144,15 +157,8 @@ You should see a page with a message like that: |
144 | 157 | |
145 | 158 | ## 9. Test chat session |
146 | 159 | |
147 | -Open Noosfero console and execute: | |
148 | - | |
149 | ->> environment = Environment.default | |
150 | ->> user = Person['guest'] | |
151 | ->> password = user.user.crypted_password | |
152 | ->> login = user.jid | |
153 | ->> RubyBOSH.initialize_session(login, password, "http://#{environment.default_hostname}/http-bind", :wait => 30, :hold => 1, :window => 5 | |
154 | - | |
155 | -If you have luck, should see something like that: | |
160 | +Run `./script/noosfero-test-chat-session`. If you have luck, should see | |
161 | +something like that: | |
156 | 162 | |
157 | 163 | Ruby-BOSH - SEND |
158 | 164 | <body window="5" rid="60265" xmlns="http://jabber.org/protocol/httpbind" xmlns:xmpp="urn:xmpp:xbosh" to="vagrant-debian-squeeze.vagrantup.com" wait="30" xmpp:version="1.0" hold="1"/> | ... | ... |
INSTALL.https.md
... | ... | @@ -11,8 +11,8 @@ as below: |
11 | 11 | |
12 | 12 | # mkdir /etc/noosfero/ssl |
13 | 13 | # cd /etc/noosfero/ssl |
14 | - # openssl genrsa 1024 > noosfero.key | |
15 | - # openssl req -new -x509 -nodes -sha1 -days $[10*365] -key noosfero.key > noosfero.cert | |
14 | + # openssl genrsa 2048 > noosfero.key | |
15 | + # openssl req -new -x509 -sha256 -nodes -days $[10*365] -key noosfero.key > noosfero.cert | |
16 | 16 | # cat noosfero.key noosfero.cert > noosfero.pem |
17 | 17 | |
18 | 18 | ## Web server configuration | ... | ... |
INSTALL.md
... | ... | @@ -74,7 +74,7 @@ downloading from git |
74 | 74 | |
75 | 75 | Here we are cloning the noosfero repository from git. Note: you will need to install git before. |
76 | 76 | |
77 | - $ git clone git://gitorious.org/noosfero/noosfero.git current | |
77 | + $ git clone https://gitlab.com/noosfero/noosfero.git current | |
78 | 78 | $ cd current |
79 | 79 | $ git checkout -b stable origin/stable |
80 | 80 | ... | ... |
app/controllers/admin/admin_panel_controller.rb
... | ... | @@ -71,22 +71,4 @@ class AdminPanelController < AdminController |
71 | 71 | end |
72 | 72 | end |
73 | 73 | end |
74 | - | |
75 | - def manage_organizations_status | |
76 | - scope = environment.organizations | |
77 | - @filter = params[:filter] || 'any' | |
78 | - @title = "Organization profiles" | |
79 | - @title = @title+" - "+@filter if @filter != 'any' | |
80 | - | |
81 | - if @filter == 'enabled' | |
82 | - scope = scope.visible | |
83 | - elsif @filter == 'disabled' | |
84 | - scope = scope.disabled | |
85 | - end | |
86 | - | |
87 | - scope = scope.order('name ASC') | |
88 | - | |
89 | - @q = params[:q] | |
90 | - @collection = find_by_contents(:organizations, environment, scope, @q, {:per_page => 10, :page => params[:npage]})[:results] | |
91 | - end | |
92 | 74 | end | ... | ... |
... | ... | @@ -0,0 +1,66 @@ |
1 | +class OrganizationsController < AdminController | |
2 | + | |
3 | + protect 'manage_environment_organizations', :environment | |
4 | + | |
5 | + def index | |
6 | + @filter = params[:filter] || 'any' | |
7 | + @title = _('Organization profiles') | |
8 | + @type = params[:type] || "any" | |
9 | + @types_filter = [[_('All'), 'any'], [_('Community'), 'Community'], [_('Enterprise'), 'Enterprise']] | |
10 | + @types_filter = @types_filter | @plugins.dispatch(:organization_types_filter_options) | |
11 | + | |
12 | + scope = @plugins.dispatch_first(:filter_manage_organization_scope, @type) | |
13 | + if scope.blank? | |
14 | + scope = environment.organizations | |
15 | + scope = scope.where(:type => @type) if @type != 'any' | |
16 | + end | |
17 | + | |
18 | + if @filter == 'enabled' | |
19 | + scope = scope.visible | |
20 | + elsif @filter == 'disabled' | |
21 | + scope = scope.disabled | |
22 | + end | |
23 | + | |
24 | + scope = scope.order('name ASC') | |
25 | + | |
26 | + @q = params[:q] | |
27 | + @collection = find_by_contents(:organizations, environment, scope, @q, {:per_page => per_page, :page => params[:npage]})[:results] | |
28 | + end | |
29 | + | |
30 | + def activate | |
31 | + organization = environment.organizations.find(params[:id]) | |
32 | + if organization.enable | |
33 | + render :text => (_('%s enabled') % organization.name).to_json | |
34 | + else | |
35 | + render :text => (_('%s could not be enabled') % organization.name).to_json | |
36 | + end | |
37 | + end | |
38 | + | |
39 | + def deactivate | |
40 | + organization = environment.organizations.find(params[:id]) | |
41 | + if organization.disable | |
42 | + render :text => (_('%s disabled') % organization.name).to_json | |
43 | + else | |
44 | + render :text => (_('%s could not be disable') % organization.name).to_json | |
45 | + end | |
46 | + end | |
47 | + | |
48 | + def destroy | |
49 | + if request.post? | |
50 | + organization = environment.organizations.find(params[:id]) | |
51 | + if organization && organization.destroy | |
52 | + render :text => (_('%s removed') % organization.name).to_json | |
53 | + else | |
54 | + render :text => (_('%s could not be removed') % organization.name).to_json | |
55 | + end | |
56 | + else | |
57 | + render :nothing => true | |
58 | + end | |
59 | + end | |
60 | + | |
61 | + private | |
62 | + | |
63 | + def per_page | |
64 | + 10 | |
65 | + end | |
66 | +end | ... | ... |
app/controllers/admin/role_controller.rb
app/controllers/application_controller.rb
... | ... | @@ -9,6 +9,7 @@ class ApplicationController < ActionController::Base |
9 | 9 | before_filter :allow_cross_domain_access |
10 | 10 | before_filter :login_required, :if => :private_environment? |
11 | 11 | before_filter :verify_members_whitelist, :if => [:private_environment?, :user] |
12 | + before_filter :redirect_to_current_user | |
12 | 13 | |
13 | 14 | def verify_members_whitelist |
14 | 15 | render_access_denied unless user.is_admin? || environment.in_whitelist?(user) |
... | ... | @@ -192,4 +193,15 @@ class ApplicationController < ActionController::Base |
192 | 193 | def private_environment? |
193 | 194 | @environment.enabled?(:restrict_to_members) |
194 | 195 | end |
196 | + | |
197 | + def redirect_to_current_user | |
198 | + if params[:profile] == '~' | |
199 | + if logged_in? | |
200 | + redirect_to params.merge(:profile => user.identifier) | |
201 | + else | |
202 | + render_not_found | |
203 | + end | |
204 | + end | |
205 | + end | |
206 | + | |
195 | 207 | end | ... | ... |
app/controllers/my_profile/cms_controller.rb
... | ... | @@ -112,6 +112,11 @@ class CmsController < MyProfileController |
112 | 112 | end |
113 | 113 | end |
114 | 114 | end |
115 | + | |
116 | + unless @article.kind_of?(RssFeed) | |
117 | + @escaped_body = CGI::escapeHTML(@article.body || '') | |
118 | + @escaped_abstract = CGI::escapeHTML(@article.abstract || '') | |
119 | + end | |
115 | 120 | end |
116 | 121 | |
117 | 122 | def new |
... | ... | @@ -143,7 +148,14 @@ class CmsController < MyProfileController |
143 | 148 | klass = @type.constantize |
144 | 149 | article_data = environment.enabled?('articles_dont_accept_comments_by_default') ? { :accept_comments => false } : {} |
145 | 150 | article_data.merge!(params[:article]) if params[:article] |
146 | - @article = klass.new(article_data) | |
151 | + article_data.merge!(:profile => profile) if profile | |
152 | + | |
153 | + @article = if params[:clone] | |
154 | + current_article = profile.articles.find(params[:id]) | |
155 | + current_article.copy_without_save | |
156 | + else | |
157 | + klass.new(article_data) | |
158 | + end | |
147 | 159 | |
148 | 160 | parent = check_parent(params[:parent_id]) |
149 | 161 | if parent |
... | ... | @@ -220,7 +232,7 @@ class CmsController < MyProfileController |
220 | 232 | if @errors.any? |
221 | 233 | render :action => 'upload_files', :parent_id => @parent_id |
222 | 234 | else |
223 | - session[:notice] = _('File(s) successfully uploaded') | |
235 | + session[:notice] = _('File(s) successfully uploaded') | |
224 | 236 | if @back_to |
225 | 237 | redirect_to @back_to |
226 | 238 | elsif @parent |
... | ... | @@ -357,7 +369,8 @@ class CmsController < MyProfileController |
357 | 369 | @task.ip_address = request.remote_ip |
358 | 370 | @task.user_agent = request.user_agent |
359 | 371 | @task.referrer = request.referrer |
360 | - if verify_recaptcha(:model => @task, :message => _('Please type the words correctly')) && @task.save | |
372 | + @task.requestor = current_person if logged_in? | |
373 | + if (logged_in? || verify_recaptcha(:model => @task, :message => _('Please type the words correctly'))) && @task.save | |
361 | 374 | session[:notice] = _('Thanks for your suggestion. The community administrators were notified.') |
362 | 375 | redirect_to @back_to |
363 | 376 | end | ... | ... |
app/controllers/my_profile/friends_controller.rb
1 | 1 | class FriendsController < MyProfileController |
2 | - | |
2 | + | |
3 | 3 | protect 'manage_friends', :profile |
4 | - | |
4 | + | |
5 | 5 | def index |
6 | - @suggestions = profile.profile_suggestions.of_person.enabled.includes(:suggestion).limit(per_page) | |
6 | + @suggestions = profile.suggested_profiles.of_person.enabled.includes(:suggestion).limit(per_page) | |
7 | 7 | if is_cache_expired?(profile.manage_friends_cache_key(params)) |
8 | 8 | @friends = profile.friends.paginate(:per_page => per_page, :page => params[:npage]) |
9 | 9 | end |
... | ... | @@ -18,7 +18,7 @@ class FriendsController < MyProfileController |
18 | 18 | end |
19 | 19 | |
20 | 20 | def suggest |
21 | - @suggestions = profile.profile_suggestions.of_person.enabled.includes(:suggestion).limit(per_page) | |
21 | + @suggestions = profile.suggested_profiles.of_person.enabled.includes(:suggestion).limit(per_page) | |
22 | 22 | end |
23 | 23 | |
24 | 24 | def remove_suggestion |
... | ... | @@ -26,13 +26,13 @@ class FriendsController < MyProfileController |
26 | 26 | redirect_to :action => 'suggest' unless @person |
27 | 27 | if @person && request.post? |
28 | 28 | profile.remove_suggestion(@person) |
29 | - @suggestions = profile.profile_suggestions.of_person.enabled.includes(:suggestion).limit(per_page) | |
29 | + @suggestions = profile.suggested_profiles.of_person.enabled.includes(:suggestion).limit(per_page) | |
30 | 30 | render :partial => 'shared/profile_suggestions_list', :locals => { :suggestions => @suggestions, :collection => :friends_suggestions, :per_page => params[:per_page] || per_page } |
31 | 31 | end |
32 | 32 | end |
33 | 33 | |
34 | 34 | def connections |
35 | - @suggestion = profile.profile_suggestions.of_person.enabled.find_by_suggestion_id(params[:id]) | |
35 | + @suggestion = profile.suggested_profiles.of_person.enabled.find_by_suggestion_id(params[:id]) | |
36 | 36 | if @suggestion |
37 | 37 | @tags = @suggestion.tag_connections |
38 | 38 | @profiles = @suggestion.profile_connections | ... | ... |
app/controllers/my_profile/manage_products_controller.rb
... | ... | @@ -35,7 +35,7 @@ class ManageProductsController < ApplicationController |
35 | 35 | end |
36 | 36 | |
37 | 37 | def categories_for_selection |
38 | - @category = Category.find(params[:category_id]) if params[:category_id] | |
38 | + @category = environment.categories.find_by_id params[:category_id] | |
39 | 39 | @object_name = params[:object_name] |
40 | 40 | if @category |
41 | 41 | @categories = @category.children |
... | ... | @@ -95,6 +95,20 @@ class ManageProductsController < ApplicationController |
95 | 95 | end |
96 | 96 | end |
97 | 97 | |
98 | + def show_category_tree | |
99 | + @category = environment.categories.find params[:category_id] | |
100 | + render :partial => 'selected_category_tree' | |
101 | + end | |
102 | + | |
103 | + def search_categories | |
104 | + @term = params[:term].downcase | |
105 | + conditions = ['LOWER(name) LIKE ? OR LOWER(name) LIKE ?', "#{@term}%", "% #{@term}%"] | |
106 | + @categories = ProductCategory.all :conditions => conditions, :limit => 10 | |
107 | + render :json => (@categories.map do |category| | |
108 | + {:label => category.name, :value => category.id} | |
109 | + end) | |
110 | + end | |
111 | + | |
98 | 112 | def add_input |
99 | 113 | @product = @profile.products.find(params[:id]) |
100 | 114 | @input = @product.inputs.build | ... | ... |
app/controllers/my_profile/maps_controller.rb
... | ... | @@ -16,6 +16,7 @@ class MapsController < MyProfileController |
16 | 16 | |
17 | 17 | Profile.transaction do |
18 | 18 | if profile.update_attributes!(params[:profile_data]) |
19 | + BlockSweeper.expire_blocks profile.blocks.select{ |b| b.class == LocationBlock } | |
19 | 20 | session[:notice] = _('Address was updated successfully!') |
20 | 21 | redirect_to :action => 'edit_location' |
21 | 22 | end | ... | ... |
app/controllers/my_profile/memberships_controller.rb
... | ... | @@ -40,7 +40,7 @@ class MembershipsController < MyProfileController |
40 | 40 | end |
41 | 41 | |
42 | 42 | def suggest |
43 | - @suggestions = profile.profile_suggestions.of_community.enabled.includes(:suggestion).limit(per_page) | |
43 | + @suggestions = profile.suggested_profiles.of_community.enabled.includes(:suggestion).limit(per_page) | |
44 | 44 | end |
45 | 45 | |
46 | 46 | def remove_suggestion |
... | ... | @@ -49,13 +49,13 @@ class MembershipsController < MyProfileController |
49 | 49 | redirect_to :action => 'suggest' unless @community |
50 | 50 | if @community && request.post? |
51 | 51 | profile.remove_suggestion(@community) |
52 | - @suggestions = profile.profile_suggestions.of_community.enabled.includes(:suggestion).limit(custom_per_page) | |
52 | + @suggestions = profile.suggested_profiles.of_community.enabled.includes(:suggestion).limit(custom_per_page) | |
53 | 53 | render :partial => 'shared/profile_suggestions_list', :locals => { :suggestions => @suggestions, :collection => :communities_suggestions, :per_page => custom_per_page} |
54 | 54 | end |
55 | 55 | end |
56 | 56 | |
57 | 57 | def connections |
58 | - @suggestion = profile.profile_suggestions.of_community.enabled.find_by_suggestion_id(params[:id]) | |
58 | + @suggestion = profile.suggested_profiles.of_community.enabled.find_by_suggestion_id(params[:id]) | |
59 | 59 | if @suggestion |
60 | 60 | @tags = @suggestion.tag_connections |
61 | 61 | @profiles = @suggestion.profile_connections | ... | ... |
app/controllers/my_profile/profile_design_controller.rb
... | ... | @@ -4,11 +4,19 @@ class ProfileDesignController < BoxOrganizerController |
4 | 4 | |
5 | 5 | protect 'edit_profile_design', :profile |
6 | 6 | |
7 | - before_filter :protect_fixed_block, :only => [:save, :move_block] | |
7 | + before_filter :protect_uneditable_block, :only => [:save] | |
8 | + before_filter :protect_fixed_block, :only => [:move_block] | |
9 | + | |
10 | + def protect_uneditable_block | |
11 | + block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) | |
12 | + if !current_person.is_admin? && !block.editable? | |
13 | + render_access_denied | |
14 | + end | |
15 | + end | |
8 | 16 | |
9 | 17 | def protect_fixed_block |
10 | 18 | block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) |
11 | - if block.fixed && !current_person.is_admin? | |
19 | + if !current_person.is_admin? && !block.movable? | |
12 | 20 | render_access_denied |
13 | 21 | end |
14 | 22 | end | ... | ... |
app/controllers/my_profile/profile_members_controller.rb
... | ... | @@ -58,6 +58,7 @@ class ProfileMembersController < MyProfileController |
58 | 58 | |
59 | 59 | def change_role |
60 | 60 | @roles = Profile::Roles.organization_member_roles(environment.id) |
61 | + @custom_roles = profile.custom_roles | |
61 | 62 | begin |
62 | 63 | @member = profile.members.find(params[:id]) |
63 | 64 | rescue ActiveRecord::RecordNotFound | ... | ... |
... | ... | @@ -0,0 +1,116 @@ |
1 | +class ProfileRolesController < MyProfileController | |
2 | + | |
3 | + protect 'manage_custom_roles', :profile | |
4 | + | |
5 | + def index | |
6 | + @roles = profile.custom_roles | |
7 | + end | |
8 | + | |
9 | + def new | |
10 | + @role = Role.new | |
11 | + end | |
12 | + | |
13 | + def create | |
14 | + @role = Role.new({:name => params[:role][:name], :permissions => params[:role][:permissions], :environment => environment }, :without_protection => true) | |
15 | + if @role.save | |
16 | + profile.custom_roles << @role | |
17 | + redirect_to :action => 'show', :id => @role | |
18 | + else | |
19 | + session[:notice] = _('Failed to create role') | |
20 | + render :action => 'new' | |
21 | + end | |
22 | + end | |
23 | + | |
24 | + def show | |
25 | + @role = environment.roles.find(params[:id]) | |
26 | + end | |
27 | + | |
28 | + def edit | |
29 | + @role = environment.roles.find(params[:id]) | |
30 | + end | |
31 | + | |
32 | + def assign_role_by_members | |
33 | + return redirect_to "/" if params[:q].nil? or !request.xhr? | |
34 | + arg = params[:q].downcase | |
35 | + result = find_by_contents(:people, environment, profile.members, params[:q])[:results] | |
36 | + render :text => prepare_to_token_input(result).to_json | |
37 | + end | |
38 | + | |
39 | + def destroy | |
40 | + @role = environment.roles.find(params[:id]) | |
41 | + @members = profile.members_by_role(@role) | |
42 | + @roles_list = all_roles(environment, profile) | |
43 | + @roles_list.delete(@role) | |
44 | + end | |
45 | + | |
46 | + def remove | |
47 | + @role = environment.roles.find(params[:id]) | |
48 | + @members = profile.members_by_role(@role) | |
49 | + member_roles = params[:roles] ? environment.roles.find(params[:roles].select{|r|!r.to_i.zero?}) : [] | |
50 | + append_roles(@members, member_roles, profile) | |
51 | + if @role.destroy | |
52 | + session[:notice] = _('Role successfuly removed!') | |
53 | + else | |
54 | + session[:notice] = _('Failed to remove role!') | |
55 | + end | |
56 | + redirect_to :action => 'index' | |
57 | + end | |
58 | + | |
59 | + def update | |
60 | + @role = environment.roles.find(params[:id]) | |
61 | + if @role.update_attributes(params[:role]) | |
62 | + redirect_to :action => 'show', :id => @role | |
63 | + else | |
64 | + session[:notice] = _('Failed to edit role') | |
65 | + render :action => 'edit' | |
66 | + end | |
67 | + end | |
68 | + | |
69 | + def assign | |
70 | + @role = environment.roles.find(params[:id]) | |
71 | + @roles_list = all_roles(environment, profile) | |
72 | + @roles_list.delete(@role) | |
73 | + end | |
74 | + | |
75 | + def define | |
76 | + @role = environment.roles.find(params[:id]) | |
77 | + selected_role = params[:selected_role] ? environment.roles.find(params[:selected_role].to_i) : nil | |
78 | + if params[:assign_role_by].eql? "members" | |
79 | + members_list = params[:person_id].split(',').collect {|id| environment.profiles.find(id.to_i)} | |
80 | + members_list.collect{|person| person.add_role(@role, profile)} | |
81 | + elsif params[:assign_role_by].eql? "roles" | |
82 | + members = profile.members_by_role(selected_role) | |
83 | + replace_role(members, selected_role, @role, profile) | |
84 | + else | |
85 | + session[:notice] = _("Error") | |
86 | + end | |
87 | + redirect_to :action => 'index' | |
88 | + end | |
89 | + | |
90 | + protected | |
91 | + | |
92 | + def append_roles(members, roles, profile) | |
93 | + members.each do |person| | |
94 | + all_roles = person.find_roles(profile).map(&:role) + roles | |
95 | + person.define_roles(all_roles, profile) | |
96 | + end | |
97 | + end | |
98 | + | |
99 | + def all_roles(environment, profile) | |
100 | + Profile::Roles.organization_member_roles(environment.id) + profile.custom_roles | |
101 | + end | |
102 | + | |
103 | + def replace_roles(members, roles, profile) | |
104 | + members.each do |person| | |
105 | + person.define_roles(roles, profile) | |
106 | + end | |
107 | + end | |
108 | + | |
109 | + def replace_role(members, role, new_role, profile) | |
110 | + members.each do |person| | |
111 | + person.remove_role(role, profile) | |
112 | + person.add_role(new_role, profile) | |
113 | + end | |
114 | + end | |
115 | + | |
116 | +end | ... | ... |
app/controllers/my_profile/tasks_controller.rb
1 | 1 | class TasksController < MyProfileController |
2 | 2 | |
3 | - protect 'perform_task', :profile | |
4 | - | |
3 | + protect [:perform_task, :view_tasks], :profile, :only => [:index] | |
4 | + protect :perform_task, :profile, :except => [:index] | |
5 | + | |
5 | 6 | def index |
6 | - @filter = params[:filter_type].blank? ? nil : params[:filter_type] | |
7 | + @filter_type = params[:filter_type].presence | |
8 | + @filter_text = params[:filter_text].presence | |
9 | + @filter_responsible = params[:filter_responsible] | |
7 | 10 | @task_types = Task.pending_types_for(profile) |
8 | - @tasks = Task.to(profile).without_spam.pending.of(@filter).order_by('created_at', 'asc').paginate(:per_page => Task.per_page, :page => params[:page]) | |
11 | + | |
12 | + @tasks = Task.pending_all(profile, @filter_type, @filter_text).order_by('created_at', 'asc') | |
13 | + @tasks = @tasks.where(:responsible_id => @filter_responsible.to_i != -1 ? @filter_responsible : nil) if @filter_responsible.present? | |
14 | + @tasks = @tasks.paginate(:per_page => Task.per_page, :page => params[:page]) | |
15 | + | |
9 | 16 | @failed = params ? params[:failed] : {} |
17 | + | |
18 | + @responsible_candidates = profile.members.by_role(profile.roles.reject {|r| !r.has_permission?('perform_task')}) if profile.organization? | |
19 | + | |
20 | + @view_only = !current_person.has_permission?(:perform_task, profile) | |
10 | 21 | end |
11 | 22 | |
12 | 23 | def processed |
13 | 24 | @tasks = Task.to(profile).without_spam.closed.sort_by(&:created_at) |
14 | 25 | end |
15 | 26 | |
27 | + def change_responsible | |
28 | + task = profile.tasks.find(params[:task_id]) | |
29 | + | |
30 | + if task.responsible.present? && task.responsible.id != params[:old_responsible_id].to_i | |
31 | + return render :json => {:notice => _('Task already assigned!'), :success => false, :current_responsible => task.responsible.id} | |
32 | + end | |
33 | + | |
34 | + responsible = profile.members.find(params[:responsible_id]) if params[:responsible_id].present? | |
35 | + task.responsible = responsible | |
36 | + task.save! | |
37 | + render :json => {:notice => _('Task responsible successfully updated!'), :success => true, :new_responsible => {:id => responsible.present? ? responsible.id : nil}} | |
38 | + end | |
39 | + | |
16 | 40 | VALID_DECISIONS = [ 'finish', 'cancel', 'skip' ] |
17 | 41 | |
18 | 42 | def close |
... | ... | @@ -25,7 +49,7 @@ class TasksController < MyProfileController |
25 | 49 | task = profile.find_in_all_tasks(id) |
26 | 50 | begin |
27 | 51 | task.update_attributes(value[:task]) |
28 | - task.send(decision) | |
52 | + task.send(decision, current_person) | |
29 | 53 | rescue Exception => ex |
30 | 54 | message = "#{task.title} (#{task.requestor ? task.requestor.name : task.author_name})" |
31 | 55 | failed[ex.message] ? failed[ex.message] << message : failed[ex.message] = [message] | ... | ... |
app/controllers/public/chat_controller.rb
... | ... | @@ -2,6 +2,7 @@ class ChatController < PublicController |
2 | 2 | |
3 | 3 | before_filter :login_required |
4 | 4 | before_filter :check_environment_feature |
5 | + before_filter :can_send_message, :only => :register_message | |
5 | 6 | |
6 | 7 | def start_session |
7 | 8 | login = user.jid |
... | ... | @@ -54,6 +55,16 @@ class ChatController < PublicController |
54 | 55 | end |
55 | 56 | end |
56 | 57 | |
58 | + def avatars | |
59 | + profiles = environment.profiles.where(:identifier => params[:profiles]) | |
60 | + avatar_map = profiles.inject({}) do |result, profile| | |
61 | + result[profile.identifier] = profile_icon(profile, :minor) | |
62 | + result | |
63 | + end | |
64 | + | |
65 | + render_json avatar_map | |
66 | + end | |
67 | + | |
57 | 68 | def update_presence_status |
58 | 69 | if request.xhr? |
59 | 70 | current_user.update_attributes({:chat_status_at => DateTime.now}.merge(params[:status] || {})) |
... | ... | @@ -62,11 +73,17 @@ class ChatController < PublicController |
62 | 73 | end |
63 | 74 | |
64 | 75 | 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' | |
76 | + if request.post? | |
77 | + to = environment.profiles.where(:identifier => params[:to]).first | |
78 | + body = params[:body] | |
79 | + | |
80 | + begin | |
81 | + ChatMessage.create!(:to => to, :from => user, :body => body) | |
82 | + return render_json({:status => 0}) | |
83 | + rescue Exception => exception | |
84 | + return render_json({:status => 3, :message => exception.to_s, :backtrace => exception.backtrace}) | |
85 | + end | |
86 | + end | |
70 | 87 | end |
71 | 88 | |
72 | 89 | def recent_messages |
... | ... | @@ -90,8 +107,9 @@ class ChatController < PublicController |
90 | 107 | end |
91 | 108 | |
92 | 109 | 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 | |
110 | + profiles = Profile.find_by_sql("select profiles.* 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") | |
111 | + jids = profiles.map(&:jid).reverse | |
112 | + render :json => jids.to_json | |
95 | 113 | end |
96 | 114 | |
97 | 115 | #TODO Ideally this is done through roster table on ejabberd. |
... | ... | @@ -108,4 +126,14 @@ class ChatController < PublicController |
108 | 126 | end |
109 | 127 | end |
110 | 128 | |
129 | + def can_send_message | |
130 | + return render_json({:status => 1, :message => 'Missing parameters!'}) if params[:from].nil? || params[:to].nil? || params[:message].nil? | |
131 | + return render_json({:status => 2, :message => 'You can not send message as another user!'}) if params[:from] != user.jid | |
132 | + # TODO Maybe register the jid in a table someday to avoid this below | |
133 | + return render_json({:status => 3, :messsage => 'You can not send messages to strangers!'}) if user.friends.where(:identifier => params[:to].split('@').first).blank? | |
134 | + end | |
135 | + | |
136 | + def render_json(result) | |
137 | + render :text => result.to_json | |
138 | + end | |
111 | 139 | end | ... | ... |
app/controllers/public/content_viewer_controller.rb
... | ... | @@ -11,9 +11,10 @@ class ContentViewerController < ApplicationController |
11 | 11 | path = get_path(params[:page], params[:format]) |
12 | 12 | |
13 | 13 | @version = params[:version].to_i |
14 | + @npage = params[:npage] || '1' | |
14 | 15 | |
15 | 16 | if path.blank? |
16 | - @page = profile.home_page | |
17 | + @page = profile.home_page | |
17 | 18 | return if redirected_to_profile_index |
18 | 19 | else |
19 | 20 | @page = profile.articles.find_by_path(path) |
... | ... | @@ -107,10 +108,12 @@ class ContentViewerController < ApplicationController |
107 | 108 | if translation.language == locale |
108 | 109 | @page = translation |
109 | 110 | redirect_to :profile => @page.profile.identifier, :page => @page.explode_path |
111 | + return true | |
110 | 112 | end |
111 | 113 | end |
112 | 114 | end |
113 | 115 | end |
116 | + false | |
114 | 117 | end |
115 | 118 | |
116 | 119 | def pass_without_comment_captcha? |
... | ... | @@ -119,21 +122,23 @@ class ContentViewerController < ApplicationController |
119 | 122 | helper_method :pass_without_comment_captcha? |
120 | 123 | |
121 | 124 | def allow_access_to_page(path) |
122 | - allowed = true | |
123 | 125 | if @page.nil? # page not found, give error |
124 | 126 | render_not_found(path) |
125 | - allowed = false | |
126 | - elsif !@page.display_to?(user) | |
127 | - if !profile.public? | |
127 | + return false | |
128 | + end | |
129 | + | |
130 | + unless @page.display_to?(user) | |
131 | + if !profile.visible? || profile.secret? || (user && user.follows?(profile)) || user.blank? | |
132 | + render_access_denied | |
133 | + else #!profile.public? | |
128 | 134 | private_profile_partial_parameters |
129 | 135 | render :template => 'profile/_private_profile', :status => 403, :formats => [:html] |
130 | - allowed = false | |
131 | - else #if !profile.visible? | |
132 | - render_access_denied | |
133 | - allowed = false | |
134 | 136 | end |
137 | + | |
138 | + return false | |
135 | 139 | end |
136 | - allowed | |
140 | + | |
141 | + return true | |
137 | 142 | end |
138 | 143 | |
139 | 144 | def user_is_a_bot? |
... | ... | @@ -178,7 +183,7 @@ class ContentViewerController < ApplicationController |
178 | 183 | if @page.forum? && @page.has_terms_of_use && terms_accepted == "true" |
179 | 184 | @page.add_agreed_user(user) |
180 | 185 | end |
181 | - end | |
186 | + end | |
182 | 187 | |
183 | 188 | def is_a_forum_topic? (page) |
184 | 189 | return (!@page.parent.nil? && @page.parent.forum?) | ... | ... |
app/controllers/public/events_controller.rb
... | ... | @@ -5,7 +5,11 @@ class EventsController < PublicController |
5 | 5 | |
6 | 6 | def events |
7 | 7 | @events = [] |
8 | - @date = build_date(params[:year], params[:month], params[:day]) | |
8 | + begin | |
9 | + @date = build_date params[:year], params[:month], params[:day] | |
10 | + rescue ArgumentError # invalid date | |
11 | + return render_not_found | |
12 | + end | |
9 | 13 | |
10 | 14 | if !params[:year] && !params[:month] && !params[:day] |
11 | 15 | @events = profile.events.next_events_from_month(@date).paginate(:per_page => per_page, :page => params[:page]) | ... | ... |
app/controllers/public/search_controller.rb
... | ... | @@ -62,7 +62,7 @@ class SearchController < PublicController |
62 | 62 | end |
63 | 63 | |
64 | 64 | def articles |
65 | - @scope = @environment.articles.public.paginate(paginate_options) | |
65 | + @scope = @environment.articles.public | |
66 | 66 | full_text_search |
67 | 67 | end |
68 | 68 | |
... | ... | @@ -76,7 +76,7 @@ class SearchController < PublicController |
76 | 76 | end |
77 | 77 | |
78 | 78 | def products |
79 | - @scope = @environment.products.paginate(paginate_options) | |
79 | + @scope = @environment.products | |
80 | 80 | full_text_search |
81 | 81 | end |
82 | 82 | |
... | ... | @@ -244,7 +244,7 @@ class SearchController < PublicController |
244 | 244 | def visible_profiles(klass, *extra_relations) |
245 | 245 | relations = [:image, :domains, :environment, :preferred_domain] |
246 | 246 | relations += extra_relations |
247 | - @environment.send(klass.name.underscore.pluralize).visible.includes(relations).paginate(paginate_options) | |
247 | + @environment.send(klass.name.underscore.pluralize).visible.includes(relations) | |
248 | 248 | end |
249 | 249 | |
250 | 250 | def per_page | ... | ... |
app/controllers/public_controller.rb
app/helpers/application_helper.rb
... | ... | @@ -707,6 +707,24 @@ module ApplicationHelper |
707 | 707 | javascript_include_tag script if script |
708 | 708 | end |
709 | 709 | |
710 | + def template_path | |
711 | + if profile.nil? | |
712 | + "/designs/templates/#{environment.layout_template}" | |
713 | + else | |
714 | + "/designs/templates/#{profile.layout_template}" | |
715 | + end | |
716 | + end | |
717 | + | |
718 | + def template_javascript_src | |
719 | + script = File.join template_path, '/javascripts/template.js' | |
720 | + script if File.exists? File.join(Rails.root, 'public', script) | |
721 | + end | |
722 | + | |
723 | + def templete_javascript_ng | |
724 | + script = template_javascript_src | |
725 | + javascript_include_tag script if script | |
726 | + end | |
727 | + | |
710 | 728 | def file_field_or_thumbnail(label, image, i) |
711 | 729 | display_form_field label, ( |
712 | 730 | render :partial => (image && image.valid? ? 'shared/show_thumbnail' : 'shared/change_image'), |
... | ... | @@ -853,7 +871,7 @@ module ApplicationHelper |
853 | 871 | field_html += capture(&block) |
854 | 872 | end |
855 | 873 | |
856 | - if controller.action_name == 'signup' || controller.action_name == 'new_community' || (controller.controller_name == "enterprise_registration" && controller.action_name == 'index') | |
874 | + if controller.action_name == 'signup' || controller.action_name == 'new_community' || (controller.controller_name == "enterprise_registration" && controller.action_name == 'index') || (controller.controller_name == 'home' && controller.action_name == 'index' && user.nil?) | |
857 | 875 | if profile.signup_fields.include?(name) |
858 | 876 | result = field_html |
859 | 877 | end |
... | ... | @@ -913,6 +931,19 @@ module ApplicationHelper |
913 | 931 | article_helper.cms_label_for_edit |
914 | 932 | end |
915 | 933 | |
934 | + def label_for_clone_article(article) | |
935 | + translated_types = { | |
936 | + Folder => _('Folder'), | |
937 | + Blog => _('Blog'), | |
938 | + Event => _('Event'), | |
939 | + Forum => _('Forum') | |
940 | + } | |
941 | + | |
942 | + translated_type = translated_types[article.class] || _('Article') | |
943 | + | |
944 | + _('Clone %s') % translated_type | |
945 | + end | |
946 | + | |
916 | 947 | def add_rss_feed_to_head(title, url) |
917 | 948 | content_for :feeds do |
918 | 949 | tag(:link, :rel => 'alternate', :type => 'application/rss+xml', :title => title, :href => url_for(url)) |
... | ... | @@ -1184,35 +1215,6 @@ module ApplicationHelper |
1184 | 1215 | list.sort.inject(Hash.new(0)){|h,i| h[i] += 1; h }.collect{ |x, n| [n, connector, x].join(" ") }.sort |
1185 | 1216 | end |
1186 | 1217 | |
1187 | - #FIXME Use time_ago_in_words instead of this method if you're using Rails 2.2+ | |
1188 | - def time_ago_as_sentence(from_time, include_seconds = false) | |
1189 | - to_time = Time.now | |
1190 | - from_time = Time.parse(from_time.to_s) | |
1191 | - from_time = from_time.to_time if from_time.respond_to?(:to_time) | |
1192 | - to_time = to_time.to_time if to_time.respond_to?(:to_time) | |
1193 | - distance_in_minutes = (((to_time - from_time).abs)/60).round | |
1194 | - distance_in_seconds = ((to_time - from_time).abs).round | |
1195 | - case distance_in_minutes | |
1196 | - when 0..1 | |
1197 | - return (distance_in_minutes == 0) ? _('less than a minute') : _('1 minute') unless include_seconds | |
1198 | - case distance_in_seconds | |
1199 | - when 0..4 then _('less than 5 seconds') | |
1200 | - when 5..9 then _('less than 10 seconds') | |
1201 | - when 10..19 then _('less than 20 seconds') | |
1202 | - when 20..39 then _('half a minute') | |
1203 | - when 40..59 then _('less than a minute') | |
1204 | - else _('1 minute') | |
1205 | - end | |
1206 | - | |
1207 | - when 2..44 then _('%{distance} minutes ago') % { :distance => distance_in_minutes } | |
1208 | - when 45..89 then _('about 1 hour ago') | |
1209 | - when 90..1439 then _('about %{distance} hours ago') % { :distance => (distance_in_minutes.to_f / 60.0).round } | |
1210 | - when 1440..2879 then _('1 day ago') | |
1211 | - when 2880..10079 then _('%{distance} days ago') % { :distance => (distance_in_minutes / 1440).round } | |
1212 | - else show_time(from_time) | |
1213 | - end | |
1214 | - end | |
1215 | - | |
1216 | 1218 | def comment_balloon(options = {}, &block) |
1217 | 1219 | wrapper = content_tag(:div, capture(&block), :class => 'comment-balloon-content') |
1218 | 1220 | (1..8).to_a.reverse.each { |i| wrapper = content_tag(:div, wrapper, :class => "comment-wrapper-#{i}") } |
... | ... | @@ -1480,4 +1482,26 @@ module ApplicationHelper |
1480 | 1482 | text_field(object_name, method, options.merge(:class => 'colorpicker_field')) |
1481 | 1483 | end |
1482 | 1484 | |
1485 | + def fullscreen_buttons(itemId) | |
1486 | + content=" | |
1487 | + <script>fullscreenPageLoad('#{itemId}')</script> | |
1488 | + " | |
1489 | + content+=content_tag('a', content_tag('span',_("Full screen")), | |
1490 | + { :id=>"fullscreen-btn", | |
1491 | + :onClick=>"toggle_fullwidth('#{itemId}')", | |
1492 | + :class=>"button with-text icon-fullscreen", | |
1493 | + :href=>"#", | |
1494 | + :title=>_("Go to full screen mode") | |
1495 | + }) | |
1496 | + | |
1497 | + content+=content_tag('a', content_tag('span',_("Exit full screen")), | |
1498 | + { :style=>"display: none;", | |
1499 | + :id=>"exit-fullscreen-btn", | |
1500 | + :onClick=>"toggle_fullwidth('#{itemId}')", | |
1501 | + :class=>"button with-text icon-fullscreen", | |
1502 | + :href=>"#", | |
1503 | + :title=>_("Exit full screen mode") | |
1504 | + }) | |
1505 | + end | |
1506 | + | |
1483 | 1507 | end | ... | ... |
app/helpers/article_helper.rb
... | ... | @@ -12,6 +12,7 @@ module ArticleHelper |
12 | 12 | @article = article |
13 | 13 | |
14 | 14 | visibility_options(@article, tokenized_children) + |
15 | + topic_creation(@article) + | |
15 | 16 | content_tag('h4', _('Options')) + |
16 | 17 | content_tag('div', |
17 | 18 | (article.profile.has_members? ? |
... | ... | @@ -55,14 +56,7 @@ module ArticleHelper |
55 | 56 | 'div', |
56 | 57 | check_box(:article, :display_versions) + |
57 | 58 | content_tag('label', _('I want this article to display a link to older versions'), :for => 'article_display_versions') |
58 | - ) : '') + | |
59 | - | |
60 | - (article.forum? && article.profile.community? ? | |
61 | - content_tag( | |
62 | - 'div', | |
63 | - check_box(:article, :allows_members_to_create_topics) + | |
64 | - content_tag('label', _('Allow members to create topics'), :for => 'article_allows_members_to_create_topics') | |
65 | - ) : '') | |
59 | + ) : '') | |
66 | 60 | ) |
67 | 61 | end |
68 | 62 | |
... | ... | @@ -81,6 +75,22 @@ module ArticleHelper |
81 | 75 | ) |
82 | 76 | end |
83 | 77 | |
78 | + def topic_creation(article) | |
79 | + return '' unless article.forum? | |
80 | + | |
81 | + general_options = Forum::TopicCreation.general_options(article) | |
82 | + slider_options = {:id => 'topic-creation-slider'} | |
83 | + slider_options = general_options.keys.inject(slider_options) do |result, option| | |
84 | + result.merge!({'data-'+option => general_options[option]}) | |
85 | + end | |
86 | + | |
87 | + content_tag('h4', _('Topic creation')) + | |
88 | + content_tag( 'small', _('Who will be able to create new topics on this forum?')) + | |
89 | + content_tag('div', '', slider_options) + | |
90 | + hidden_field_tag('article[topic_creation]', article.topic_creation) + | |
91 | + javascript_include_tag('topic-creation-config') | |
92 | + end | |
93 | + | |
84 | 94 | def privacity_exceptions(article, tokenized_children) |
85 | 95 | content_tag('div', |
86 | 96 | content_tag('div', | ... | ... |
app/helpers/blog_helper.rb
... | ... | @@ -17,37 +17,52 @@ module BlogHelper |
17 | 17 | _('Configure blog') |
18 | 18 | end |
19 | 19 | |
20 | - def list_posts(articles, format = 'full', paginate = true) | |
20 | + def list_posts(articles, conf = { format: 'full', paginate: true }) | |
21 | 21 | pagination = will_paginate(articles, { |
22 | 22 | :param_name => 'npage', |
23 | 23 | :previous_label => _('« Newer posts'), |
24 | 24 | :next_label => _('Older posts »'), |
25 | - :params => {:action=>"view_page", :page=>articles.first.parent.path.split('/'), :controller=>"content_viewer"} | |
26 | - }) if articles.present? && paginate | |
25 | + :params => {:action=>"view_page", | |
26 | + :page=>articles.first.parent.path.split('/'), | |
27 | + :controller=>"content_viewer"} | |
28 | + }) if articles.present? && conf[:paginate] | |
27 | 29 | content = [] |
28 | 30 | artic_len = articles.length |
29 | 31 | articles.each_with_index{ |art,i| |
30 | - css_add = [ 'position-'+(i+1).to_s() ] | |
32 | + css_add = [ 'blog-post', 'position-'+(i+1).to_s() ] | |
31 | 33 | position = (i%2 == 0) ? 'odd-post' : 'even-post' |
32 | 34 | css_add << 'first' if i == 0 |
33 | 35 | css_add << 'last' if i == (artic_len-1) |
34 | 36 | css_add << 'not-published' if !art.published? |
35 | - css_add << position + '-inner' | |
36 | - content << content_tag('div', | |
37 | - content_tag('div', | |
38 | - display_post(art, format).html_safe + '<br style="clear:both"/>'.html_safe, | |
39 | - :class => 'blog-post ' + css_add.join(' '), | |
40 | - :id => "post-#{art.id}"), :class => position | |
41 | - ) | |
37 | + css_add << position | |
38 | + content << (content_tag 'div', id: "post-#{art.id}", class: css_add do | |
39 | + content_tag 'div', class: position + '-inner blog-post-inner' do | |
40 | + display_post(art, conf[:format]).html_safe + | |
41 | + '<br style="clear:both"/>'.html_safe | |
42 | + end | |
43 | + end) | |
42 | 44 | } |
43 | 45 | content.join("\n<hr class='sep-posts'/>\n") + (pagination or '') |
44 | 46 | end |
45 | 47 | |
46 | 48 | def display_post(article, format = 'full') |
47 | - no_comments = (format == 'full') ? false : true | |
49 | + no_comments = (format == 'full' || format == 'compact' ) ? false : true | |
48 | 50 | title = article_title(article, :no_comments => no_comments) |
49 | - html = send("display_#{format}_format", FilePresenter.for(article)).html_safe | |
50 | - title + html | |
51 | + method = "display_#{format.split('+')[0]}_format" | |
52 | + html = send(method, FilePresenter.for(article)).html_safe | |
53 | + if format.split('+')[1] == 'pic' | |
54 | + img = article.first_image | |
55 | + if img.blank? | |
56 | + '<div class="post-pic empty"></div>' | |
57 | + else | |
58 | + '<div class="post-pic" style="background-image:url('+img+')"></div>' | |
59 | + end | |
60 | + end.to_s + title + html | |
61 | + end | |
62 | + | |
63 | + def display_compact_format(article) | |
64 | + render :file => 'content_viewer/_display_compact_format', | |
65 | + :locals => { :article => article, :format => "compact" } | |
51 | 66 | end |
52 | 67 | |
53 | 68 | def display_full_format(article) | ... | ... |
app/helpers/boxes_helper.rb
... | ... | @@ -122,7 +122,7 @@ module BoxesHelper |
122 | 122 | end |
123 | 123 | |
124 | 124 | def wrap_main_content(content) |
125 | - (1..8).to_a.reverse.inject(content) { |acc,n| content_tag('div', acc, :id => 'main-content-wrapper-' + n.to_s) } | |
125 | + content_tag('div', content, :class => 'main-content') | |
126 | 126 | end |
127 | 127 | |
128 | 128 | def extract_block_content(content) |
... | ... | @@ -190,7 +190,7 @@ module BoxesHelper |
190 | 190 | else |
191 | 191 | "before-block-#{block.id}" |
192 | 192 | end |
193 | - if block.nil? or modifiable?(block) | |
193 | + if block.nil? || movable?(block) | |
194 | 194 | content_tag('div', ' ', :id => id, :class => 'block-target' ) + drop_receiving_element(id, :url => { :action => 'move_block', :target => id }, :accept => box.acceptable_blocks, :hoverclass => 'block-target-hover') |
195 | 195 | else |
196 | 196 | "" |
... | ... | @@ -199,14 +199,14 @@ module BoxesHelper |
199 | 199 | |
200 | 200 | # makes the given block draggable so it can be moved away. |
201 | 201 | def block_handle(block) |
202 | - modifiable?(block) ? draggable_element("block-#{block.id}", :revert => true) : "" | |
202 | + movable?(block) ? draggable_element("block-#{block.id}", :revert => true) : "" | |
203 | 203 | end |
204 | 204 | |
205 | 205 | def block_edit_buttons(block) |
206 | 206 | buttons = [] |
207 | 207 | nowhere = 'javascript: return false;' |
208 | 208 | |
209 | - if modifiable?(block) | |
209 | + if movable?(block) | |
210 | 210 | if block.first? |
211 | 211 | buttons << icon_button('up-disabled', _("Can't move up anymore."), nowhere) |
212 | 212 | else |
... | ... | @@ -229,15 +229,15 @@ module BoxesHelper |
229 | 229 | buttons << icon_button('left', _('Move to the opposite side'), { :action => 'move_block', :target => 'end-of-box-' + holder.boxes[1].id.to_s, :id => block.id }, :method => 'post' ) |
230 | 230 | end |
231 | 231 | end |
232 | + end | |
232 | 233 | |
233 | - if block.editable? | |
234 | - buttons << modal_icon_button(:edit, _('Edit'), { :action => 'edit', :id => block.id }) | |
235 | - end | |
234 | + if editable?(block) | |
235 | + buttons << modal_icon_button(:edit, _('Edit'), { :action => 'edit', :id => block.id }) | |
236 | + end | |
236 | 237 | |
237 | - if !block.main? | |
238 | - buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')}) | |
239 | - buttons << icon_button(:clone, _('Clone'), { :action => 'clone_block', :id => block.id }, { :method => 'post' }) | |
240 | - end | |
238 | + if movable?(block) && !block.main? | |
239 | + buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')}) | |
240 | + buttons << icon_button(:clone, _('Clone'), { :action => 'clone_block', :id => block.id }, { :method => 'post' }) | |
241 | 241 | end |
242 | 242 | |
243 | 243 | if block.respond_to?(:help) |
... | ... | @@ -251,8 +251,8 @@ module BoxesHelper |
251 | 251 | content_tag('h2', _('Embed block code')) + |
252 | 252 | content_tag('div', _('Below, you''ll see a field containing embed code for the block. Just copy the code and paste it into your website or blogging software.'), :style => 'margin-bottom: 1em;') + |
253 | 253 | content_tag('textarea', embed_code, :style => 'margin-bottom: 1em; width:100%; height:40%;', :readonly => 'readonly') + |
254 | - thickbox_close_button(_('Close')), :style => 'display: none;', :id => "embed-code-box-#{block.id}") | |
255 | - buttons << thickbox_inline_popup_icon(:embed, _('Embed code'), {}, "embed-code-box-#{block.id}") << html | |
254 | + modal_close_button(_('Close')), :style => 'display: none;', :id => "embed-code-box-#{block.id}") | |
255 | + buttons << modal_inline_icon(:embed, _('Embed code'), {}, "#embed-code-box-#{block.id}") << html | |
256 | 256 | end |
257 | 257 | |
258 | 258 | content_tag('div', buttons.join("\n") + tag('br', :style => 'clear: left'), :class => 'button-bar') |
... | ... | @@ -273,7 +273,11 @@ module BoxesHelper |
273 | 273 | classes |
274 | 274 | end |
275 | 275 | |
276 | - def modifiable?(block) | |
277 | - return !block.fixed || environment.admins.include?(user) | |
276 | + def movable?(block) | |
277 | + return block.movable? || user.is_admin? | |
278 | + end | |
279 | + | |
280 | + def editable?(block) | |
281 | + return block.editable? || user.is_admin? | |
278 | 282 | end |
279 | 283 | end | ... | ... |
app/helpers/chat_helper.rb
... | ... | @@ -9,12 +9,12 @@ module ChatHelper |
9 | 9 | avatar = profile_image(user, :portrait, :class => 'avatar') |
10 | 10 | content_tag('span', |
11 | 11 | link_to(avatar + content_tag('span', user.name) + ui_icon('ui-icon-triangle-1-s'), |
12 | - '#', | |
12 | + '', | |
13 | 13 | :onclick => 'toggleMenu(this); return false', |
14 | 14 | :class => icon_class + ' simplemenu-trigger' |
15 | 15 | ) + |
16 | 16 | content_tag('ul', |
17 | - links.map{|link| content_tag('li', link_to(link[1], '#', :class => link[0], :id => link[2], 'data-jid' => user.jid), :class => 'simplemenu-item') }.join("\n"), | |
17 | + links.map{|link| content_tag('li', link_to(link[1], '', :class => link[0], :id => link[2], 'data-jid' => user.jid), :class => 'simplemenu-item') }.join("\n"), | |
18 | 18 | :style => 'display: none; z-index: 100', |
19 | 19 | :class => 'simplemenu-submenu' |
20 | 20 | ), | ... | ... |
app/helpers/comment_helper.rb
app/helpers/content_viewer_helper.rb
... | ... | @@ -2,6 +2,7 @@ module ContentViewerHelper |
2 | 2 | |
3 | 3 | include BlogHelper |
4 | 4 | include ForumHelper |
5 | + include DatesHelper | |
5 | 6 | |
6 | 7 | def display_number_of_comments(n) |
7 | 8 | base_str = "<span class='comment-count hide'>#{n}</span>" |
... | ... | @@ -24,8 +25,9 @@ module ContentViewerHelper |
24 | 25 | unless args[:no_comments] || !article.accept_comments |
25 | 26 | comments = (" - %s") % link_to_comments(article) |
26 | 27 | end |
28 | + date_format = show_with_right_format_date article | |
27 | 29 | title << content_tag('span', |
28 | - content_tag('span', show_date(article.published_at), :class => 'date') + | |
30 | + date_format + | |
29 | 31 | content_tag('span', _(", by %s") % (article.author ? link_to(article.author_name, article.author_url) : article.author_name), :class => 'author') + |
30 | 32 | content_tag('span', comments, :class => 'comments'), |
31 | 33 | :class => 'created-at' |
... | ... | @@ -34,6 +36,24 @@ module ContentViewerHelper |
34 | 36 | title |
35 | 37 | end |
36 | 38 | |
39 | + def show_with_right_format_date article | |
40 | + date_format = article.environment.date_format | |
41 | + use_numbers = false | |
42 | + year = true | |
43 | + left_time = false | |
44 | + if date_format == 'numbers_with_year' | |
45 | + use_numbers = true | |
46 | + elsif date_format == 'numbers' | |
47 | + use_numbers = true | |
48 | + year = false | |
49 | + elsif date_format == 'month_name' | |
50 | + year = false | |
51 | + elsif date_format == 'past_time' | |
52 | + left_time = true | |
53 | + end | |
54 | + content_tag('span', show_date(article.published_at, use_numbers , year, left_time), :class => 'date') | |
55 | + end | |
56 | + | |
37 | 57 | def link_to_comments(article, args = {}) |
38 | 58 | return '' unless article.accept_comments? |
39 | 59 | reference_to_article number_of_comments(article), article, 'comments_list' | ... | ... |
app/helpers/dates_helper.rb
... | ... | @@ -2,6 +2,7 @@ require 'noosfero/i18n' |
2 | 2 | |
3 | 3 | module DatesHelper |
4 | 4 | |
5 | + include ActionView::Helpers::DateHelper | |
5 | 6 | def months |
6 | 7 | I18n.t('date.month_names') |
7 | 8 | end |
... | ... | @@ -15,10 +16,12 @@ module DatesHelper |
15 | 16 | end |
16 | 17 | |
17 | 18 | # formats a date for displaying. |
18 | - def show_date(date, use_numbers = false, year=true) | |
19 | + def show_date(date, use_numbers = false, year = true, left_time = false) | |
19 | 20 | if date && use_numbers |
20 | 21 | date_format = year ? _('%{month}/%{day}/%{year}') : _('%{month}/%{day}') |
21 | 22 | date_format % { :day => date.day, :month => date.month, :year => date.year } |
23 | + elsif date && left_time | |
24 | + date_format = time_ago_in_words(date) | |
22 | 25 | elsif date |
23 | 26 | date_format = year ? _('%{month_name} %{day}, %{year}') : _('%{month_name} %{day}') |
24 | 27 | date_format % { :day => date.day, :month_name => month_name(date.month), :year => date.year } | ... | ... |
app/helpers/events_helper.rb
app/helpers/folder_helper.rb
1 | -require 'short_filename' | |
2 | - | |
3 | 1 | module FolderHelper |
4 | 2 | |
5 | - include ShortFilename | |
6 | 3 | include ArticleHelper |
7 | 4 | |
8 | 5 | def list_contents(configure={}) |
... | ... | @@ -10,8 +7,8 @@ module FolderHelper |
10 | 7 | configure[:list_type] ||= :folder |
11 | 8 | if !configure[:contents].blank? |
12 | 9 | configure[:contents] = configure[:contents].paginate( |
13 | - :order => "updated_at DESC", | |
14 | - :per_page => 10, | |
10 | + :order => "name ASC", | |
11 | + :per_page => 30, | |
15 | 12 | :page => params[:npage] |
16 | 13 | ) |
17 | 14 | |
... | ... | @@ -25,49 +22,32 @@ module FolderHelper |
25 | 22 | articles.select {|article| article.display_to?(user)} |
26 | 23 | end |
27 | 24 | |
28 | - def display_content_in_listing(configure={}) | |
29 | - recursive = configure[:recursive] || false | |
30 | - list_type = configure[:list_type] || :folder | |
31 | - level = configure[:level] || 0 | |
32 | - content = FilePresenter.for configure[:content] | |
25 | + def display_content_icon(content_item) | |
26 | + content = FilePresenter.for content_item | |
33 | 27 | content_link = if content.image? |
34 | - link_to(' ' * (level * 4) + | |
35 | - image_tag(icon_for_article(content)) + short_filename(content.name), | |
28 | + link_to( | |
29 | + image_tag(icon_for_article(content, :bigicon)), | |
36 | 30 | content.url.merge(:view => true) |
37 | 31 | ) |
38 | 32 | else |
39 | - link_to(' ' * (level * 4) + | |
40 | - short_filename(content.name), | |
41 | - content.url.merge(:view => true), :class => icon_for_article(content) | |
33 | + link_to('', | |
34 | + content.url.merge(:view => true), | |
35 | + :class => icon_for_article(content, :bigicon) | |
42 | 36 | ) |
43 | 37 | end |
44 | - result = content_tag( | |
45 | - 'tr', | |
46 | - content_tag('td', content_link ) + | |
47 | - content_tag('td', show_date(content.updated_at), :class => 'last-update'), | |
48 | - :class => "#{list_type}-item" | |
49 | - ) | |
50 | - if recursive | |
51 | - result + content.children.map {|item| | |
52 | - display_content_in_listing :content=>item, :recursive=>recursive, | |
53 | - :list_type=>list_type, :level=>level+1 | |
54 | - }.join("\n") | |
55 | - else | |
56 | - result | |
57 | - end | |
58 | 38 | end |
59 | 39 | |
60 | - def icon_for_article(article) | |
40 | + def icon_for_article(article, size = 'icon') | |
61 | 41 | article = FilePresenter.for article |
62 | - icon = article.respond_to?(:icon_name) ? | |
63 | - article.icon_name : | |
64 | - article.class.icon_name(article) | |
65 | - if (icon =~ /\//) | |
66 | - icon | |
42 | + if article.respond_to?(:sized_icon) | |
43 | + article.sized_icon(size) | |
67 | 44 | else |
68 | - klasses = 'icon ' + [icon].flatten.map{|name| 'icon-'+name}.join(' ') | |
45 | + icon = article.respond_to?(:icon_name) ? | |
46 | + article.icon_name : | |
47 | + article.class.icon_name(article) | |
48 | + klasses = "#{size} " + [icon].flatten.map{|name| "#{size}-"+name}.join(' ') | |
69 | 49 | if article.kind_of?(UploadedFile) || article.kind_of?(FilePresenter) |
70 | - klasses += ' icon-upload-file' | |
50 | + klasses += " #{size}-upload-file" | |
71 | 51 | end |
72 | 52 | klasses |
73 | 53 | end | ... | ... |
app/helpers/forum_helper.rb
1 | 1 | module ForumHelper |
2 | + include ActionView::Helpers::DateHelper | |
2 | 3 | |
3 | 4 | def cms_label_for_new_children |
4 | 5 | _('New discussion topic') |
... | ... | @@ -42,9 +43,9 @@ module ForumHelper |
42 | 43 | def last_topic_update(article) |
43 | 44 | info = article.info_from_last_update |
44 | 45 | if info[:author_url] |
45 | - time_ago_as_sentence(info[:date]) + ' ' + _('by') + ' ' + link_to(info[:author_name], info[:author_url]) | |
46 | + time_ago_in_words(info[:date]) + ' ' + _('by') + ' ' + link_to(info[:author_name], info[:author_url]) | |
46 | 47 | else |
47 | - time_ago_as_sentence(info[:date]) + ' ' + _('by') + ' ' + info[:author_name] | |
48 | + time_ago_in_words(info[:date]) + ' ' + _('by') + ' ' + info[:author_name] | |
48 | 49 | end |
49 | 50 | end |
50 | 51 | ... | ... |
app/helpers/layout_helper.rb
... | ... | @@ -28,7 +28,7 @@ module LayoutHelper |
28 | 28 | end |
29 | 29 | |
30 | 30 | def noosfero_javascript |
31 | - plugins_javascripts = @plugins.flat_map{ |plugin| plugin.js_files.map{ |js| plugin.class.public_path(js, true) } }.flatten | |
31 | + plugins_javascripts = @plugins.flat_map{ |plugin| Array.wrap(plugin.js_files).map{ |js| plugin.class.public_path(js, true) } }.flatten | |
32 | 32 | |
33 | 33 | output = '' |
34 | 34 | output += render 'layouts/javascript' |
... | ... | @@ -38,6 +38,8 @@ module LayoutHelper |
38 | 38 | output += theme_javascript_ng.to_s |
39 | 39 | output += javascript_tag 'render_all_jquery_ui_widgets()' |
40 | 40 | |
41 | + output += templete_javascript_ng.to_s | |
42 | + | |
41 | 43 | output |
42 | 44 | end |
43 | 45 | |
... | ... | @@ -70,11 +72,7 @@ module LayoutHelper |
70 | 72 | end |
71 | 73 | |
72 | 74 | def template_stylesheet_path |
73 | - if profile.nil? | |
74 | - "/designs/templates/#{environment.layout_template}/stylesheets/style.css" | |
75 | - else | |
76 | - "/designs/templates/#{profile.layout_template}/stylesheets/style.css" | |
77 | - end | |
75 | + File.join template_path, "/stylesheets/style.css" | |
78 | 76 | end |
79 | 77 | |
80 | 78 | ... | ... |
app/helpers/manage_products_helper.rb
... | ... | @@ -75,9 +75,12 @@ module ManageProductsHelper |
75 | 75 | end |
76 | 76 | |
77 | 77 | def categories_container(categories_selection_html, hierarchy_html = '') |
78 | - hidden_field_tag('selected_category_id') + | |
79 | - content_tag('div', hierarchy_html, :id => 'hierarchy_navigation') + | |
80 | - content_tag('div', categories_selection_html, :id => 'categories_container_wrapper') | |
78 | + content_tag 'div', | |
79 | + render('categories_autocomplete') + | |
80 | + hidden_field_tag('selected_category_id') + | |
81 | + content_tag('div', hierarchy_html, :id => 'hierarchy_navigation') + | |
82 | + content_tag('div', categories_selection_html, :id => 'categories_container_wrapper'), | |
83 | + :id => 'categories-container' | |
81 | 84 | end |
82 | 85 | |
83 | 86 | def select_for_categories(categories, level = 0) | ... | ... |
app/helpers/profile_editor_helper.rb
... | ... | @@ -141,8 +141,9 @@ module ProfileEditorHelper |
141 | 141 | ) |
142 | 142 | end |
143 | 143 | |
144 | - def control_panel_button(title, icon, url) | |
145 | - link_to title, url, :class => 'control-panel-%s' % icon | |
144 | + def control_panel_button(title, icon, url, html_options = {}) | |
145 | + html_options ||= {} | |
146 | + link_to title, url, html_options.merge(:class => 'control-panel-%s' % icon) | |
146 | 147 | end |
147 | 148 | |
148 | 149 | def unchangeable_privacy_field(profile) | ... | ... |
app/helpers/search_helper.rb
... | ... | @@ -106,6 +106,10 @@ module SearchHelper |
106 | 106 | end |
107 | 107 | end |
108 | 108 | |
109 | + def city_with_state_for_profile(p) | |
110 | + city_with_state(p.region) || [p.city, p.state].compact.reject(&:blank?).join(', ') | |
111 | + end | |
112 | + | |
109 | 113 | def display_selector(asset, display, float = 'right') |
110 | 114 | display = nil if display.blank? |
111 | 115 | display ||= asset_class(asset).default_search_display | ... | ... |
app/helpers/tinymce_helper.rb
... | ... | @@ -17,9 +17,10 @@ module TinymceHelper |
17 | 17 | searchreplace wordcount visualblocks visualchars code fullscreen |
18 | 18 | insertdatetime media nonbreaking save table contextmenu directionality |
19 | 19 | emoticons template paste textcolor colorpicker textpattern], |
20 | + :image_advtab => true, | |
20 | 21 | :language => tinymce_language |
21 | 22 | |
22 | - options[:toolbar1] = "insertfile undo redo | copy paste | bold italic underline | styleselect fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image" | |
23 | + options[:toolbar1] = "fullscreen | insertfile undo redo | copy paste | bold italic underline | styleselect fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image" | |
23 | 24 | if options[:mode] == 'simple' |
24 | 25 | options[:menubar] = false |
25 | 26 | else | ... | ... |
app/helpers/users_helper.rb
... | ... | @@ -14,7 +14,7 @@ module UsersHelper |
14 | 14 | select_field = select_tag(:filter, options, :onchange => onchange) |
15 | 15 | content_tag('div', |
16 | 16 | content_tag('strong', _('Filter')) + ': ' + select_field, |
17 | - :class => "environment-users-customize-search" | |
17 | + :class => "environment-profiles-customize-search" | |
18 | 18 | ) |
19 | 19 | end |
20 | 20 | ... | ... |
app/mailers/task_mailer.rb
... | ... | @@ -5,7 +5,7 @@ class TaskMailer < ActionMailer::Base |
5 | 5 | @target = task.target.name |
6 | 6 | @environment = task.environment.name |
7 | 7 | @url = generate_environment_url(task, :controller => 'home') |
8 | - url_for_tasks_list = task.target.kind_of?(Environment) ? '' : url_for(task.target.tasks_url) | |
8 | + url_for_tasks_list = task.target.kind_of?(Environment) ? '' : url_for(task.target.tasks_url.merge(:script_name => Noosfero.root('/'))) | |
9 | 9 | @tasks_url = url_for_tasks_list |
10 | 10 | |
11 | 11 | mail( |
... | ... | @@ -56,7 +56,7 @@ class TaskMailer < ActionMailer::Base |
56 | 56 | end |
57 | 57 | |
58 | 58 | def generate_environment_url(task, url = {}) |
59 | - url_for(Noosfero.url_options.merge(:host => task.environment.default_hostname).merge(url)) | |
59 | + url_for(Noosfero.url_options.merge(:host => task.environment.default_hostname).merge(url).merge(:script_name => Noosfero.root('/'))) | |
60 | 60 | end |
61 | 61 | |
62 | 62 | end | ... | ... |
app/models/add_friend.rb
... | ... | @@ -54,7 +54,7 @@ class AddFriend < Task |
54 | 54 | end |
55 | 55 | |
56 | 56 | def remove_from_suggestion_list(task) |
57 | - suggestion = task.requestor.profile_suggestions.find_by_suggestion_id task.target.id | |
57 | + suggestion = task.requestor.suggested_profiles.find_by_suggestion_id task.target.id | |
58 | 58 | suggestion.disable if suggestion |
59 | 59 | end |
60 | 60 | end | ... | ... |
app/models/article.rb
... | ... | @@ -5,7 +5,7 @@ class Article < ActiveRecord::Base |
5 | 5 | :allow_members_to_edit, :translation_of_id, :language, |
6 | 6 | :license_id, :parent_id, :display_posts_in_current_language, |
7 | 7 | :category_ids, :posts_per_page, :moderate_comments, |
8 | - :accept_comments, :feed, :published, :source, | |
8 | + :accept_comments, :feed, :published, :source, :source_name, | |
9 | 9 | :highlighted, :notify_comments, :display_hits, :slug, |
10 | 10 | :external_feed_builder, :display_versions, :external_link, |
11 | 11 | :image_builder, :show_to_followers |
... | ... | @@ -25,6 +25,16 @@ class Article < ActiveRecord::Base |
25 | 25 | :display => %w[full] |
26 | 26 | } |
27 | 27 | |
28 | + def initialize(*params) | |
29 | + super | |
30 | + | |
31 | + if !params.blank? && params.first.has_key?(:profile) && !params.first[:profile].blank? | |
32 | + profile = params.first[:profile] | |
33 | + self.published = false unless profile.public? | |
34 | + end | |
35 | + | |
36 | + end | |
37 | + | |
28 | 38 | def self.default_search_display |
29 | 39 | 'full' |
30 | 40 | end |
... | ... | @@ -86,6 +96,8 @@ class Article < ActiveRecord::Base |
86 | 96 | belongs_to :translation_of, :class_name => 'Article', :foreign_key => :translation_of_id |
87 | 97 | before_destroy :rotate_translations |
88 | 98 | |
99 | + acts_as_voteable | |
100 | + | |
89 | 101 | before_create do |article| |
90 | 102 | article.published_at ||= Time.now |
91 | 103 | if article.reference_article && !article.parent |
... | ... | @@ -491,11 +503,11 @@ class Article < ActiveRecord::Base |
491 | 503 | return [] if user.nil? || (profile && !profile.public? && !user.follows?(profile)) |
492 | 504 | where( |
493 | 505 | [ |
494 | - "published = ? OR last_changed_by_id = ? OR profile_id = ? OR ? | |
495 | - OR (show_to_followers = ? AND ?)", true, user.id, user.id, | |
506 | + "published = ? OR last_changed_by_id = ? OR profile_id = ? OR ? | |
507 | + OR (show_to_followers = ? AND ? AND profile_id = ?)", true, user.id, user.id, | |
496 | 508 | profile.nil? ? false : user.has_permission?(:view_private_content, profile), |
497 | - true, user.follows?(profile) | |
498 | - ] | |
509 | + true, user.follows?(profile), (profile.nil? ? nil : profile.id) | |
510 | + ] | |
499 | 511 | ) |
500 | 512 | } |
501 | 513 | |
... | ... | @@ -509,7 +521,7 @@ class Article < ActiveRecord::Base |
509 | 521 | |
510 | 522 | def display_to?(user = nil) |
511 | 523 | if published? |
512 | - profile.display_info_to?(user) | |
524 | + (profile.secret? || !profile.visible?) ? profile.display_info_to?(user) : true | |
513 | 525 | else |
514 | 526 | if !user |
515 | 527 | false |
... | ... | @@ -567,25 +579,24 @@ class Article < ActiveRecord::Base |
567 | 579 | profile.visible? && profile.public? && published? |
568 | 580 | end |
569 | 581 | |
570 | - | |
571 | - def copy(options = {}) | |
582 | + def copy_without_save(options = {}) | |
572 | 583 | attrs = attributes.reject! { |key, value| ATTRIBUTES_NOT_COPIED.include?(key.to_sym) } |
573 | 584 | attrs.merge!(options) |
574 | 585 | object = self.class.new |
575 | 586 | attrs.each do |key, value| |
576 | 587 | object.send(key.to_s+'=', value) |
577 | 588 | end |
589 | + object | |
590 | + end | |
591 | + | |
592 | + def copy(options = {}) | |
593 | + object = copy_without_save(options) | |
578 | 594 | object.save |
579 | 595 | object |
580 | 596 | end |
581 | 597 | |
582 | 598 | def copy!(options = {}) |
583 | - attrs = attributes.reject! { |key, value| ATTRIBUTES_NOT_COPIED.include?(key.to_sym) } | |
584 | - attrs.merge!(options) | |
585 | - object = self.class.new | |
586 | - attrs.each do |key, value| | |
587 | - object.send(key.to_s+'=', value) | |
588 | - end | |
599 | + object = copy_without_save(options) | |
589 | 600 | object.save! |
590 | 601 | object |
591 | 602 | end |
... | ... | @@ -769,7 +780,9 @@ class Article < ActiveRecord::Base |
769 | 780 | end |
770 | 781 | |
771 | 782 | def first_image |
772 | - img = Nokogiri::HTML.fragment(self.lead.to_s).css('img[src]').first || Nokogiri::HTML.fragment(self.body.to_s).search('img').first | |
783 | + img = ( image.present? && { 'src' => image.public_filename } ) || | |
784 | + Nokogiri::HTML.fragment(self.lead.to_s).css('img[src]').first || | |
785 | + Nokogiri::HTML.fragment(self.body.to_s).search('img').first | |
773 | 786 | img.nil? ? '' : img['src'] |
774 | 787 | end |
775 | 788 | ... | ... |
app/models/block.rb
1 | 1 | class Block < ActiveRecord::Base |
2 | 2 | |
3 | - attr_accessible :title, :display, :limit, :box_id, :posts_per_page, :visualization_format, :language, :display_user, :box, :fixed | |
3 | + attr_accessible :title, :display, :limit, :box_id, :posts_per_page, | |
4 | + :visualization_format, :language, :display_user, | |
5 | + :box, :edit_modes, :move_modes, :mirror | |
4 | 6 | |
5 | 7 | # to be able to generate HTML |
6 | 8 | include ActionView::Helpers::UrlHelper |
... | ... | @@ -13,17 +15,29 @@ class Block < ActiveRecord::Base |
13 | 15 | |
14 | 16 | acts_as_list :scope => :box |
15 | 17 | belongs_to :box |
18 | + belongs_to :mirror_block, :class_name => "Block" | |
19 | + has_many :observers, :class_name => "Block", :foreign_key => "mirror_block_id" | |
16 | 20 | |
17 | 21 | acts_as_having_settings |
18 | 22 | |
19 | 23 | scope :enabled, :conditions => { :enabled => true } |
20 | 24 | |
25 | + after_save do |block| | |
26 | + if block.owner.kind_of?(Profile) && block.owner.is_template? && block.mirror? | |
27 | + block.observers.each do |observer| | |
28 | + observer.copy_from(block) | |
29 | + observer.title = block.title | |
30 | + observer.save | |
31 | + end | |
32 | + end | |
33 | + end | |
34 | + | |
21 | 35 | def embedable? |
22 | 36 | false |
23 | 37 | end |
24 | 38 | |
25 | 39 | def get_limit |
26 | - [0,limit].max | |
40 | + [0,limit.to_i].max | |
27 | 41 | end |
28 | 42 | |
29 | 43 | def embed_code |
... | ... | @@ -110,8 +124,13 @@ class Block < ActiveRecord::Base |
110 | 124 | # * <tt>'all'</tt>: the block is always displayed |
111 | 125 | settings_items :language, :type => :string, :default => 'all' |
112 | 126 | |
113 | - # The block can be configured to be fixed. Only can be edited by environment admins | |
114 | - settings_items :fixed, :type => :boolean, :default => false | |
127 | + # The block can be configured to define the edition modes options. Only can be edited by environment admins | |
128 | + # It can assume the following values: | |
129 | + # | |
130 | + # * <tt>'all'</tt>: the block owner has all edit options for this block | |
131 | + # * <tt>'none'</tt>: the block owner can't do anything with the block | |
132 | + settings_items :edit_modes, :type => :string, :default => 'all' | |
133 | + settings_items :move_modes, :type => :string, :default => 'all' | |
115 | 134 | |
116 | 135 | # returns the description of the block, used when the user sees a list of |
117 | 136 | # blocks to choose one to include in the design. |
... | ... | @@ -148,7 +167,11 @@ class Block < ActiveRecord::Base |
148 | 167 | |
149 | 168 | # Is this block editable? (Default to <tt>false</tt>) |
150 | 169 | def editable? |
151 | - true | |
170 | + self.edit_modes == "all" | |
171 | + end | |
172 | + | |
173 | + def movable? | |
174 | + self.move_modes == "all" | |
152 | 175 | end |
153 | 176 | |
154 | 177 | # must always return false, except on MainBlock clas. |
... | ... | @@ -228,6 +251,21 @@ class Block < ActiveRecord::Base |
228 | 251 | } |
229 | 252 | end |
230 | 253 | |
254 | + def edit_block_options | |
255 | + @edit_options ||= { | |
256 | + 'all' => _('Can be modified'), | |
257 | + 'none' => _('Cannot be modified') | |
258 | + } | |
259 | + end | |
260 | + | |
261 | + def move_block_options | |
262 | + @move_options ||= { | |
263 | + 'all' => _('Can be moved'), | |
264 | + 'none' => _('Cannot be moved') | |
265 | + } | |
266 | + end | |
267 | + | |
268 | + | |
231 | 269 | def duplicate |
232 | 270 | duplicated_block = self.dup |
233 | 271 | duplicated_block.display = 'never' |
... | ... | @@ -243,6 +281,10 @@ class Block < ActiveRecord::Base |
243 | 281 | self.position = block.position |
244 | 282 | end |
245 | 283 | |
284 | + def add_observer(block) | |
285 | + self.observers << block | |
286 | + end | |
287 | + | |
246 | 288 | private |
247 | 289 | |
248 | 290 | def home_page_path | ... | ... |
app/models/blog.rb
... | ... | @@ -76,9 +76,12 @@ class Blog < Folder |
76 | 76 | end |
77 | 77 | |
78 | 78 | settings_items :visualization_format, :type => :string, :default => 'full' |
79 | - validates_inclusion_of :visualization_format, :in => [ 'full', 'short' ], :if => :visualization_format | |
79 | + validates_inclusion_of :visualization_format, | |
80 | + :in => [ 'full', 'short', 'short+pic', 'compact'], | |
81 | + :if => :visualization_format | |
80 | 82 | |
81 | - settings_items :display_posts_in_current_language, :type => :boolean, :default => false | |
83 | + settings_items :display_posts_in_current_language, | |
84 | + :type => :boolean, :default => false | |
82 | 85 | |
83 | 86 | alias :display_posts_in_current_language? :display_posts_in_current_language |
84 | 87 | ... | ... |
app/models/chat_message.rb
app/models/comment.rb
app/models/environment.rb
... | ... | @@ -3,7 +3,17 @@ |
3 | 3 | # domains. |
4 | 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, :highlighted_news_amount, :portal_news_amount | |
6 | + attr_accessible :name, :is_default, :signup_welcome_text_subject, | |
7 | + :signup_welcome_text_body, :terms_of_use, | |
8 | + :message_for_disabled_enterprise, :news_amount_by_folder, | |
9 | + :default_language, :languages, :description, | |
10 | + :organization_approval_method, :enabled_plugins, | |
11 | + :enabled_features, :redirection_after_login, | |
12 | + :redirection_after_signup, :contact_email, :theme, | |
13 | + :reports_lower_bound, :noreply_email, | |
14 | + :signup_welcome_screen_body, :members_whitelist_enabled, | |
15 | + :members_whitelist, :highlighted_news_amount, | |
16 | + :portal_news_amount, :date_format | |
7 | 17 | |
8 | 18 | has_many :users |
9 | 19 | |
... | ... | @@ -14,11 +24,19 @@ class Environment < ActiveRecord::Base |
14 | 24 | |
15 | 25 | IDENTIFY_SCRIPTS = /(php[0-9s]?|[sp]htm[l]?|pl|py|cgi|rb)/ |
16 | 26 | |
27 | + validates_inclusion_of :date_format, | |
28 | + :in => [ 'numbers_with_year', 'numbers', | |
29 | + 'month_name_with_year', 'month_name', | |
30 | + 'past_time'], | |
31 | + :if => :date_format | |
32 | + | |
17 | 33 | def self.verify_filename(filename) |
18 | 34 | filename += '.txt' if File.extname(filename) =~ IDENTIFY_SCRIPTS |
19 | 35 | filename |
20 | 36 | end |
21 | 37 | |
38 | + NUMBER_OF_BOXES = 4 | |
39 | + | |
22 | 40 | PERMISSIONS['Environment'] = { |
23 | 41 | 'view_environment_admin_panel' => N_('View environment admin panel'), |
24 | 42 | 'edit_environment_features' => N_('Edit environment features'), |
... | ... | @@ -27,6 +45,7 @@ class Environment < ActiveRecord::Base |
27 | 45 | 'manage_environment_roles' => N_('Manage environment roles'), |
28 | 46 | 'manage_environment_validators' => N_('Manage environment validators'), |
29 | 47 | 'manage_environment_users' => N_('Manage environment users'), |
48 | + 'manage_environment_organizations' => N_('Manage environment organizations'), | |
30 | 49 | 'manage_environment_templates' => N_('Manage environment templates'), |
31 | 50 | 'manage_environment_licenses' => N_('Manage environment licenses'), |
32 | 51 | 'manage_environment_trusted_sites' => N_('Manage environment trusted sites'), |
... | ... | @@ -72,7 +91,8 @@ class Environment < ActiveRecord::Base |
72 | 91 | 'edit_profile_design', |
73 | 92 | 'manage_products', |
74 | 93 | 'manage_friends', |
75 | - 'perform_task' | |
94 | + 'perform_task', | |
95 | + 'view_tasks' | |
76 | 96 | ] |
77 | 97 | ) |
78 | 98 | end |
... | ... | @@ -172,7 +192,7 @@ class Environment < ActiveRecord::Base |
172 | 192 | acts_as_having_boxes |
173 | 193 | |
174 | 194 | after_create do |env| |
175 | - 3.times do | |
195 | + NUMBER_OF_BOXES.times do | |
176 | 196 | env.boxes << Box.new |
177 | 197 | end |
178 | 198 | |
... | ... | @@ -337,6 +357,16 @@ class Environment < ActiveRecord::Base |
337 | 357 | self.save! |
338 | 358 | end |
339 | 359 | |
360 | + def enable_all_plugins | |
361 | + Noosfero::Plugin.available_plugin_names.each do |plugin| | |
362 | + plugin_name = plugin.to_s + "Plugin" | |
363 | + unless self.enabled_plugins.include?(plugin_name) | |
364 | + self.enabled_plugins += [plugin_name] | |
365 | + end | |
366 | + end | |
367 | + self.save! | |
368 | + end | |
369 | + | |
340 | 370 | # Disables a feature identified by its name |
341 | 371 | def disable(feature, must_save=true) |
342 | 372 | self.settings["#{feature}_enabled".to_sym] = false |
... | ... | @@ -737,8 +767,8 @@ class Environment < ActiveRecord::Base |
737 | 767 | end |
738 | 768 | |
739 | 769 | def is_default_template?(template) |
740 | - is_default = template == community_default_template | |
741 | - is_default = is_default || template == person_default_template | |
770 | + is_default = template == community_default_template | |
771 | + is_default = is_default || template == person_default_template | |
742 | 772 | is_default = is_default || template == enterprise_default_template |
743 | 773 | is_default |
744 | 774 | end | ... | ... |
app/models/forum.rb
... | ... | @@ -3,11 +3,11 @@ class Forum < Folder |
3 | 3 | acts_as_having_posts :order => 'updated_at DESC' |
4 | 4 | include PostsLimit |
5 | 5 | |
6 | - attr_accessible :has_terms_of_use, :terms_of_use, :allows_members_to_create_topics | |
6 | + attr_accessible :has_terms_of_use, :terms_of_use, :topic_creation | |
7 | 7 | |
8 | 8 | settings_items :terms_of_use, :type => :string, :default => "" |
9 | 9 | settings_items :has_terms_of_use, :type => :boolean, :default => false |
10 | - settings_items :allows_members_to_create_topics, :type => :boolean, :default => false | |
10 | + settings_items :topic_creation, :type => :string, :default => 'self' | |
11 | 11 | has_and_belongs_to_many :users_with_agreement, :class_name => 'Person', :join_table => 'terms_forum_people' |
12 | 12 | |
13 | 13 | before_save do |forum| |
... | ... | @@ -33,6 +33,23 @@ class Forum < Folder |
33 | 33 | _('An internet forum, also called message board, where discussions can be held.') |
34 | 34 | end |
35 | 35 | |
36 | + module TopicCreation | |
37 | + BASE = ActiveSupport::OrderedHash.new | |
38 | + BASE['users'] = _('Logged users') | |
39 | + | |
40 | + PERSON = ActiveSupport::OrderedHash.new | |
41 | + PERSON['self'] = _('Me') | |
42 | + PERSON['related'] = _('Friends') | |
43 | + | |
44 | + GROUP = ActiveSupport::OrderedHash.new | |
45 | + GROUP['self'] = _('Administrators') | |
46 | + GROUP['related'] = _('Members') | |
47 | + | |
48 | + def self.general_options(forum) | |
49 | + forum.profile.person? ? PERSON.merge(BASE) : GROUP.merge(BASE) | |
50 | + end | |
51 | + end | |
52 | + | |
36 | 53 | include ActionView::Helpers::TagHelper |
37 | 54 | def to_html(options = {}) |
38 | 55 | proc do |
... | ... | @@ -69,11 +86,17 @@ class Forum < Folder |
69 | 86 | self.users_with_agreement.exists? user |
70 | 87 | end |
71 | 88 | |
72 | - def can_create_topic?(user, profile) | |
73 | - return profile.community? && profile.members.include?(user) && self.allows_members_to_create_topics | |
89 | + def can_create_topic?(user) | |
90 | + return true if user == profile || profile.admins.include?(user) || profile.environment.admins.include?(user) | |
91 | + case topic_creation | |
92 | + when 'related' | |
93 | + profile.person? ? profile.friends.include?(user) : profile.members.include?(user) | |
94 | + when 'users' | |
95 | + user.present? | |
96 | + end | |
74 | 97 | end |
75 | 98 | |
76 | 99 | def allow_create?(user) |
77 | - super || can_create_topic?(user, profile) | |
100 | + super || can_create_topic?(user) | |
78 | 101 | end |
79 | 102 | end | ... | ... |
app/models/highlights_block.rb
... | ... | @@ -26,8 +26,16 @@ class HighlightsBlock < Block |
26 | 26 | end |
27 | 27 | |
28 | 28 | def featured_images |
29 | - block_images = images.select{|i| !i[:image_src].nil? }.sort { |x, y| x[:position] <=> y[:position] } | |
30 | - shuffle ? block_images.shuffle : block_images | |
29 | + images = get_images | |
30 | + shuffle ? images.shuffle : images | |
31 | + end | |
32 | + | |
33 | + def get_images | |
34 | + images.select do |i| | |
35 | + !i[:image_src].nil? | |
36 | + end.sort do |x, y| | |
37 | + x[:position] <=> y[:position] | |
38 | + end | |
31 | 39 | end |
32 | 40 | |
33 | 41 | def content(args={}) | ... | ... |
app/models/organization.rb
... | ... | @@ -29,6 +29,8 @@ class Organization < Profile |
29 | 29 | |
30 | 30 | has_many :mailings, :class_name => 'OrganizationMailing', :foreign_key => :source_id, :as => 'source' |
31 | 31 | |
32 | + has_many :custom_roles, :class_name => 'Role', :foreign_key => :profile_id | |
33 | + | |
32 | 34 | scope :more_popular, :order => 'members_count DESC' |
33 | 35 | |
34 | 36 | validate :presence_of_required_fieds, :unless => :is_template | ... | ... |
app/models/person.rb
... | ... | @@ -84,9 +84,9 @@ roles] } |
84 | 84 | has_and_belongs_to_many :acepted_forums, :class_name => 'Forum', :join_table => 'terms_forum_people' |
85 | 85 | has_and_belongs_to_many :articles_with_access, :class_name => 'Article', :join_table => 'article_privacy_exceptions' |
86 | 86 | |
87 | - has_many :profile_suggestions, :foreign_key => :person_id, :order => 'score DESC', :dependent => :destroy | |
88 | - has_many :suggested_people, :through => :profile_suggestions, :source => :suggestion, :conditions => ['profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Person', true] | |
89 | - has_many :suggested_communities, :through => :profile_suggestions, :source => :suggestion, :conditions => ['profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Community', true] | |
87 | + has_many :suggested_profiles, :class_name => 'ProfileSuggestion', :foreign_key => :person_id, :order => 'score DESC', :dependent => :destroy | |
88 | + has_many :suggested_people, :through => :suggested_profiles, :source => :suggestion, :conditions => ['profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Person', true] | |
89 | + has_many :suggested_communities, :through => :suggested_profiles, :source => :suggestion, :conditions => ['profile_suggestions.suggestion_type = ? AND profile_suggestions.enabled = ?', 'Community', true] | |
90 | 90 | |
91 | 91 | scope :more_popular, :order => 'friends_count DESC' |
92 | 92 | |
... | ... | @@ -103,6 +103,8 @@ roles] } |
103 | 103 | |
104 | 104 | belongs_to :user, :dependent => :delete |
105 | 105 | |
106 | + acts_as_voter | |
107 | + | |
106 | 108 | def can_change_homepage? |
107 | 109 | !environment.enabled?('cant_change_homepage') || is_admin? |
108 | 110 | end |
... | ... | @@ -522,7 +524,7 @@ roles] } |
522 | 524 | end |
523 | 525 | |
524 | 526 | def remove_suggestion(profile) |
525 | - suggestion = profile_suggestions.find_by_suggestion_id profile.id | |
527 | + suggestion = suggested_profiles.find_by_suggestion_id profile.id | |
526 | 528 | suggestion.disable if suggestion |
527 | 529 | end |
528 | 530 | ... | ... |
app/models/product_category.rb
... | ... | @@ -10,6 +10,9 @@ class ProductCategory < Category |
10 | 10 | :joins => :products, |
11 | 11 | :conditions => ['products.profile_id = ?', enterprise.id] |
12 | 12 | }} |
13 | + scope :by_environment, lambda { |environment| { | |
14 | + :conditions => ['environment_id = ?', environment.id] | |
15 | + }} | |
13 | 16 | scope :unique_by_level, lambda { |level| { |
14 | 17 | :select => "DISTINCT ON (filtered_category) split_part(path, '/', #{level}) AS filtered_category, categories.*" |
15 | 18 | }} | ... | ... |
app/models/profile.rb
... | ... | @@ -22,6 +22,8 @@ class Profile < ActiveRecord::Base |
22 | 22 | :display => %w[compact] |
23 | 23 | } |
24 | 24 | |
25 | + NUMBER_OF_BOXES = 4 | |
26 | + | |
25 | 27 | def self.default_search_display |
26 | 28 | 'compact' |
27 | 29 | end |
... | ... | @@ -43,7 +45,7 @@ class Profile < ActiveRecord::Base |
43 | 45 | find_role('editor', env_id) |
44 | 46 | end |
45 | 47 | def self.organization_member_roles(env_id) |
46 | - all_roles(env_id).select{ |r| r.key.match(/^profile_/) unless r.key.blank? } | |
48 | + all_roles(env_id).select{ |r| r.key.match(/^profile_/) unless r.key.blank? || !r.profile_id.nil?} | |
47 | 49 | end |
48 | 50 | def self.all_roles(env_id) |
49 | 51 | Role.all :conditions => { :environment_id => env_id } |
... | ... | @@ -69,12 +71,14 @@ class Profile < ActiveRecord::Base |
69 | 71 | 'manage_friends' => N_('Manage friends'), |
70 | 72 | 'validate_enterprise' => N_('Validate enterprise'), |
71 | 73 | 'perform_task' => N_('Perform task'), |
74 | + 'view_tasks' => N_('View tasks'), | |
72 | 75 | 'moderate_comments' => N_('Moderate comments'), |
73 | 76 | 'edit_appearance' => N_('Edit appearance'), |
74 | 77 | 'view_private_content' => N_('View private content'), |
75 | 78 | 'publish_content' => N_('Publish content'), |
76 | 79 | 'invite_members' => N_('Invite members'), |
77 | 80 | 'send_mail_to_members' => N_('Send e-Mail to members'), |
81 | + 'manage_custom_roles' => N_('Manage custom roles'), | |
78 | 82 | } |
79 | 83 | |
80 | 84 | acts_as_accessible |
... | ... | @@ -317,16 +321,25 @@ class Profile < ActiveRecord::Base |
317 | 321 | @top_level_articles ||= Article.top_level_for(self) |
318 | 322 | end |
319 | 323 | |
320 | - def self.is_available?(identifier, environment) | |
321 | - !(identifier =~ IDENTIFIER_FORMAT).nil? && !RESERVED_IDENTIFIERS.include?(identifier) && Profile.find(:first, :conditions => ['environment_id = ? and identifier = ?', environment.id, identifier]).nil? | |
324 | + def self.is_available?(identifier, environment, profile_id=nil) | |
325 | + return false unless identifier =~ IDENTIFIER_FORMAT && | |
326 | + !RESERVED_IDENTIFIERS.include?(identifier) && | |
327 | + (NOOSFERO_CONF['exclude_profile_identifier_pattern'].blank? || identifier !~ /#{NOOSFERO_CONF['exclude_profile_identifier_pattern']}/) | |
328 | + return true if environment.nil? | |
329 | + | |
330 | + profiles = environment.profiles.where(:identifier => identifier) | |
331 | + profiles = profiles.where(['id != ?', profile_id]) if profile_id.present? | |
332 | + !profiles.exists? | |
322 | 333 | end |
323 | 334 | |
324 | 335 | validates_presence_of :identifier, :name |
325 | - validates_format_of :identifier, :with => IDENTIFIER_FORMAT, :if => lambda { |profile| !profile.identifier.blank? } | |
326 | - validates_exclusion_of :identifier, :in => RESERVED_IDENTIFIERS | |
327 | - validates_uniqueness_of :identifier, :scope => :environment_id | |
328 | 336 | validates_length_of :nickname, :maximum => 16, :allow_nil => true |
329 | 337 | validate :valid_template |
338 | + validate :valid_identifier | |
339 | + | |
340 | + def valid_identifier | |
341 | + errors.add(:identifier, _('is not available.')) unless Profile.is_available?(identifier, environment, id) | |
342 | + end | |
330 | 343 | |
331 | 344 | def valid_template |
332 | 345 | if template_id.present? && template && !template.is_template |
... | ... | @@ -352,7 +365,7 @@ class Profile < ActiveRecord::Base |
352 | 365 | if template |
353 | 366 | apply_template(template, :copy_articles => false) |
354 | 367 | else |
355 | - 3.times do | |
368 | + NUMBER_OF_BOXES.times do | |
356 | 369 | self.boxes << Box.new |
357 | 370 | end |
358 | 371 | |
... | ... | @@ -380,6 +393,9 @@ class Profile < ActiveRecord::Base |
380 | 393 | new_block = block.class.new(:title => block[:title]) |
381 | 394 | new_block.copy_from(block) |
382 | 395 | new_box.blocks << new_block |
396 | + if block.mirror? | |
397 | + block.add_observer(new_block) | |
398 | + end | |
383 | 399 | end |
384 | 400 | end |
385 | 401 | end |
... | ... | @@ -395,6 +411,7 @@ class Profile < ActiveRecord::Base |
395 | 411 | alias_method_chain :template, :default |
396 | 412 | |
397 | 413 | def apply_template(template, options = {:copy_articles => true}) |
414 | + self.template = template | |
398 | 415 | copy_blocks_from(template) |
399 | 416 | copy_articles_from(template) if options[:copy_articles] |
400 | 417 | self.apply_type_specific_template(template) |
... | ... | @@ -1008,7 +1025,7 @@ private :generate_url, :url_options |
1008 | 1025 | end |
1009 | 1026 | |
1010 | 1027 | def remove_from_suggestion_list(person) |
1011 | - suggestion = person.profile_suggestions.find_by_suggestion_id self.id | |
1028 | + suggestion = person.suggested_profiles.find_by_suggestion_id self.id | |
1012 | 1029 | suggestion.disable if suggestion |
1013 | 1030 | end |
1014 | 1031 | ... | ... |
app/models/profile_suggestion.rb
... | ... | @@ -113,14 +113,14 @@ class ProfileSuggestion < ActiveRecord::Base |
113 | 113 | suggested_profiles = all_suggestions(person) |
114 | 114 | return if suggested_profiles.nil? |
115 | 115 | |
116 | - already_suggested_profiles = person.profile_suggestions.map(&:suggestion_id).join(',') | |
116 | + already_suggested_profiles = person.suggested_profiles.map(&:suggestion_id).join(',') | |
117 | 117 | suggested_profiles = suggested_profiles.where("profiles.id NOT IN (#{already_suggested_profiles})") if already_suggested_profiles.present? |
118 | 118 | #TODO suggested_profiles = suggested_profiles.order('score DESC') |
119 | 119 | suggested_profiles = suggested_profiles.limit(N_SUGGESTIONS) |
120 | 120 | return if suggested_profiles.blank? |
121 | 121 | |
122 | 122 | suggested_profiles.each do |suggested_profile| |
123 | - suggestion = person.profile_suggestions.find_or_initialize_by_suggestion_id(suggested_profile.id) | |
123 | + suggestion = person.suggested_profiles.find_or_initialize_by_suggestion_id(suggested_profile.id) | |
124 | 124 | RULES.each do |rule, options| |
125 | 125 | begin |
126 | 126 | value = suggested_profile.send("#{rule}_count").to_i |
... | ... | @@ -273,7 +273,7 @@ class ProfileSuggestion < ActiveRecord::Base |
273 | 273 | end |
274 | 274 | |
275 | 275 | def self.generate_profile_suggestions(person, force = false) |
276 | - return if person.profile_suggestions.enabled.count >= MIN_LIMIT && !force | |
276 | + return if person.suggested_profiles.enabled.count >= MIN_LIMIT && !force | |
277 | 277 | Delayed::Job.enqueue ProfileSuggestionsJob.new(person.id) unless ProfileSuggestionsJob.exists?(person.id) |
278 | 278 | end |
279 | 279 | ... | ... |
app/models/suggest_article.rb
1 | 1 | class SuggestArticle < Task |
2 | 2 | |
3 | - validates_presence_of :target_id, :article_name, :email, :name, :article_body | |
3 | + validates_presence_of :target_id | |
4 | + validates_presence_of :email, :name, :if => Proc.new { |task| task.requestor.blank? } | |
5 | + validates_associated :article_object | |
4 | 6 | |
5 | 7 | settings_items :email, :type => String |
6 | 8 | settings_items :name, :type => String |
7 | - settings_items :article_name, :type => String | |
8 | - settings_items :article_body, :type => String | |
9 | - settings_items :article_abstract, :type => String | |
10 | - settings_items :article_parent_id, :type => String | |
11 | - settings_items :source, :type => String | |
12 | - settings_items :source_name, :type => String | |
13 | - settings_items :highlighted, :type => :boolean, :default => false | |
14 | 9 | settings_items :ip_address, :type => String |
15 | 10 | settings_items :user_agent, :type => String |
16 | 11 | settings_items :referrer, :type => String |
12 | + settings_items :article, :type => Hash, :default => {} | |
17 | 13 | |
18 | 14 | after_create :schedule_spam_checking |
19 | 15 | |
... | ... | @@ -24,34 +20,49 @@ class SuggestArticle < Task |
24 | 20 | include Noosfero::Plugin::HotSpot |
25 | 21 | |
26 | 22 | def sender |
27 | - "#{name} (#{email})" | |
23 | + requestor ? "#{requestor.name}" : "#{name} (#{email})" | |
24 | + end | |
25 | + | |
26 | + def article_object | |
27 | + if @article_object.nil? | |
28 | + @article_object = article_type.new(article.merge(target.present? ? {:profile => target} : {}).except(:type)) | |
29 | + if requestor.present? | |
30 | + @article_object.author = requestor | |
31 | + else | |
32 | + @article_object.author_name = name | |
33 | + end | |
34 | + end | |
35 | + @article_object | |
36 | + end | |
37 | + | |
38 | + def article_type | |
39 | + if article[:type].present? | |
40 | + type = article[:type].constantize | |
41 | + return type if type < Article | |
42 | + end | |
43 | + TinyMceArticle | |
28 | 44 | end |
29 | 45 | |
30 | 46 | def perform |
31 | - task = TinyMceArticle.new | |
32 | - task.profile = target | |
33 | - task.name = article_name | |
34 | - task.author_name = name | |
35 | - task.body = article_body | |
36 | - task.abstract = article_abstract | |
37 | - task.parent_id = article_parent_id | |
38 | - task.source = source | |
39 | - task.source_name = source_name | |
40 | - task.highlighted = highlighted | |
41 | - task.save! | |
47 | + article_object.save! | |
42 | 48 | end |
43 | 49 | |
44 | 50 | def title |
45 | 51 | _("Article suggestion") |
46 | 52 | end |
47 | 53 | |
54 | + def article_name | |
55 | + article[:name] | |
56 | + end | |
57 | + | |
48 | 58 | def subject |
49 | 59 | article_name |
50 | 60 | end |
51 | 61 | |
52 | 62 | def information |
53 | - { :message => _('%{sender} suggested the publication of the article: %{subject}.'), | |
54 | - :variables => {:sender => sender} } | |
63 | + variables = requestor.blank? ? {:requestor => sender} : {} | |
64 | + { :message => _('%{requestor} suggested the publication of the article: %{subject}.'), | |
65 | + :variables => variables } | |
55 | 66 | end |
56 | 67 | |
57 | 68 | def accept_details |
... | ... | @@ -63,8 +74,8 @@ class SuggestArticle < Task |
63 | 74 | end |
64 | 75 | |
65 | 76 | def target_notification_description |
66 | - _('%{sender} suggested the publication of the article: %{article}.') % | |
67 | - {:sender => sender, :article => article_name} | |
77 | + _('%{requestor} suggested the publication of the article: %{article}.') % | |
78 | + {:requestor => sender, :article => article_name} | |
68 | 79 | end |
69 | 80 | |
70 | 81 | def target_notification_message | ... | ... |
app/models/task.rb
... | ... | @@ -33,6 +33,8 @@ class Task < ActiveRecord::Base |
33 | 33 | |
34 | 34 | belongs_to :requestor, :class_name => 'Profile', :foreign_key => :requestor_id |
35 | 35 | belongs_to :target, :foreign_key => :target_id, :polymorphic => true |
36 | + belongs_to :responsible, :class_name => 'Person', :foreign_key => :responsible_id | |
37 | + belongs_to :closed_by, :class_name => 'Person', :foreign_key => :closed_by_id | |
36 | 38 | |
37 | 39 | validates_uniqueness_of :code, :on => :create |
38 | 40 | validates_presence_of :code |
... | ... | @@ -76,11 +78,9 @@ class Task < ActiveRecord::Base |
76 | 78 | # this method finished the task. It calls #perform, which must be overriden |
77 | 79 | # by subclasses. At the end a message (as returned by #finish_message) is |
78 | 80 | # sent to the requestor with #notify_requestor. |
79 | - def finish | |
81 | + def finish(closed_by=nil) | |
80 | 82 | transaction do |
81 | - self.status = Task::Status::FINISHED | |
82 | - self.end_date = Time.now | |
83 | - self.save! | |
83 | + close(Task::Status::FINISHED, closed_by) | |
84 | 84 | self.perform |
85 | 85 | begin |
86 | 86 | send_notification(:finished) |
... | ... | @@ -105,11 +105,9 @@ class Task < ActiveRecord::Base |
105 | 105 | |
106 | 106 | # this method cancels the task. At the end a message (as returned by |
107 | 107 | # #cancel_message) is sent to the requestor with #notify_requestor. |
108 | - def cancel | |
108 | + def cancel(closed_by=nil) | |
109 | 109 | transaction do |
110 | - self.status = Task::Status::CANCELLED | |
111 | - self.end_date = Time.now | |
112 | - self.save! | |
110 | + close(Task::Status::CANCELLED, closed_by) | |
113 | 111 | begin |
114 | 112 | send_notification(:cancelled) |
115 | 113 | rescue NotImplementedError => ex |
... | ... | @@ -118,6 +116,13 @@ class Task < ActiveRecord::Base |
118 | 116 | end |
119 | 117 | end |
120 | 118 | |
119 | + def close(status, closed_by) | |
120 | + self.status = status | |
121 | + self.end_date = Time.now | |
122 | + self.closed_by = closed_by | |
123 | + self.save! | |
124 | + end | |
125 | + | |
121 | 126 | # Here are the tasks customizable options. |
122 | 127 | |
123 | 128 | def title |
... | ... | @@ -239,6 +244,10 @@ class Task < ActiveRecord::Base |
239 | 244 | scope :opened, :conditions => { :status => [Task::Status::ACTIVE, Task::Status::HIDDEN] } |
240 | 245 | scope :of, lambda { |type| conditions = type ? "type LIKE '#{type}'" : "1=1"; {:conditions => [conditions]} } |
241 | 246 | scope :order_by, lambda { |attribute, ord| {:order => "#{attribute} #{ord}"} } |
247 | + scope :like, lambda { |field, value| where("LOWER(#{field}) LIKE ?", "%#{value.downcase}%") if value} | |
248 | + scope :pending_all, lambda { |profile, filter_type, filter_text| | |
249 | + self.to(profile).without_spam.pending.of(filter_type).like('data', filter_text) | |
250 | + } | |
242 | 251 | |
243 | 252 | scope :to, lambda { |profile| |
244 | 253 | environment_condition = nil | ... | ... |
app/models/uploaded_file.rb
1 | -require 'short_filename' | |
2 | - | |
3 | 1 | # Article type that handles uploaded files. |
4 | 2 | # |
5 | 3 | # Limitation: only file metadata are versioned. Only the latest version |
... | ... | @@ -14,8 +12,6 @@ class UploadedFile < Article |
14 | 12 | |
15 | 13 | track_actions :upload_image, :after_create, :keep_params => ["view_url", "thumbnail_path", "parent.url", "parent.name"], :if => Proc.new { |a| a.published? && a.image? && !a.parent.nil? && a.parent.gallery? }, :custom_target => :parent |
16 | 14 | |
17 | - include ShortFilename | |
18 | - | |
19 | 15 | def title |
20 | 16 | if self.name.present? then self.name else self.filename end |
21 | 17 | end |
... | ... | @@ -65,7 +61,7 @@ class UploadedFile < Article |
65 | 61 | # :min_size => 2.megabytes |
66 | 62 | # :max_size => 5.megabytes |
67 | 63 | has_attachment :storage => :file_system, |
68 | - :thumbnails => { :icon => [24,24], :thumb => '130x130>', :slideshow => '320x240>', :display => '640X480>' }, | |
64 | + :thumbnails => { :icon => [24,24], :bigicon => [50,50], :thumb => '130x130>', :slideshow => '320x240>', :display => '640X480>' }, | |
69 | 65 | :thumbnail_class => Thumbnail, |
70 | 66 | :max_size => self.max_size |
71 | 67 | ... | ... |
app/models/user.rb
... | ... | @@ -45,7 +45,7 @@ class User < ActiveRecord::Base |
45 | 45 | p = Person.new |
46 | 46 | |
47 | 47 | p.attributes = user.person_data |
48 | - p.identifier = user.login | |
48 | + p.identifier = user.login if p.identifier.blank? | |
49 | 49 | p.user = user |
50 | 50 | p.environment = user.environment |
51 | 51 | p.name ||= user.name || user.login | ... | ... |
app/presenters/image.rb
app/views/admin_panel/_site_info.html.erb
... | ... | @@ -3,6 +3,21 @@ |
3 | 3 | <%= labelled_form_field(_('No reply email'), text_field(:environment, :noreply_email)) %> |
4 | 4 | <% themes_options = Theme.system_themes.map {|theme| [theme.name, theme.id] }.sort %> |
5 | 5 | <%= labelled_form_field(_('Theme'), select(:environment, :theme, options_for_select(themes_options, environment.theme))) %> |
6 | + | |
7 | +<%= labelled_form_field( | |
8 | + _("Article's date format"), | |
9 | + select(:environment, :date_format, | |
10 | + options_for_select([ | |
11 | + [ _('mm/dd/yyyy'), 'numbers_with_year'], | |
12 | + [ _('mm/dd'), 'numbers'], | |
13 | + [ _('Month dd, yyyy'), 'month_name_with_year'], | |
14 | + [ _('Month dd'), 'month_name'], | |
15 | + [ _('X minutes/hours/days/months/years ago'), 'past_time'] | |
16 | + ], environment.date_format | |
17 | + ) | |
18 | + ) | |
19 | +) %> | |
20 | + | |
6 | 21 | <%= required f.text_field(:reports_lower_bound, :size => 3) %> |
7 | 22 | <%= labelled_form_field(_('Default language'), select(:environment, :default_language, environment.locales.invert, { :selected => environment.default_locale, :include_blank => true })) %> |
8 | 23 | <%= label_tag :languages, _('Available languages') %> | ... | ... |
app/views/admin_panel/index.html.erb
... | ... | @@ -18,9 +18,9 @@ |
18 | 18 | <table> |
19 | 19 | <tr><td><%= link_to _('User roles'), :controller => 'role' %></td></tr> |
20 | 20 | <tr><td><%= link_to _('Users'), :controller => 'users' %></td></tr> |
21 | + <tr><td><%= link_to _('Organizations'), :controller => 'organizations' %></td></tr> | |
21 | 22 | <tr><td><%= link_to _('Profile templates'), :controller => 'templates' %></td></tr> |
22 | 23 | <tr><td><%= link_to _('Fields'), :controller => 'features', :action => 'manage_fields' %></td></tr> |
23 | - <tr><td><%= link_to _('Manage organizations status'), :action => 'manage_organizations_status' %></td></tr> | |
24 | 24 | </table> |
25 | 25 | |
26 | 26 | ... | ... |
app/views/admin_panel/manage_organizations_status.html.erb
... | ... | @@ -1,69 +0,0 @@ |
1 | -<h1><%= _('Manage organizations') %></h1> | |
2 | - | |
3 | -<%= form_tag( { :action => 'manage_organizations_status' }, :method => 'get', :class => 'users-search' ) do %> | |
4 | - | |
5 | - <div class="search-field"> | |
6 | - <span class="formfield"> | |
7 | - <%= text_field_tag 'q', @q, :title => _("Find profiles"), :style=>"width:85%" %> | |
8 | - </span> | |
9 | - | |
10 | - <%= submit_button(:search, _('Search')) %> | |
11 | - </div> | |
12 | - | |
13 | - <div class="environment-users-results-header"> | |
14 | - <div id='environment-users-filter-title'><%= @title %></div> | |
15 | - | |
16 | - <div id="environment-users-filter-filter"> | |
17 | - <strong><%= _("Filter by: ") %></strong> | |
18 | - | |
19 | - <select id="profile_filter_select"> | |
20 | - <%= options_for_select([['Any', 'any'],["Disabled profiles", "disabled"], ["Enabled profiles", "enabled"]], @filter) %> | |
21 | - </select> | |
22 | - </div> | |
23 | - <div style="clear: both"></div> | |
24 | - </div> | |
25 | - | |
26 | - <table> | |
27 | - <colgroup> | |
28 | - <col width="80%"> | |
29 | - <col width="20%"> | |
30 | - </colgroup> | |
31 | - | |
32 | - <tr> | |
33 | - <th><%= _('Member') %></th> | |
34 | - <th><%= _('Actions') %></th> | |
35 | - </tr> | |
36 | - | |
37 | - <% @collection.each do |p| %> | |
38 | - <tr title="<%= p.name %>"> | |
39 | - <td><%= link_to_profile p.short_name, p.identifier, :title => p.name %> </td> | |
40 | - | |
41 | - <td class='actions'> | |
42 | - <div class="members-buttons-cell"> | |
43 | - <% if p.visible %> | |
44 | - <%= button_without_text :'deactivate-user', _('Deactivate'), {:controller => "profile_editor", :action => 'deactivate_profile', :profile => p.identifier, :id => p.id}, :confirm => _("Do you want to deactivate this profile ?") %> | |
45 | - <% else %> | |
46 | - <%= button_without_text :'activate-user', _('Activate'), {:controller => "profile_editor", :action => 'activate_profile', :profile => p.identifier, :id => p.id}, :confirm => _("Do you want to activate this profile ?") %> | |
47 | - <% end %> | |
48 | - <%= button_without_text :'delete', _('Remove'), {:controller => "profile_editor", :action => 'destroy_profile', :profile => p.identifier, :id => p.id, :return_to => "/admin/admin_panel/manage_organizations_status"}, :method => :post, :confirm => _("Do you want to deactivate this profile ?") %> | |
49 | - </div> | |
50 | - </td> | |
51 | - </tr> | |
52 | - <% end %> | |
53 | - </table> | |
54 | - | |
55 | -<% end %> | |
56 | - | |
57 | -<%= pagination_links @collection, {:param_name => 'npage', :page_links => true} %> | |
58 | - | |
59 | -<% button_bar do %> | |
60 | - <%= button :back, _('Back'), :controller => 'admin_panel' %> | |
61 | -<% end %> | |
62 | - | |
63 | -<script type="text/javascript"> | |
64 | - jQuery(document).ready(function(){ | |
65 | - jQuery("#profile_filter_select").change(function(){ | |
66 | - document.location.href = '/admin/admin_panel/manage_organizations_status?filter='+this.value; | |
67 | - }); | |
68 | - }); | |
69 | -</script> | |
70 | 0 | \ No newline at end of file |
app/views/blocks/profile_info_actions/_community.html.erb
app/views/blocks/profile_info_actions/_enterprise.html.erb
... | ... | @@ -8,5 +8,5 @@ |
8 | 8 | <li><%= button(:'menu-mail', _('Send an e-mail'), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}, {:id => 'enterprise-contact-button'} ) %></li> |
9 | 9 | <% end %> |
10 | 10 | |
11 | - <li><%= report_abuse(profile, :button) %></li> | |
11 | + <%= render :partial => 'blocks/profile_info_actions/common' %> | |
12 | 12 | </ul> | ... | ... |
app/views/blocks/profile_info_actions/_join_leave_community.html.erb
app/views/blocks/profile_info_actions/_person.html.erb
... | ... | @@ -11,6 +11,6 @@ |
11 | 11 | <li><%= button(:back, _('Send an e-mail'), {:profile => profile.identifier, :controller => 'contact', :action => 'new'}) %></li> |
12 | 12 | <% end %> |
13 | 13 | |
14 | - <li><%= report_abuse(profile, :button) %></li> | |
14 | + <%= render :partial => 'blocks/profile_info_actions/common' %> | |
15 | 15 | <% end %> |
16 | 16 | </ul> | ... | ... |
app/views/box_organizer/edit.html.erb
... | ... | @@ -5,12 +5,6 @@ |
5 | 5 | |
6 | 6 | <%= labelled_form_field(_('Custom title for this block: '), text_field(:block, :title, :maxlength => 20)) %> |
7 | 7 | |
8 | - <% if environment.admins.include?(user) %> | |
9 | - <div class="fixed_block"> | |
10 | - <%= labelled_check_box(_("Fixed"), "block[fixed]", value = "1", checked = @block.fixed) %> | |
11 | - </div> | |
12 | - <% end %> | |
13 | - | |
14 | 8 | <%= render :partial => partial_for_class(@block.class) %> |
15 | 9 | |
16 | 10 | <div class="display"> |
... | ... | @@ -25,6 +19,21 @@ |
25 | 19 | |
26 | 20 | <%= labelled_form_field(_('Show for:'), select(:block, :language, [ [ _('all languages'), 'all']] + environment.locales.map {|key, value| [value, key]} )) %> |
27 | 21 | |
22 | + <% if user.is_admin? %> | |
23 | + <div class="edit-modes"> | |
24 | + <%= labelled_form_field _('Edit options:'), select_tag('block[edit_modes]', options_from_collection_for_select(@block.edit_block_options, :first, :last, @block.edit_modes)) %> | |
25 | + </div> | |
26 | + <div class="move-modes"> | |
27 | + <%= labelled_form_field _('Move options:'), select_tag('block[move_modes]', options_from_collection_for_select(@block.move_block_options, :first, :last, @block.move_modes)) %> | |
28 | + </div> | |
29 | + <% end %> | |
30 | + | |
31 | + <% if @block.owner.kind_of?(Profile) && @block.owner.is_template? %> | |
32 | + <div class="mirror_block"> | |
33 | + <%= labelled_check_box(_("Mirror"), "block[mirror]", value = "1", checked = @block.mirror) %> | |
34 | + </div> | |
35 | + <% end %> | |
36 | + | |
28 | 37 | <% button_bar do %> |
29 | 38 | <%= submit_button(:save, _('Save')) %> |
30 | 39 | <%= modal_close_button(_('Cancel')) %> | ... | ... |
app/views/chat/start_session_error.html.erb
1 | 1 | <p> |
2 | 2 | <%= ui_icon('ui-icon-alert') %> |
3 | -<%= _('Could not connect to chat') %>, <a id='chat-retry' href='#' data-jid='<%= user.jid %>'><%= _('try again') %></a>. | |
3 | +<%= _('Could not connect to chat') %>, <a id='chat-retry' href='' data-jid='<%= user.jid %>'><%= _('try again') %></a>. | |
4 | 4 | </p> | ... | ... |
app/views/cms/_blog.html.erb
... | ... | @@ -64,7 +64,12 @@ |
64 | 64 | <%= labelled_check_box(_('Remove cover image'),'remove_image',true,false)%> |
65 | 65 | <% end %> |
66 | 66 | |
67 | -<%= labelled_form_field(_('How to display posts:'), f.select(:visualization_format, [ [ _('Full post'), 'full'], [ _('First paragraph'), 'short'] ])) %> | |
67 | +<%= labelled_form_field(_('How to display posts:'), f.select(:visualization_format, [ | |
68 | + [ _('Full post'), 'full'], | |
69 | + [ _('First paragraph'), 'short'], | |
70 | + [ _('First paragraph, with post picture'), 'short+pic'], | |
71 | + [ _("Title, Image, Lead"), 'compact'] | |
72 | +])) %> | |
68 | 73 | |
69 | 74 | <%= labelled_form_field(_('Posts per page:'), f.select(:posts_per_page, Blog.posts_per_page_options)) %> |
70 | 75 | ... | ... |
app/views/cms/_forum.html.erb
... | ... | @@ -0,0 +1,29 @@ |
1 | +<% @articles.each do |article| article = FilePresenter.for article %> | |
2 | + <tr title="<%= article.title%>" > | |
3 | + <td class="article-name"> | |
4 | + <%= link_to_article(article) %> | |
5 | + </td> | |
6 | + <% short_description = article.respond_to?(:short_description) ? | |
7 | + article.short_description : | |
8 | + article.class.short_description %> | |
9 | + <td class="article-mime" title=<%= short_description.to_json %>> | |
10 | + <%= short_description %> | |
11 | + </td> | |
12 | + <td class="last-update"> | |
13 | + <%= time_ago_in_words article.updated_at %> | |
14 | + </td> | |
15 | + <td class="article-controls"> | |
16 | + <%= expirable_button article, :edit, _('Edit'), {:action => 'edit', :id => article.id} if !remove_content_button(:edit, article) %> | |
17 | + <%= button_without_text :eyes, _('Public view'), article.view_url %> | |
18 | + <%= display_spread_button(article) unless remove_content_button(:spread, article) %> | |
19 | + <% if user.can_change_homepage? && !remove_content_button(:home, article) %> | |
20 | + <% if profile.home_page != article %> | |
21 | + <%= expirable_button article, :home, _('Use as homepage'), { :action => 'set_home_page', :id => article.id }, :method => :post %> | |
22 | + <% else %> | |
23 | + <%= button_without_text(:'home-not', _('Reset homepage'), { :action => 'set_home_page', :id => nil }, :method => :post) %> | |
24 | + <% end %> | |
25 | + <% end %> | |
26 | + <%= display_delete_button(article) if !remove_content_button(:delete, article) %> | |
27 | + </td> | |
28 | + </tr> | |
29 | +<% end %> | ... | ... |
app/views/cms/suggest_an_article.html.erb
... | ... | @@ -6,21 +6,22 @@ |
6 | 6 | |
7 | 7 | <%= labelled_form_for 'task' do |f| %> |
8 | 8 | |
9 | - <%= required labelled_form_field(_('Title'), text_field(:task, 'article_name', :size => 50)) %> | |
9 | + <%= required labelled_form_field(_('Title'), text_field('task[article]', 'name', :size => 50)) %> | |
10 | 10 | |
11 | - <%= labelled_form_field(_('Source'), text_field(:task, 'source_name')) %> | |
11 | + <%= labelled_form_field(_('Source'), text_field('task[article]', 'source_name')) %> | |
12 | 12 | |
13 | - <%= labelled_form_field(_('Source URL'), text_field(:task, 'source')) %> | |
13 | + <%= labelled_form_field(_('Source URL'), text_field('task[article]', 'source')) %> | |
14 | 14 | |
15 | - <%= required labelled_form_field(_('Your name'), text_field(:task, 'name')) %> | |
16 | - | |
17 | - <%= required labelled_form_field(_('Email'), text_field(:task, 'email')) %> | |
15 | + <% unless logged_in? %> | |
16 | + <%= required labelled_form_field(_('Your name'), text_field(:task, 'name')) %> | |
17 | + <%= required labelled_form_field(_('Email'), text_field(:task, 'email')) %> | |
18 | + <% end %> | |
18 | 19 | |
19 | - <%= render :partial => 'shared/lead_and_body', :locals => {:tiny_mce => true, :object => :task, :abstract_method => 'article_abstract', :body_method => 'article_body'} %> | |
20 | + <%= render :partial => 'shared/lead_and_body', :locals => {:tiny_mce => true, :object => 'task[article]'} %> | |
20 | 21 | |
21 | 22 | <%= hidden_field_tag('back_to', @back_to) %> |
22 | 23 | |
23 | - <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) %> | |
24 | + <%= recaptcha_tags(:display => { :theme => 'clean' }, :ajax => true) unless logged_in? %> | |
24 | 25 | |
25 | 26 | <% button_bar do %> |
26 | 27 | <%= submit_button :save, _('Save') %> | ... | ... |
app/views/cms/view.html.erb
... | ... | @@ -37,6 +37,7 @@ |
37 | 37 | <tr> |
38 | 38 | <th><%= _('Name') %></th> |
39 | 39 | <th><%= _('Type') %></th> |
40 | + <th><%= _('Last update') %></th> | |
40 | 41 | <th><%= _('Actions') %></th> |
41 | 42 | </tr> |
42 | 43 | |
... | ... | @@ -54,32 +55,7 @@ |
54 | 55 | </tr> |
55 | 56 | <% end %> |
56 | 57 | |
57 | - <% @articles.each do |article| article = FilePresenter.for article %> | |
58 | - <tr title="<%= article.title%>" > | |
59 | - <td class="article-name"> | |
60 | - <%= link_to_article(article) %> | |
61 | - </td> | |
62 | - <% short_description = article.respond_to?(:short_description) ? | |
63 | - article.short_description : | |
64 | - article.class.short_description %> | |
65 | - <td class="article-mime" title=<%= short_description.to_json %>> | |
66 | - <%= short_description %> | |
67 | - </td> | |
68 | - <td class="article-controls"> | |
69 | - <%= expirable_button article, :edit, _('Edit'), {:action => 'edit', :id => article.id} if !remove_content_button(:edit, article) %> | |
70 | - <%= button_without_text :eyes, _('Public view'), article.view_url %> | |
71 | - <%= display_spread_button(article) unless remove_content_button(:spread, article) %> | |
72 | - <% if user.can_change_homepage? && !remove_content_button(:home, article) %> | |
73 | - <% if profile.home_page != article %> | |
74 | - <%= expirable_button article, :home, _('Use as homepage'), { :action => 'set_home_page', :id => article.id }, :method => :post %> | |
75 | - <% else %> | |
76 | - <%= button_without_text(:'home-not', _('Reset homepage'), { :action => 'set_home_page', :id => nil }, :method => :post) %> | |
77 | - <% end %> | |
78 | - <% end %> | |
79 | - <%= display_delete_button(article) if !remove_content_button(:delete, article) %> | |
80 | - </td> | |
81 | - </tr> | |
82 | - <% end %> | |
58 | + <%= render 'view_items' %> | |
83 | 59 | |
84 | 60 | </table> |
85 | 61 | ... | ... |
app/views/content_viewer/_article_toolbar.html.erb
1 | 1 | <div<%= user && " class='logged-in'" %>> |
2 | 2 | <div id="article-actions"> |
3 | 3 | |
4 | + <%= fullscreen_buttons('#article') %> | |
4 | 5 | |
5 | 6 | <% if @page.allow_edit?(user) && !remove_content_button(:edit, @page) %> |
6 | 7 | <% content = content_tag('span', label_for_edit_article(@page)) %> |
... | ... | @@ -29,6 +30,10 @@ |
29 | 30 | <% end %> |
30 | 31 | |
31 | 32 | <%= 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) %> |
33 | + | |
34 | + <% content = content_tag('span', label_for_clone_article(@page)) %> | |
35 | + <% url = profile.admin_url.merge({ :controller => 'cms', :action => 'new', :id => @page.id, :clone => true, :type => @page.class }) %> | |
36 | + <%= expirable_button @page, :clone, content, url %> | |
32 | 37 | <% end %> |
33 | 38 | |
34 | 39 | <% if @page.accept_uploads? && @page.allow_create?(user) %> |
... | ... | @@ -57,7 +62,7 @@ |
57 | 62 | <% if @page.blog? and !@page.image.nil? %> |
58 | 63 | <div class="blog-cover"><%= image_tag(@page.image.public_filename())%></div> |
59 | 64 | <% end %> |
60 | - <%= link_to(image_tag('icons-mime/rss-feed.png'), @page.feed.url, :class => 'blog-feed-link') if @page.has_posts? && @page.feed %> | |
65 | + <%= link_to(image_tag('/images/icons-mime/rss-feed.png'), @page.feed.url, :class => 'blog-feed-link') if @page.has_posts? && @page.feed %> | |
61 | 66 | <%= @plugins.dispatch(:article_header_extra_contents, @page).collect { |content| instance_exec(&content) }.join("") %> |
62 | 67 | <%= article_title(@page, :no_link => true) %> |
63 | 68 | <%= article_translations(@page) %> | ... | ... |
app/views/content_viewer/_display_compact_format.html.erb
0 → 100644
... | ... | @@ -0,0 +1,21 @@ |
1 | +<% if article.image %> | |
2 | + <% className = "article-compact-abstract-with-image" %> | |
3 | + <% if article.image.thumbnails_processed? %> | |
4 | + <% image_file = article.image.public_filename(:big) %> | |
5 | + <% else %> | |
6 | + <% image_file = "/images/icons-app/image-loading-thumb.png" %> | |
7 | + <% end %> | |
8 | +<% else %> | |
9 | + <% className = "article-compact-abstract" %> | |
10 | +<% end %> | |
11 | + | |
12 | +<div> | |
13 | + <% if article.image %> | |
14 | + <div class = "article-compact-image"> | |
15 | + <%= image_tag(image_file) %> | |
16 | + </div> | |
17 | + <% end %> | |
18 | + <div class = <%= className %> > | |
19 | + <%= article.abstract.truncate(400) %> | |
20 | + </div> | |
21 | +</div> | ... | ... |
app/views/content_viewer/blog_page.html.erb
... | ... | @@ -8,7 +8,7 @@ |
8 | 8 | </div> |
9 | 9 | </div> |
10 | 10 | <hr class="pre-posts"/> |
11 | -<div class="blog-posts"> | |
11 | +<div class="blog-posts page-<%= @npage %>"> | |
12 | 12 | <% paginate = true %> |
13 | 13 | <%= |
14 | 14 | posts = @posts |
... | ... | @@ -18,6 +18,9 @@ |
18 | 18 | format = inside_block.visualization_format |
19 | 19 | paginate = false |
20 | 20 | end |
21 | - (blog.empty? ? content_tag('em', _('(no posts)')) : list_posts(posts, format, paginate)) | |
21 | + (blog.empty? ? | |
22 | + content_tag('em', _('(no posts)')) : | |
23 | + list_posts(posts, format: format, paginate: paginate) | |
24 | + ) | |
22 | 25 | %> |
23 | 26 | </div> | ... | ... |
app/views/content_viewer/folder.html.erb
app/views/features/manage_fields.html.erb
1 | 1 | <h1><%= _('Manage fields displayed for profiles') %></h1> |
2 | 2 | |
3 | +<%= javascript_include_tag "manage-fields.js" %> | |
4 | + | |
3 | 5 | <% tabs = [] %> |
4 | 6 | <% tabs << {:title => _("Person's fields"), :id => 'person-fields', |
5 | 7 | :content => (render :partial => 'manage_person_fields')} %> |
... | ... | @@ -11,5 +13,3 @@ |
11 | 13 | <% end %> |
12 | 14 | |
13 | 15 | <%= render_tabs(tabs) %> |
14 | - | |
15 | -<%= javascript_include_tag "manage-fields.js" %> | ... | ... |
app/views/manage_products/_categories_autocomplete.html.erb
0 → 100644
... | ... | @@ -0,0 +1,8 @@ |
1 | +<%= text_field_tag 'product_category_id', '', :placeholder => _('type a category for the product') %> | |
2 | + | |
3 | +<%= javascript_include_tag '/javascripts/product_categories.js' %> | |
4 | +<% javascript_tag do %> | |
5 | + product_categories.autocomplete.search_url = <%= url_for(:controller => :manage_products, :action => :search_categories).to_json %> | |
6 | + product_categories.autocomplete.select_url = <%= url_for(:controller => :manage_products, :action => :show_category_tree).to_json %> | |
7 | + product_categories.autocomplete.load('#product_category_id') | |
8 | +<% end %> | ... | ... |
app/views/manage_products/_selected_category_tree.html.erb
0 → 100644
app/views/manage_products/edit_category.html.erb
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 | |
17 | 17 | <h3><%= _('Edit category of this product:') %></h3> |
18 | 18 | |
19 | - <%= categories_container(selects_for_all_ancestors(@category), hierarchy_category_navigation(@category, :make_links => true)) %> | |
19 | + <%= render 'manage_products/selected_category_tree' %> | |
20 | 20 | |
21 | 21 | <div id='categories_selection_actionbar'> |
22 | 22 | <%= button(:back, _('Back to product'), :action => 'show', :id => @product) %> | ... | ... |
... | ... | @@ -0,0 +1,41 @@ |
1 | +<div class='results'> | |
2 | + <table id='organizations-list'> | |
3 | + <colgroup> | |
4 | + <col width="60%"> | |
5 | + <col width="20%"> | |
6 | + <col width="20%"> | |
7 | + </colgroup> | |
8 | + | |
9 | + <tr> | |
10 | + <th><%= _('Profile') %></th> | |
11 | + <th><%= _('Actions') %></th> | |
12 | + <th><%= _('Type') %> | |
13 | + | |
14 | + <%= select_tag(:type, options_for_select(@types_filter, @type)) %> | |
15 | + </th> | |
16 | + </tr> | |
17 | + | |
18 | + <% @collection.each do |p| %> | |
19 | + <tr title="<%= p.name %>"> | |
20 | + <td><%= link_to_profile p.short_name, p.identifier, :title => p.name %> </td> | |
21 | + | |
22 | + <td class='actions'> | |
23 | + <div class="members-buttons-cell"> | |
24 | + <% if p.visible %> | |
25 | + <%= button_without_text :'deactivate-user', _('Deactivate'), {:action => 'deactivate', :id => p.id}, :class => 'action', 'data-confirm' => _("Do you want to deactivate this organization?") %> | |
26 | + <% else %> | |
27 | + <%= button_without_text :'activate-user', _('Activate'), {:action => 'activate', :id => p.id}, :class => 'action', 'data-confirm' => _("Do you want to activate this organization?") %> | |
28 | + <% end %> | |
29 | + <%= button_without_text :'delete', _('Remove'), {:action => 'destroy', :id => p.id}, :class => 'action', 'data-method' => :post, 'data-confirm' => _("Do you want to destroy this organization?") %> | |
30 | + </div> | |
31 | + </td> | |
32 | + | |
33 | + <td> <%= _("#{p.type}") %> </td> | |
34 | + </tr> | |
35 | + <% end %> | |
36 | + </table> | |
37 | + | |
38 | + <div> | |
39 | + <%= pagination_links @collection, {:param_name => 'npage', :page_links => true} %> | |
40 | + </div> | |
41 | +</div> | ... | ... |
... | ... | @@ -0,0 +1,30 @@ |
1 | +<h1><%= _('Organizations') %></h1> | |
2 | + | |
3 | +<%= form_tag( { :action => 'index' }, :method => 'get', :id => 'manage-profiles' ) do %> | |
4 | + | |
5 | + <div class="search-field"> | |
6 | + <span class="formfield"> | |
7 | + <%= text_field_tag 'q', @q, :title => _('Find organizations'), :style=>"width:85%" %> | |
8 | + </span> | |
9 | + | |
10 | + <%= submit_button(:search, _('Search')) %> | |
11 | + </div> | |
12 | + | |
13 | + <div class="environment-profiles-results-header"> | |
14 | + <div id='environment-profiles-filter-title'><%= @title %></div> | |
15 | + | |
16 | + <div id="environment-profiles-filter-filter"> | |
17 | + <strong><%= _("Filter by: ") %></strong> | |
18 | + <%= select_tag(:filter, options_for_select([[_('Any'), 'any'],[_('Disabled'), "disabled"], [_('Enabled') , "enabled"]], @filter)) %> | |
19 | + </div> | |
20 | + <div style="clear: both"></div> | |
21 | + </div> | |
22 | + | |
23 | + <%= render :partial => 'results' %> | |
24 | + | |
25 | + <% button_bar do %> | |
26 | + <%= button :back, _('Back'), :controller => 'admin_panel' %> | |
27 | + <% end %> | |
28 | +<% end %> | |
29 | + | |
30 | +<%= javascript_include_tag 'manage-organizations' %> | ... | ... |
app/views/person_notifier/mailer/_comment.html.erb
... | ... | @@ -19,7 +19,7 @@ |
19 | 19 | <span style="font-size: 12px;"><%= comment.title %></span><br/> |
20 | 20 | <% end %> |
21 | 21 | <span style="font-size: 10px;"><%= txt2html comment.body %></span><br/> |
22 | - <span style="font-size: 8px; color: #929292"><%= time_ago_as_sentence(comment.created_at) %></span> | |
22 | + <span style="font-size: 8px; color: #929292"><%= time_ago_in_words(comment.created_at) %></span> | |
23 | 23 | <br style="clear: both;" /> |
24 | 24 | |
25 | 25 | <% unless comment.replies.blank? %> | ... | ... |
app/views/person_notifier/mailer/_create_article.html.erb
... | ... | @@ -6,7 +6,7 @@ |
6 | 6 | <p> |
7 | 7 | <span style="font-size: 14px;"><%= link_to activity.user.short_name(20), activity.user.url %></span> |
8 | 8 | <span style="font-size: 14px;"><%= _("has published on community %s") % link_to(activity.target.profile.short_name(20), activity.target.profile.url, :style => "color: #333; font-weight: bold; text-decoration: none;") if activity.target.profile.is_a?(Community) %></span> |
9 | - <span style="font-size: 10px; color: #929292; float:right;"><%= time_ago_as_sentence(activity.created_at) %></span> | |
9 | + <span style="font-size: 10px; color: #929292; float:right;"><%= time_ago_in_words(activity.created_at) %></span> | |
10 | 10 | </p> |
11 | 11 | <p> |
12 | 12 | <span style="font-size: 14px;"><%= link_to(activity.params['name'], activity.params['url'], :style => "color: #333; font-weight: bold; text-decoration: none;") %></span> | ... | ... |
app/views/person_notifier/mailer/_default_activity.html.erb
... | ... | @@ -5,7 +5,7 @@ |
5 | 5 | <td> |
6 | 6 | <p> |
7 | 7 | <span style="font-size: 14px;"><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></span> |
8 | - <span style="font-size: 10px; color: #929292; float: right;"><%= time_ago_as_sentence(activity.created_at) %></span> | |
8 | + <span style="font-size: 10px; color: #929292; float: right;"><%= time_ago_in_words(activity.created_at) %></span> | |
9 | 9 | </p> |
10 | 10 | </td> |
11 | 11 | </tr> | ... | ... |
app/views/person_notifier/mailer/_task.html.erb
... | ... | @@ -12,7 +12,7 @@ |
12 | 12 | <span style="font-size: 14px"> |
13 | 13 | <%= task_information(task) %> |
14 | 14 | </span> |
15 | - <span style="font-size: 10px; color: #929292; float: right;"><%= time_ago_as_sentence(task.created_at) %></span> | |
15 | + <span style="font-size: 10px; color: #929292; float: right;"><%= time_ago_in_words(task.created_at) %></span> | |
16 | 16 | </div> |
17 | 17 | </td> |
18 | 18 | </tr> | ... | ... |
app/views/person_notifier/mailer/_upload_image.html.erb
... | ... | @@ -5,7 +5,7 @@ |
5 | 5 | <td> |
6 | 6 | <p> |
7 | 7 | <span style="font-size: 14px;"><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></span> |
8 | - <span style="font-size: 10px; color: #929292; float:right;"><%= time_ago_as_sentence(activity.created_at) %></span> | |
8 | + <span style="font-size: 10px; color: #929292; float:right;"><%= time_ago_in_words(activity.created_at) %></span> | |
9 | 9 | </p> |
10 | 10 | </td> |
11 | 11 | </tr> | ... | ... |
app/views/profile/_comment.html.erb
app/views/profile/_create_article.html.erb
... | ... | @@ -12,7 +12,7 @@ |
12 | 12 | <%= image_tag(activity.params['first_image']) unless activity.params['first_image'].blank? %><%= strip_tags(truncate(activity.params['lead'], :length => 1000, :ommision => '...')).gsub(/(\xC2\xA0|\s)+/, ' ').gsub(/^\s+/, '') unless activity.params['lead'].blank? %> <small><%= link_to(_('See more'), activity.params['url']) unless activity.get_lead.blank? %></small> |
13 | 13 | </div> |
14 | 14 | <%= content_tag(:p, link_to(_('See complete forum'), activity.get_url), :class => 'see-forum') if activity.target.is_a?(Forum) %> |
15 | - <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> | |
15 | + <p class='profile-activity-time'><%= time_ago_in_words(activity.created_at) %></p> | |
16 | 16 | <div class='profile-wall-actions'> |
17 | 17 | <%= link_to s_('profile|Comment'), '#', { :class => 'focus-on-comment'} %> |
18 | 18 | <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".profile-activity-item", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :only_hide => true, :view => params[:view]), _('Are you sure you want to remove this activity and all its replies?')]) if logged_in? && current_person == @profile %> | ... | ... |
app/views/profile/_default_activity.html.erb
... | ... | @@ -3,7 +3,7 @@ |
3 | 3 | </div> |
4 | 4 | <div class='profile-activity-description'> |
5 | 5 | <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> |
6 | - <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> | |
6 | + <p class='profile-activity-time'><%= time_ago_in_words(activity.created_at) %></p> | |
7 | 7 | <div class='profile-wall-actions'> |
8 | 8 | <%= link_to s_('profile|Comment'), '#', { :class => 'focus-on-comment'} %> |
9 | 9 | <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".profile-activity-item", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]), _('Are you sure you want to remove this activity and all its replies?')]) if logged_in? && current_person == @profile %> | ... | ... |
app/views/profile/_leave_scrap.html.erb
... | ... | @@ -3,7 +3,7 @@ |
3 | 3 | </div> |
4 | 4 | <div class='profile-activity-description'> |
5 | 5 | <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> |
6 | - <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> | |
6 | + <p class='profile-activity-time'><%= time_ago_in_words(activity.created_at) %></p> | |
7 | 7 | <div class='profile-wall-actions'> |
8 | 8 | <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".profile-activity-item", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]), _('Are you sure you want to remove this activity and all its replies?')]) if logged_in? && current_person == @profile %> |
9 | 9 | </div> | ... | ... |
app/views/profile/_profile_scrap.html.erb
... | ... | @@ -5,7 +5,7 @@ |
5 | 5 | <div class='profile-activity-description'> |
6 | 6 | <p class='profile-activity-sender'><%= link_to scrap.sender.name, scrap.sender.url %></p> |
7 | 7 | <p class='profile-activity-text'><%= txt2html scrap.content %></p> |
8 | - <p class='profile-activity-time'><%= time_ago_as_sentence(scrap.created_at) %></p> | |
8 | + <p class='profile-activity-time'><%= time_ago_in_words(scrap.created_at) %></p> | |
9 | 9 | <div class='profile-wall-actions'> |
10 | 10 | <% if logged_in? && current_person.follows?(scrap.sender) %> |
11 | 11 | <span class='profile-activity-send-reply'> |
... | ... | @@ -22,5 +22,5 @@ |
22 | 22 | <% end %> |
23 | 23 | </ul> |
24 | 24 | <%= render :partial => 'profile_scrap_reply_form', :locals => { :scrap => scrap } %> |
25 | - <hr /> | |
25 | + <hr /> | |
26 | 26 | </li> | ... | ... |
app/views/profile/_profile_scraps.html.erb
... | ... | @@ -5,7 +5,7 @@ |
5 | 5 | <div class='profile-activity-description'> |
6 | 6 | <p class='profile-activity-sender'><%= link_to scrap.sender.name, scrap.sender.url %></p> |
7 | 7 | <p class='profile-activity-text'><%= txt2html scrap.content %></p> |
8 | - <p class='profile-activity-time'><%= time_ago_as_sentence(scrap.created_at) %></p> | |
8 | + <p class='profile-activity-time'><%= time_ago_in_words(scrap.created_at) %></p> | |
9 | 9 | <div class='profile-wall-actions'> |
10 | 10 | <% if logged_in? && current_person.follows?(scrap.sender) %> |
11 | 11 | <span class='profile-activity-send-reply'> | ... | ... |
app/views/profile/_upload_image.html.erb
... | ... | @@ -4,7 +4,7 @@ |
4 | 4 | </div> |
5 | 5 | <div class='profile-activity-description'> |
6 | 6 | <p class='profile-activity-text'><%= link_to activity.user.name, activity.user.url %> <%= describe activity %></p> |
7 | - <p class='profile-activity-time'><%= time_ago_as_sentence(activity.created_at) %></p> | |
7 | + <p class='profile-activity-time'><%= time_ago_in_words(activity.created_at) %></p> | |
8 | 8 | <div class='profile-wall-actions'> |
9 | 9 | <%= link_to_function(_('Remove'), 'remove_item_wall(this, \'%s\', \'%s\', \'%s\'); return false ;' % [".profile-activity-item", url_for(:profile => params[:profile], :action => :remove_activity, :activity_id => activity.id, :view => params[:view]), _('Are you sure you want to remove this activity and all its replies?')]) if logged_in? && current_person == @profile %> |
10 | 10 | </div> | ... | ... |
app/views/profile/content_tagged.html.erb
... | ... | @@ -5,7 +5,7 @@ |
5 | 5 | <h1><%= _('Content tagged with "%s"') % escaped_tag %></h1> |
6 | 6 | |
7 | 7 | <p> |
8 | -<%= link_to image_tag('icons-mime/rss-feed.png', :alt => _('Feed for this tag'), :title => _('Feed for this tag')), tag_feed_path, :class => 'blog-feed-link'%> | |
8 | +<%= link_to image_tag('/images/icons-mime/rss-feed.png', :alt => _('Feed for this tag'), :title => _('Feed for this tag')), tag_feed_path, :class => 'blog-feed-link'%> | |
9 | 9 | </p> |
10 | 10 | |
11 | 11 | <% cache_timeout(@tag_cache_key, 4.hour) do %> | ... | ... |
app/views/profile/report_abuse.html.erb
... | ... | @@ -24,7 +24,7 @@ |
24 | 24 | $('#report-abuse-submit-button').css('cursor', 'progress'); |
25 | 25 | $.ajax({ |
26 | 26 | type: 'POST', |
27 | - url: <%= url_for({:controller => 'profile', :action => 'register_report', :profile => profile.identifier}) %>, | |
27 | + url: <%= url_for({:controller => 'profile', :action => 'register_report', :profile => profile.identifier}).to_json %>, | |
28 | 28 | data: $(form).serialize(), |
29 | 29 | dataType: 'json', |
30 | 30 | success: function(data, status, ajax){ | ... | ... |