Commit 6e53d8be9a1b6790ac4cf474d996556f279befd0

Authored by Rodrigo Souto
2 parents 5ceef49f 50e72f1d

Merge remote-tracking branch 'larissa/share' into stoa

app/controllers/my_profile/cms_controller.rb
... ... @@ -238,25 +238,48 @@ class CmsController < MyProfileController
238 238 render :template => 'shared/update_categories', :locals => { :category => @current_category, :object_name => 'article' }
239 239 end
240 240  
  241 + def search_communities_to_publish
  242 + render :text => find_by_contents(:profiles, user.memberships, params['q'], {:page => 1}, {:fields => ['name']})[:results].map {|community| {:id => community.id, :name => community.name} }.to_json
  243 + end
  244 +
241 245 def publish
242 246 @article = profile.articles.find(params[:id])
  247 + @portal_enabled = environment.portal_community && environment.enabled?('use_portal_community')
243 248 record_coming
244   - @groups = profile.memberships - [profile]
245   - @marked_groups = []
246   - groups_ids = profile.memberships.map{|m|m.id.to_s}
247   - @marked_groups = params[:marked_groups].map do |key, item|
248   - if groups_ids.include?(item[:group_id])
249   - item.merge :group => Profile.find(item.delete(:group_id))
  249 + @failed = {}
  250 + if request.post?
  251 + article_name = params[:name]
  252 + task = ApproveArticle.create!(:article => @article, :name => article_name, :target => user, :requestor => user)
  253 + begin
  254 + task.finish
  255 + rescue Exception => ex
  256 + @failed[ex.message] ? @failed[ex.message] << item.name : @failed[ex.message] = [item.name]
250 257 end
251   - end.compact unless params[:marked_groups].nil?
  258 + if @failed.blank?
  259 + session[:notice] = _("Your publish request was sent successfully")
  260 + if @back_to
  261 + redirect_to @back_to
  262 + else
  263 + redirect_to @article.view_url
  264 + end
  265 + end
  266 + end
  267 + end
  268 +
  269 + def publish_on_communities
252 270 if request.post?
  271 + @back_to = params[:back_to]
  272 + @article = profile.articles.find(params[:id])
253 273 @failed = {}
  274 + article_name = params[:name]
  275 + params_marked = params['q'].split(',').select { |marked| user.memberships.map(&:id).include? marked.to_i }
  276 + @marked_groups = Profile.find(params_marked)
254 277 @marked_groups.each do |item|
255   - task = ApproveArticle.create!(:article => @article, :name => item[:name], :target => item[:group], :requestor => profile)
  278 + task = ApproveArticle.create!(:article => @article, :name => article_name, :target => item, :requestor => user)
256 279 begin
257   - task.finish unless item[:group].moderated_articles?
  280 + task.finish unless item.moderated_articles?
258 281 rescue Exception => ex
259   - @failed[ex.message] ? @failed[ex.message] << item[:group].name : @failed[ex.message] = [item[:group].name]
  282 + @failed[ex.message] ? @failed[ex.message] << item.name : @failed[ex.message] = [item.name]
260 283 end
261 284 end
262 285 if @failed.blank?
... ... @@ -271,9 +294,9 @@ class CmsController &lt; MyProfileController
271 294 end
272 295  
273 296 def publish_on_portal_community
274   - @article = profile.articles.find(params[:id])
275 297 if request.post?
276   - if environment.portal_community
  298 + @article = profile.articles.find(params[:id])
  299 + if environment.portal_community && environment.enabled?('use_portal_community')
277 300 task = ApproveArticle.create!(:article => @article, :name => params[:name], :target => environment.portal_community, :requestor => user)
278 301 begin
279 302 task.finish unless environment.portal_community.moderated_articles?
... ...
app/helpers/cms_helper.rb
... ... @@ -40,11 +40,9 @@ module CmsHelper
40 40 end
41 41 end
42 42  
43   - def display_spread_button(profile, article)
44   - if profile.person?
45   - expirable_button article, :spread, _('Spread this'), :action => 'publish', :id => article.id
46   - elsif profile.community? && environment.portal_community
47   - expirable_button article, :spread, _('Spread this'), :action => 'publish_on_portal_community', :id => article.id
  43 + def display_spread_button(article)
  44 + if article.public?
  45 + expirable_button article, :spread, _('Spread this'), {:action => 'publish', :id => article.id}, {:class => 'colorbox'}
48 46 end
49 47 end
50 48  
... ...
app/helpers/token_helper.rb
... ... @@ -12,6 +12,7 @@ module TokenHelper
12 12 options[:search_delay] ||= 1000
13 13 options[:prevent_duplicates] ||= true
14 14 options[:backspace_delete_item] ||= false
  15 + options[:zindex] ||= 999
15 16 options[:focus] ||= false
16 17 options[:avoid_enter] ||= true
17 18 options[:on_result] ||= 'null'
... ... @@ -30,6 +31,7 @@ module TokenHelper
30 31 searchDelay: #{options[:search_delay].to_json},
31 32 preventDuplicates: #{options[:prevent_duplicates].to_json},
32 33 backspaceDeleteItem: #{options[:backspace_delete_item].to_json},
  34 + zindex: #{options[:zindex].to_json},
33 35 queryParam: #{name.to_json},
34 36 tokenLimit: #{options[:token_limit].to_json},
35 37 onResult: #{options[:on_result]},
... ... @@ -48,4 +50,4 @@ module TokenHelper
48 50 result
49 51 end
50 52  
51   -end
52 53 \ No newline at end of file
  54 +end
... ...
app/views/cms/publish.html.erb
1   -<h1><%= _('Select the groups where you want to publish your article') %></h1>
  1 +<script type="text/javascript" charset="utf-8">
  2 + jQuery(document).ready( function() {
  3 + jQuery('.publish-article-title').find('label')
  4 + .click( function(event) {
  5 + if (this == event.target) {
  6 + jQuery(this).toggleClass('expanded');
  7 + jQuery(this).next('input').slideToggle();
  8 + }
  9 + return false;
  10 + }).addClass('collapsed').next('input').hide();
  11 + });
  12 +
  13 +</script>
  14 +<div class="select-publish-target">
  15 +
  16 +<h2><%= _('Where do you want to publish this article?') %></h2>
2 17  
3 18 <% if !@failed.blank? %>
4 19 <div class="errorExplanation" id="errorExplanation">
... ... @@ -14,15 +29,57 @@
14 29 </div>
15 30 <% end %>
16 31  
17   -<%= form_tag do%>
18   - <%= hidden_field_tag :back_to, @back_to %>
19   - <% @groups.each do |group| %>
20   - <%= labelled_check_box group.name, "marked_groups[#{group.id}][group_id]", group.id, @marked_groups.include?(group) %><br />
21   - <%= labelled_text_field _('Title') + ': ', "marked_groups[#{group.id}][name]", @article.name, :style => 'width: 100%' %>
22   - <hr />
23   - <% end %>
  32 +<ul class='publish-targets'>
  33 + <li onmouseover="javascript: jQuery(this).addClass('mouseover')" onmouseout="jQuery(this).removeClass('mouseover')">
  34 + <strong><%= _("Publish this article on your profile") %></strong>
  35 + <div class='description'><%= _('You can publish this article on your profile where your friends and followers will see.') %></div>
  36 + <%= form_tag do %>
  37 + <%= hidden_field_tag :back_to, @back_to %>
  38 + <div class='publish-article-title'>
  39 + <%= labelled_text_field _('Title'), 'name', @article.name %>
  40 + </div>
24 41  
25   - <% button_bar do %>
26   - <%= submit_button 'spread', _('Spread this'), :cancel => @back_to %>
  42 + <% button_bar do %>
  43 + <%= submit_button 'spread', _('Spread this') %>
  44 + <% end %>
  45 + <% end %>
  46 + </li>
  47 +
  48 + <li onmouseover="javascript: jQuery(this).addClass('mouseover')" onmouseout="jQuery(this).removeClass('mouseover')">
  49 + <strong><%= _("Publish this article on communities you are part of") %></strong>
  50 + <div class='description'><%= _('You can submit this article to one or more communities you are a member of, just search for the community below.') %></div>
  51 + <%= form_tag :action => 'publish_on_communities', :id => @article.id do %>
  52 + <%= hidden_field_tag :back_to, @back_to %>
  53 + <% search_action = url_for(:action => 'search_communities_to_publish') %>
  54 + <%= token_input_field_tag(:q, 'search-communities-to-publish', search_action, { :hint_text => _('Type in a search for your community'), :zindex => 10000, :focus => false }) %>
  55 +
  56 + <div class='publish-article-title'>
  57 + <%= labelled_text_field _('Title'), 'name', @article.name %>
  58 + </div>
  59 + <% button_bar do %>
  60 + <%= submit_button 'spread', _('Spread this') %>
  61 + <% end %>
  62 + <% end %>
  63 + </li>
  64 +
  65 +
  66 +<% if @portal_enabled %>
  67 + <li onmouseover="javascript: jQuery(this).addClass('mouseover')" onmouseout="jQuery(this).removeClass('mouseover')">
  68 + <strong><%= _("Publish your article on portal community") %></strong>
  69 + <div class='description'><%= _('You can suggest this article to the portal community, where it can show up on the homepage.') %></div>
  70 +
  71 + <%= form_tag :action => 'publish_on_portal_community', :id => @article.id do %>
  72 + <%= hidden_field_tag :back_to, @back_to %>
  73 + <div class='publish-article-title'>
  74 + <%= labelled_text_field _('Title'), :name, @article.name %>
  75 + </div>
  76 +
  77 + <% button_bar do %>
  78 + <%= submit_button 'spread', _('Spread this') %>
  79 + <% end %>
27 80 <% end %>
  81 + </li>
28 82 <% end %>
  83 +</ul>
  84 +
  85 +</div>
... ...
app/views/cms/view.html.erb
... ... @@ -66,7 +66,7 @@
66 66 <td class="article-controls">
67 67 <%= expirable_button article, :edit, _('Edit'), {:action => 'edit', :id => article.id} if !remove_content_button(:edit) %>
68 68 <%= button_without_text :eyes, _('Public view'), article.view_url %>
69   - <%= display_spread_button(profile, article) unless article.folder? || remove_content_button(:spread)%>
  69 + <%= display_spread_button(article) unless article.folder? || remove_content_button(:spread)%>
70 70 <% if !environment.enabled?('cant_change_homepage') && !remove_content_button(:home) %>
71 71 <% if profile.home_page != article %>
72 72 <%= expirable_button article, :home, _('Use as homepage'), { :action => 'set_home_page', :id => article.id }, :method => :post %>
... ...
app/views/content_viewer/_article_toolbar.html.erb
... ... @@ -15,15 +15,9 @@
15 15 <%= expirable_button @page, :delete, content, url, options %>
16 16 <% end %>
17 17  
18   - <% if !@page.folder? && @page.allow_spread?(user) && !remove_content_button(:spread) %>
19   - <% content = content_tag( 'span', _('Spread this') ) %>
20   - <% url = nil %>
21   - <% if profile.kind_of?(Person) %>
22   - <% url = profile.admin_url.merge({ :controller => 'cms', :action => 'publish', :id => @page.id }) %>
23   - <% elsif profile.kind_of?(Community) && environment.portal_community %>
24   - <% url = profile.admin_url.merge({ :controller => 'cms', :action => 'publish_on_portal_community', :id => @page.id }) %>
25   - <% end %>
26   - <%= expirable_button @page, :spread, content, url if url %>
  18 + <% if !@page.folder? && @page.public? && !remove_content_button(:spread) %>
  19 + <% url = profile.admin_url.merge({ :controller => 'cms', :action => 'publish', :id => @page.id }) %>
  20 + <%= expirable_button @page, :spread, content_tag( 'span', _('Spread this') ), url, {:class => 'colorbox'} if url %>
27 21 <% end %>
28 22  
29 23 <% if !@page.gallery? && (@page.allow_create?(user) || (@page.parent && @page.parent.allow_create?(user))) %>
... ...
public/javascripts/jquery.tokeninput.js
... ... @@ -35,6 +35,7 @@ var DEFAULT_SETTINGS = {
35 35 onAdd: null,
36 36 onDelete: null,
37 37 idPrefix: "token-input-",
  38 + zindex: 999,
38 39 backspaceDeleteItem: true
39 40 };
40 41  
... ... @@ -628,7 +629,7 @@ $.TokenList = function (input, url_or_data, options) {
628 629 position: "absolute",
629 630 top: $(token_list).offset().top + $(token_list).outerHeight(),
630 631 left: $(token_list).offset().left,
631   - zindex: 999
  632 + 'z-index': settings.zindex
632 633 }).show();
633 634 else
634 635 dropdown.css({
... ...
public/stylesheets/application.css
... ... @@ -2159,7 +2159,7 @@ a.button.disabled, input.disabled {
2159 2159 .recent-documents-block .block-footer-content a:hover {
2160 2160 text-decoration: underline;
2161 2161 }
2162   -/* ==> blocks/disabled-enterprise-message-block.css <<= */
  2162 +/* ==> blocks/disabled-enterprise-message-block.css <<= */
2163 2163  
2164 2164  
2165 2165 .disabled-enterprise-message-block {
... ... @@ -2175,12 +2175,12 @@ a.button.disabled, input.disabled {
2175 2175 font-size: 80%;
2176 2176 background: #ffffa9;
2177 2177 }
2178   -/* ==> blocks/article-block.css <<= */
  2178 +/* ==> blocks/article-block.css <<= */
2179 2179  
2180 2180 .article-block {
2181 2181 overflow: hidden;
2182 2182 }
2183   -/* ==> blocks/main-block.css <<= */
  2183 +/* ==> blocks/main-block.css <<= */
2184 2184  
2185 2185 /*
2186 2186 Use article.css for article related css
... ... @@ -2201,7 +2201,7 @@ div#activation_enterprise {
2201 2201 div#activation_enterprise label, div#activation_enterprise input, div#activation_enterprise div {
2202 2202 display: inline
2203 2203 }
2204   -/* ==> blocks/slideshow-block.css <<= */
  2204 +/* ==> blocks/slideshow-block.css <<= */
2205 2205  
2206 2206 .slideshow-block .slideshow-container {
2207 2207 margin-bottom: 10px;
... ... @@ -2266,7 +2266,7 @@ div#activation_enterprise label, div#activation_enterprise input, div#activation
2266 2266 display: inline-block;
2267 2267 width: 16px;
2268 2268 }
2269   -/* ==> blocks/products-block.css <<= */
  2269 +/* ==> blocks/products-block.css <<= */
2270 2270  
2271 2271 .products-block ul {
2272 2272 margin: 0px;
... ... @@ -2299,7 +2299,7 @@ div#activation_enterprise label, div#activation_enterprise input, div#activation
2299 2299 #content .products-block li a:hover {
2300 2300 color: #fff;
2301 2301 }
2302   -/* ==> blocks/blog-archives-block.css <<= */
  2302 +/* ==> blocks/blog-archives-block.css <<= */
2303 2303  
2304 2304 #content .blog-archives-block {
2305 2305 padding: 10px 0px 10px 10px;
... ... @@ -2319,7 +2319,7 @@ div#activation_enterprise label, div#activation_enterprise input, div#activation
2319 2319 padding: 5px 0px 10px 10px;
2320 2320 font-size: 12px;
2321 2321 }
2322   -/* ==> blocks/profile-info-block.css <<= */
  2322 +/* ==> blocks/profile-info-block.css <<= */
2323 2323  
2324 2324  
2325 2325 .profile-info-block h2 {
... ... @@ -2422,7 +2422,7 @@ div#activation_enterprise label, div#activation_enterprise input, div#activation
2422 2422 margin: 0px 0px 5px 0px;
2423 2423 padding: 2px;
2424 2424 }
2425   -/* ==> blocks/location-block.css <<= */
  2425 +/* ==> blocks/location-block.css <<= */
2426 2426  
2427 2427 .location-block {
2428 2428 text-align: center;
... ... @@ -2435,7 +2435,7 @@ div#activation_enterprise label, div#activation_enterprise input, div#activation
2435 2435 background: #FFF;
2436 2436 border: 1px solid #888;
2437 2437 }
2438   -/* ==> blocks/profile-image-block.css <<= */
  2438 +/* ==> blocks/profile-image-block.css <<= */
2439 2439  
2440 2440  
2441 2441 .profile-image-block {
... ... @@ -2470,7 +2470,7 @@ div#activation_enterprise label, div#activation_enterprise input, div#activation
2470 2470 list-style: none;
2471 2471 margin-bottom: 8px;
2472 2472 }
2473   -/* ==> blocks/sellers-search-block.css <<= */
  2473 +/* ==> blocks/sellers-search-block.css <<= */
2474 2474  
2475 2475  
2476 2476 #content .sellers-search-block {
... ... @@ -2529,7 +2529,7 @@ div#activation_enterprise label, div#activation_enterprise input, div#activation
2529 2529 margin: 0px;
2530 2530 float: none;
2531 2531 }
2532   -/* ==> blocks/feed-reader-block.css <<= */
  2532 +/* ==> blocks/feed-reader-block.css <<= */
2533 2533  
2534 2534 #content .feed-reader-block {
2535 2535 padding: 10px 0px 10px 10px;
... ... @@ -3288,6 +3288,52 @@ table.cms-articles .icon:hover {
3288 3288 background-color: transparent;
3289 3289 }
3290 3290  
  3291 +.select-publish-target {
  3292 + margin: 10px 10px 0px 10px;
  3293 +}
  3294 +
  3295 +.publish-targets {
  3296 + padding: 10px;
  3297 + margin: 0px;
  3298 +}
  3299 +
  3300 +.publish-targets>li {
  3301 + list-style: none;
  3302 + padding: 10px 20px 5px 10px;
  3303 +}
  3304 +
  3305 +.publish-targets li.mouseover {
  3306 + background-color: #eeeeec;
  3307 +}
  3308 +
  3309 +.publish-targets div.publish-article-title, .publish-targets .description {
  3310 + width: 384px;
  3311 + margin-top: 2px;
  3312 +}
  3313 +
  3314 +.publish-targets div.publish-article-title .collapsed {
  3315 + background-image: url("../images/icons-task/closed-arrow-hover.png");
  3316 + background-repeat: no-repeat;
  3317 + background-position: 3px 0;
  3318 +}
  3319 +
  3320 +.publish-targets div.publish-article-title .expanded {
  3321 + background-image: url("../images/icons-task/opened-arrow-hover.png");
  3322 + background-repeat: no-repeat;
  3323 + background-position: 3px 0;
  3324 +}
  3325 +
  3326 +.publish-targets div.publish-article-title label {
  3327 + padding-left: 20px;
  3328 +}
  3329 +
  3330 +.publish-targets div.publish-article-title input {
  3331 + width: 100%;
  3332 + border: 1px solid #999;
  3333 + padding: 3px 8px;
  3334 + margin-bottom: 2px;
  3335 +}
  3336 +
3291 3337 .select-article-type {
3292 3338 padding: 5px 20px;
3293 3339 width: 455px;
... ... @@ -6689,7 +6735,7 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img {
6689 6735  
6690 6736 /* AutoComplete*/
6691 6737 .formfield input.ui-autocomplete-loading { background: url('/images/loading-small.gif') right center no-repeat, url("../images/input-bg.gif") no-repeat left top; }
6692   -
  6738 +
6693 6739 .ui-autocomplete-category {
6694 6740 font-weight: bold;
6695 6741 padding: .2em .4em;
... ...
test/unit/cms_helper_test.rb
... ... @@ -48,41 +48,22 @@ class CmsHelperTest &lt; ActionView::TestCase
48 48 result = link_to_article(file)
49 49 end
50 50  
51   - should 'display spread button when profile is a person' do
  51 + should 'display spread button when content is public' do
52 52 plugins.stubs(:dispatch).returns([])
53 53 profile = fast_create(Person)
54 54 article = fast_create(TinyMceArticle, :name => 'My article', :profile_id => profile.id)
55 55 expects(:link_to).with('Spread this', {:action => 'publish', :id => article.id}, :class => 'button with-text icon-spread', :title => nil)
56 56  
57   - result = display_spread_button(profile, article)
  57 + result = display_spread_button(article)
58 58 end
59 59  
60   - should 'display spread button when profile is a community and env has portal_community' do
  60 + should 'not display spread button when content is not public' do
61 61 plugins.stubs(:dispatch).returns([])
62   - env = fast_create(Environment)
63   - env.expects(:portal_community).returns(true)
64   - profile = fast_create(Community, :environment_id => env.id)
65   - expects(:environment).returns(env)
66   -
67   - article = fast_create(TinyMceArticle, :name => 'My article', :profile_id => profile.id)
68   -
69   - expects(:link_to).with('Spread this', {:action => 'publish_on_portal_community', :id => article.id}, :class => 'button with-text icon-spread', :title => nil)
70   -
71   - result = display_spread_button(profile, article)
72   - end
73   -
74   - should 'not display spread button when profile is a community and env has not portal_community' do
75   - plugins.stubs(:dispatch).returns([])
76   - env = fast_create(Environment)
77   - env.expects(:portal_community).returns(nil)
78   - profile = fast_create(Community, :environment_id => env.id)
79   - expects(:environment).returns(env)
80   -
81   - article = fast_create(TinyMceArticle, :name => 'My article', :profile_id => profile.id)
82   -
83   - expects(:link_to).with('Spread this', {:action => 'publish_on_portal_community', :id => article.id}, :class => 'button with-text icon-spread', :title => nil).never
  62 + profile = fast_create(Person)
  63 + article = fast_create(TinyMceArticle, :name => 'My article', :profile_id => profile.id, :published => false)
  64 + expects(:link_to).with('Spread this', {:action => 'publish', :id => article.id}, :class => 'button with-text icon-spread', :title => nil).never
84 65  
85   - result = display_spread_button(profile, article)
  66 + result = display_spread_button(article)
86 67 end
87 68  
88 69 should 'display delete_button to folder' do
... ...