Commit 224dcf933fcf1abbbdd0e8f3cf1ce53715bc4385

Authored by Larissa Reis
2 parents d070f74a 43548e50

Merge branch 'stoa' of gitlab.com:colivre/noosfero into feedback

app/controllers/my_profile/cms_controller.rb
... ... @@ -114,7 +114,7 @@ class CmsController < MyProfileController
114 114 @success_back_to = params[:success_back_to]
115 115 # user must choose an article type first
116 116  
117   - @parent = profile.articles.find(params[:parent_id]) if params && params[:parent_id]
  117 + @parent = profile.articles.find(params[:parent_id]) if params && params[:parent_id].present?
118 118 record_coming
119 119 @type = params[:type]
120 120 if @type.blank?
... ... @@ -159,7 +159,10 @@ class CmsController < MyProfileController
159 159 if continue
160 160 redirect_to :action => 'edit', :id => @article
161 161 else
162   - success_redirect
  162 + respond_to do |format|
  163 + format.html { success_redirect }
  164 + format.json { render :text => {:id => @article.id, :full_name => profile.identifier + '/' + @article.full_name}.to_json }
  165 + end
163 166 end
164 167 return
165 168 end
... ... @@ -477,7 +480,7 @@ class CmsController < MyProfileController
477 480 files = profile.files
478 481 end
479 482  
480   - files = files.more_recent
  483 + files = files.reorder('created_at DESC')
481 484 images = files.images
482 485 generics = files.no_images
483 486  
... ...
app/models/profile_suggestion.rb
... ... @@ -157,4 +157,22 @@ class ProfileSuggestion < ActiveRecord::Base
157 157 self.save
158 158 end
159 159  
  160 + def self.generate_all_profile_suggestions
  161 + Delayed::Job.enqueue(ProfileSuggestion::GenerateAllJob.new) unless ProfileSuggestion::GenerateAllJob.exists?
  162 + end
  163 +
  164 + def self.generate_profile_suggestions(person_id)
  165 + Delayed::Job.enqueue ProfileSuggestionsJob.new(person_id) unless ProfileSuggestionsJob.exists?(person_id)
  166 + end
  167 +
  168 + class GenerateAllJob
  169 + def self.exists?
  170 + Delayed::Job.by_handler("--- !ruby/object:ProfileSuggestion::GenerateAllJob {}\n").count > 0
  171 + end
  172 +
  173 + def perform
  174 + Person.find_each {|person| ProfileSuggestion.generate_profile_suggestions(person.id) }
  175 + end
  176 + end
  177 +
160 178 end
... ...
app/views/admin_panel/_signup_welcome_screen.html.erb
1 1 <div class='description'>
2   - <%= _('This text will be showed as a welcome message to users after signup.') %><br/><br/>
  2 + <%= _('If you enable this feature on the "Features" section of the Administration Panel, this text will be shown as a welcome message to users after signup.') %><br/><br/>
3 3 </div>
4 4 <%= labelled_form_field(_('Body'), text_area(:environment, :signup_welcome_screen_body, :cols => 40, :style => 'width: 100%', :class => 'mceEditor')) %>
5 5  
... ... @@ -8,4 +8,4 @@
8 8 <%= _('If this content is left blank, the following page will be displayed to the user:') %><br/><br/>
9 9 </div>
10 10 <p>
11   -<%= render :file => 'home/welcome' %>
  11 +<%= render :file => 'home/welcome', :locals => {:default_message => true} %>
... ...
app/views/cms/_media_new_folder.html.erb 0 → 100644
... ... @@ -0,0 +1,15 @@
  1 +<%= form_tag({:action => 'new', :profile => profile.identifier}, :id => 'new-folder-dialog', :title => _('Create new folder'), :style => 'display: none;') do %>
  2 + <%= select_profile_folder(
  3 + _('Choose parent folder:'),
  4 + :parent_id, profile, default_folder, {}, {},
  5 + "type='Folder' or type='Gallery'")
  6 + %>
  7 +
  8 + <%= content_tag(:label, radio_button_tag(:folder_type, 'Gallery', true) + _('Gallery')) %>
  9 + <%= content_tag(:label, radio_button_tag(:folder_type, 'Folder', false) + _('Folder')) %>
  10 +
  11 + <%= labelled_form_field _('Name:'), text_field_tag(:new_folder, nil, 'data-url' => url_for({:action => 'new', :profile => profile.identifier})) %>
  12 + <% button_bar do %>
  13 + <%= submit_button(:newfolder, _('Create')) %>
  14 + <% end %>
  15 +<% end %>
... ...
app/views/cms/_text_editor_sidebar.html.erb
  1 +<% default_folder = content_id_to_str default_folder_for_image_upload(profile) %>
  2 +
1 3 <div class='text-editor-sidebar'>
2 4 <span class='button-add' data-value='<%= _('Add to the text') %>'></span>
3 5 <span class='button-zoom' data-value='<%= _('Zoom in') %>'></span>
4 6 <span class='button-close' data-value='<%= _('Close') %>'></span>
5 7  
  8 + <div class='header'><strong><%= _('Insert media') %></strong><%= button('vertical-toggle', _('Show/Hide'), '#') %></div>
  9 +
6 10 <%= render(:partial => 'textile_quick_reference') if @article.is_a?(TextileArticle) %>
7 11 <div class='text-editor-sidebar-box' id='media-upload-box'>
8   - <div class='header'><strong><%= _('Insert media') %></strong></div>
9 12 <div id='media-upload-form'>
10 13 <%= form_tag({ :action => 'media_upload' }, :multipart => true) do %>
11 14 <div class='formfield'>
12   - <% default_folder = content_id_to_str default_folder_for_image_upload(profile) %>
13 15 <%= select_profile_folder(
14 16 _('Choose folder to upload files:'),
15 17 :parent_id, profile, default_folder, {}, {},
16 18 "type='Folder' or type='Gallery'"
17 19 ) %>
18 20 </div>
  21 + <%= button(:newfolder, _('New folder'), '#', :id => 'new-folder-button') %>
19 22 <p><%= file_field_tag('file', :multiple => true) %></p>
20 23 <% end %>
21 24 </div>
... ... @@ -26,7 +29,6 @@
26 29 </div>
27 30  
28 31 <div id='published-media' class='text-editor-sidebar-box' data-url='<%= url_for({:controller => 'cms', :action => 'published_media_items', :profile => profile.identifier}) %>'>
29   - <div class='header'><strong><%= _('Published media') %></strong></div>
30 32 <%= select_profile_folder(nil, :parent_id, profile, 'recent-media', {}, {},
31 33 "type='Folder' or type='Gallery'", {:root_label => _('Recent media')}) %>
32 34 <%= labelled_form_field _('Search'), text_field_tag('q') %>
... ... @@ -45,4 +47,5 @@
45 47 </div>
46 48 </script>
47 49  
  50 +<%= render :partial => 'media_new_folder', :locals => {:default_folder => default_folder} %>
48 51 <%= javascript_include_tag 'jquery.fileupload.js', 'tmpl.js', 'media-panel.js' %>
... ...
app/views/cms/media_upload.js.erb
1   -<% klass = @file.class.name.split('::').last.to_css_class %>
2   -jQuery("#published-media .items .<%= klass.pluralize %> .section-title").after("<%= j render :partial => "cms/media_panel/#{klass}" %>");
3   -jQuery("#published-media .items .<%= klass.pluralize %>").show();
  1 +loadPublishedMedia();
... ...
app/views/enterprise_registration/creation.html.erb
1   -<h1><%= __('Enterprise registration completed') %></h1>
2   -<p><%= __("Your enterprise (%s) was successfully registered.") % @enterprise.name %></p>
3   -<p><%= link_to __('You can manage your enterprise now.'), @enterprise.admin_url %></p>
  1 +<h1><%= _('Enterprise registration completed') %></h1>
  2 +<p><%= _("Your enterprise (%s) was successfully registered.") % @enterprise.name %></p>
  3 +<p><%= link_to _('You can manage your enterprise now.'), @enterprise.admin_url %></p>
4 4  
5 5 <%= render :partial => 'shared/template_welcome_page', :locals => {:template => @enterprise.template, :header => _("What can I do with a %s?")} %>
6 6  
... ...
app/views/home/welcome.html.erb
  1 +<% default_message = defined?(default_message) ? default_message : false %>
  2 +
1 3 <div id='thanks-for-signing'>
2 4 <h1><%= _("Welcome to %s!") % environment.name %></h1>
3   - <% if environment.has_custom_welcome_screen? %>
  5 + <% if environment.has_custom_welcome_screen? && !default_message %>
4 6 <%= environment.settings[:signup_welcome_screen_body].html_safe %>
5 7 <% else %>
6 8 <h3><%= _("Thanks for signing up, we're thrilled to have you on our social network!") %></h3>
... ...
app/views/memberships/welcome.html.erb
1   -<h1><%= __('Community created') %></h1>
2   -<p><%= __("Your community (%s) was successfully created.") % @community.name %></p>
3   -<p><%= link_to __('You can manage your community now.'), @community.admin_url %></p>
  1 +<h1><%= _('Community created') %></h1>
  2 +<p><%= _("Your community (%s) was successfully created.") % @community.name %></p>
  3 +<p><%= link_to _('You can manage your community now.'), @community.admin_url %></p>
4 4  
5 5 <%= render :partial => 'shared/template_welcome_page', :locals => {:template => @community.template, :header => _("What can I do with a %s?")} %>
6 6  
... ...
app/views/profile_editor/welcome_page.html.erb
1 1 <h1><%= _('Edit welcome page') %></h1>
2 2  
3   -<% labelled_form_for :welcome_page, @welcome_page do |f| %>
  3 +<%= labelled_form_for :welcome_page do |f| %>
4 4 <%= error_messages_for :welcome_page %>
5 5  
6 6 <%= f.check_box(:published) %>
... ...
app/views/shared/_lead_and_body.html.erb
... ... @@ -20,16 +20,16 @@
20 20 <div class='article-lead' id="article-lead-<%=lead_id.to_s%>">
21 21  
22 22 <% if f %>
23   - <%= labelled_form_field(_(abstract_label), f.text_area(abstract_method, :style => 'width: 98%; height: 200px;', :class => editor_type)) %>
  23 + <%= labelled_form_field(_(abstract_label), f.text_area(abstract_method, :style => 'width: 100%; height: 200px;', :class => editor_type)) %>
24 24 <% else %>
25   - <%= labelled_form_field(_(abstract_label), text_area(object, abstract_method, :style => 'width: 98%; height: 200px;', :class => editor_type)) %>
  25 + <%= labelled_form_field(_(abstract_label), text_area(object, abstract_method, :style => 'width: 100%; height: 200px;', :class => editor_type)) %>
26 26 <% end %>
27 27 </div>
28 28 <div style="margin-top: 10px;">
29 29 <% if f %>
30   - <%= labelled_form_field(_(body_label), f.text_area(body_method, :style => 'width: 98%; height: 400px;', :class => editor_type)) %>
  30 + <%= labelled_form_field(_(body_label), f.text_area(body_method, :style => 'width: 100%; height: 400px;', :class => editor_type)) %>
31 31 <% else %>
32   - <%= labelled_form_field(_(body_label), text_area(object, body_method, :style => 'width: 98%; height: 400px;', :class => editor_type)) %>
  32 + <%= labelled_form_field(_(body_label), text_area(object, body_method, :style => 'width: 100%; height: 400px;', :class => editor_type)) %>
33 33 <% end %>
34 34 </div>
35 35  
... ...
config/schedule.rb
... ... @@ -26,3 +26,7 @@ set :output, &quot;log/cron.log&quot;
26 26 every 1.minute do
27 27 runner "SearchTerm.calculate_scores"
28 28 end
  29 +
  30 +every 90.days do
  31 + runner "ProfileSuggestion.generate_all_profile_suggestions"
  32 +end
... ...
lib/profile_suggestions_job.rb
1 1 class ProfileSuggestionsJob < Struct.new(:person_id)
2 2  
  3 + def self.exists?(person_id)
  4 + !find(person_id).empty?
  5 + end
  6 +
  7 + def self.find(person_id)
  8 + Delayed::Job.by_handler("--- !ruby/struct:ProfileSuggestionsJob\nperson_id: #{person_id}\n")
  9 + end
  10 +
3 11 def perform
  12 + logger = Delayed::Worker.logger
4 13 begin
5 14 person = Person.find(person_id)
6 15  
7 16 ProfileSuggestion::RULES.each do |rule|
8 17 ProfileSuggestion.send(rule, person)
9 18 end
10   -
11 19 UserMailer.profiles_suggestions_email(person).deliver
12 20 rescue Exception => exception
13   - Rails.logger.warn("Error with suggestions for person ID %d\n%s" % [person_id, exception.to_s])
  21 + logger.warn("Error with suggestions for person ID %d: %s" % [person_id, exception.to_s])
14 22 end
15 23 end
16 24  
... ...
public/designs/icons/tango/style.css
... ... @@ -72,6 +72,7 @@
72 72 .icon-newupload-file { background-image: url(Tango/16x16/actions/filesave.png) }
73 73 .icon-slideshow { background-image: url(Tango/16x16/mimetypes/x-office-presentation.png) }
74 74 .icon-photos { background-image: url(Tango/16x16/devices/camera-photo.png) }
  75 +.icon-vertical-toggle { background-image: url(Tango/16x16/actions/mail-send-receive.png) }
75 76  
76 77 .icon-text-html { background-image: url(Tango/16x16/mimetypes/text-html.png) }
77 78 .icon-text-plain { background-image: url(Tango/16x16/mimetypes/text-x-generic.png) }
... ...
public/javascripts/article.js
... ... @@ -74,9 +74,9 @@ jQuery(function($) {
74 74 }
75 75 }
76 76  
77   - function zoom_dialog_html(img) {
  77 + function zoom_dialog_html(name, img) {
78 78 // FIXME organize this code better
79   - return '<div class="item" data-item="div"><div><img src="' + img + '" style="max-width: 640px; max-height: 480px"/></div>' + '<div class="button-bar">' + add_to_text_button('with-text') + '&nbsp;&nbsp;&nbsp;' + close_button('with-text') + '</div></div>'
  79 + return '<h3 style="text-align: center;">'+ name +'</h3><div class="item" data-item="div"><div><img src="' + img + '" style="max-width: 640px; max-height: 480px"/></div>' + '<div class="button-bar">' + add_to_text_button('with-text') + '&nbsp;&nbsp;&nbsp;' + close_button('with-text') + '</div></div>'
80 80 }
81 81  
82 82 $('.view-all-images .item').live('click', function(){
... ... @@ -94,9 +94,10 @@ jQuery(function($) {
94 94 $('a.zoom').live('click', function() {
95 95 var $item = $(this).closest('.item');
96 96 var html_selector = $item.attr('data-item');
  97 + var name = $item.attr('title');
97 98 var img = $item.find(html_selector).find('img').attr('src');
98 99 $.colorbox({
99   - html: zoom_dialog_html(img),
  100 + html: zoom_dialog_html(name, img),
100 101 scrolling: false
101 102 });
102 103 return false;
... ...
public/javascripts/media-panel.js
... ... @@ -84,3 +84,45 @@ jQuery(&quot;#published-media #q&quot;).typeWatch({
84 84 });
85 85  
86 86 jQuery("#published-media #q").bind('notext', function(){ loadPublishedMedia() });
  87 +
  88 +jQuery("#new-folder-dialog").submit(function( event ) {
  89 + var name = jQuery('#new_folder').val();
  90 + var parent_id = jQuery("#new-folder-dialog #parent_id").val();
  91 + jQuery("#media-upload-box #parent_id").val();
  92 + jQuery.ajax({
  93 + url: this.action,
  94 + type: 'POST',
  95 + data: {
  96 + 'parent_id': parent_id,
  97 + 'article': {'name': name, 'published': true},
  98 + 'type': jQuery('input[name=folder_type]:checked').val() },
  99 + dataType: 'json',
  100 + beforeSend: function(){jQuery("#new-folder-dialog").addClass('fetching')},
  101 + success: function(response) {
  102 + var option_selected = "<option value='"+ response.id +"' selected='selected'>"+ response.full_name +"</options>"
  103 + var option = "<option value='"+ response.id +"'>"+ response.full_name +"</options>"
  104 + jQuery('#media-upload-form #parent_id').append(option_selected);
  105 + jQuery('#published-media #parent_id').append(option);
  106 + jQuery('#new_folder').val('');
  107 + },
  108 + error: function(response, textStatus, xhr) {
  109 + console.log(response);
  110 + console.log(textStatus);
  111 + },
  112 + complete: function(response){
  113 + jQuery("#new-folder-dialog").removeClass('fetching');
  114 + jQuery("#new-folder-dialog").dialog('close');
  115 + }
  116 + });
  117 + return false;
  118 +});
  119 +
  120 +jQuery('.text-editor-sidebar .header .icon-vertical-toggle').click(function(){
  121 + jQuery('#content').toggleClass('show-media-panel');
  122 + return false;
  123 +});
  124 +
  125 +jQuery('#new-folder-button').click(function(){
  126 + jQuery('#new-folder-dialog').dialog({modal: true});
  127 + return false;
  128 +});
... ...
public/stylesheets/application.css
... ... @@ -3443,11 +3443,18 @@ table.cms-articles .icon:hover {
3443 3443  
3444 3444 /* Text editors sidebar */
3445 3445  
3446   -.controller-cms div.with_media_panel {
  3446 +.controller-cms .with_media_panel {
3447 3447 float: left;
  3448 + width: 900px;
  3449 + transition: 1s 0.5s;
  3450 +}
  3451 +
  3452 +.controller-cms .show-media-panel .with_media_panel {
3448 3453 width: 600px;
  3454 + transition: 1s;
3449 3455 }
3450   -div.with_media_panel .formfield input[type="checkbox"] {
  3456 +
  3457 +.with_media_panel .formfield input[type="checkbox"] {
3451 3458 width: auto;
3452 3459 }
3453 3460  
... ... @@ -3466,6 +3473,11 @@ div.with_media_panel .formfield input[type=&quot;checkbox&quot;] {
3466 3473 float: right;
3467 3474 }
3468 3475  
  3476 +#media-upload-form .progress {
  3477 + background-color: #ddd;
  3478 + border-radius: 3px;
  3479 +}
  3480 +
3469 3481 #media-upload-form .bar {
3470 3482 height: 10px;
3471 3483 background: #729fcf;
... ... @@ -3496,13 +3508,14 @@ div.with_media_panel .formfield input[type=&quot;checkbox&quot;] {
3496 3508 }
3497 3509  
3498 3510 #media-upload-box .upload .file-name{
3499   - width: 87%;
  3511 + width: 86%;
3500 3512 white-space: nowrap;
3501 3513 overflow: hidden;
3502 3514 text-overflow: ellipsis;
3503 3515 }
3504 3516  
3505 3517 #media-upload-box .upload .percentage {
  3518 + text-align: right;
3506 3519 width: 12%;
3507 3520 }
3508 3521  
... ... @@ -3512,6 +3525,14 @@ div.with_media_panel .formfield input[type=&quot;checkbox&quot;] {
3512 3525 width: 280px;
3513 3526 right: 20px;
3514 3527 top: 70px;
  3528 + max-height: 45px;
  3529 + overflow: hidden;
  3530 + transition: 1s;
  3531 +}
  3532 +
  3533 +.show-media-panel .text-editor-sidebar {
  3534 + max-height: 1200px;
  3535 + transition: 1s 0.5s;
3515 3536 }
3516 3537  
3517 3538 .text-editor-sidebar-box {
... ... @@ -3521,12 +3542,23 @@ div.with_media_panel .formfield input[type=&quot;checkbox&quot;] {
3521 3542 margin-bottom: 10px;
3522 3543 }
3523 3544  
3524   -.text-editor-sidebar-box .header {
3525   - margin: -10px -10px 0px -10px;
3526   - padding: 10px;
3527   - font-weight: bold;
3528   - border-bottom: 1px solid #d3d7cf;
3529   - background-color: #eeeeec;
  3545 +.text-editor-sidebar .header {
  3546 + margin: 0 0 10px 0;
  3547 + padding: 10px;
  3548 + font-weight: bold;
  3549 + border: 1px solid #d3d7cf;
  3550 + background-color: #eeeeec;
  3551 + background-repeat: no-repeat;
  3552 + background-position: 98% 10px;
  3553 + position: relative;
  3554 +}
  3555 +
  3556 +.text-editor-sidebar .header .icon-vertical-toggle {
  3557 + position: absolute;
  3558 + right: 6px;
  3559 + top: 6px;
  3560 + padding-top: 0px;
  3561 + padding-bottom: 0px;
3530 3562 }
3531 3563  
3532 3564 .text-editor-sidebar code,
... ... @@ -3601,6 +3633,7 @@ div.with_media_panel .formfield input[type=&quot;checkbox&quot;] {
3601 3633 .text-editor-sidebar select,
3602 3634 .text-editor-sidebar input {
3603 3635 width: 100%;
  3636 + margin-bottom: 5px;
3604 3637 }
3605 3638  
3606 3639 .text-editor-sidebar .items :hover,
... ... @@ -3639,10 +3672,6 @@ div.with_media_panel .formfield input[type=&quot;checkbox&quot;] {
3639 3672 margin-top: 4px;
3640 3673 }
3641 3674  
3642   -.text-editor-sidebar .header {
3643   - background-repeat: no-repeat;
3644   - background-position: 98% 10px;
3645   -}
3646 3675 .text-editor-sidebar .media-upload-error {
3647 3676 color: red;
3648 3677 }
... ... @@ -6918,3 +6947,7 @@ li.profile-activity-item.upload_image .activity-gallery-images-count-1 img {
6918 6947 .fetching {
6919 6948 opacity: 0.3;
6920 6949 }
  6950 +
  6951 +body .ui-widget-overlay {
  6952 + background: #000;
  6953 +}
... ...