Commit 3639698b72a6923380933c10b7930ab045e9d4bd
Exists in
master
and in
29 other branches
Merge branch 'unb-gama/noosfero-AI2897-environment_theme'
Showing
28 changed files
with
830 additions
and
631 deletions
Show diff stats
@@ -0,0 +1,75 @@ | @@ -0,0 +1,75 @@ | ||
1 | +class ProfileThemesController < ThemesController | ||
2 | + | ||
3 | + needs_profile | ||
4 | + | ||
5 | + protect 'edit_appearance', :profile | ||
6 | + | ||
7 | + no_design_blocks | ||
8 | + | ||
9 | + def target | ||
10 | + @target = profile | ||
11 | + end | ||
12 | + | ||
13 | + def new | ||
14 | + if !request.xhr? | ||
15 | + id = params[:name] ? params[:name].to_slug : 'my-theme' | ||
16 | + t = Theme.new(id, :name => params[:name], :owner => profile, :public => false) | ||
17 | + t.save | ||
18 | + redirect_to :action => 'index' | ||
19 | + else | ||
20 | + render :action => 'new', :layout => false | ||
21 | + end | ||
22 | + end | ||
23 | + | ||
24 | + def edit | ||
25 | + @theme = profile.find_theme(params[:id]) | ||
26 | + @css_files = @theme.css_files | ||
27 | + @image_files = @theme.image_files | ||
28 | + end | ||
29 | + | ||
30 | + def add_css | ||
31 | + @theme = profile.find_theme(params[:id]) | ||
32 | + if request.xhr? | ||
33 | + render :action => 'add_css', :layout => false | ||
34 | + else | ||
35 | + @theme.add_css(params[:css]) | ||
36 | + redirect_to :action => 'edit', :id => @theme.id | ||
37 | + end | ||
38 | + end | ||
39 | + | ||
40 | + def css_editor | ||
41 | + @theme = profile.find_theme(params[:id]) | ||
42 | + @css = params[:css] | ||
43 | + | ||
44 | + @code = @theme.read_css(@css) | ||
45 | + render :action => 'css_editor', :layout => false | ||
46 | + end | ||
47 | + | ||
48 | + post_only :update_css | ||
49 | + def update_css | ||
50 | + @theme = profile.find_theme(params[:id]) | ||
51 | + @theme.update_css(params[:css], params[:csscode]) | ||
52 | + redirect_to :action => 'edit', :id => @theme.id | ||
53 | + end | ||
54 | + | ||
55 | + def add_image | ||
56 | + @theme = profile.find_theme(params[:id]) | ||
57 | + if request.xhr? | ||
58 | + render :action => 'add_image', :layout => false | ||
59 | + else | ||
60 | + @theme.add_image(params[:image].original_filename, params[:image].read) | ||
61 | + redirect_to :action => 'edit', :id => @theme.id | ||
62 | + end | ||
63 | + end | ||
64 | + | ||
65 | + def start_test | ||
66 | + session[:theme] = params[:id] | ||
67 | + redirect_to :controller => 'content_viewer', :profile => profile.identifier, :action => 'view_page' | ||
68 | + end | ||
69 | + | ||
70 | + def stop_test | ||
71 | + session[:theme] = nil | ||
72 | + redirect_to :action => 'index' | ||
73 | + end | ||
74 | + | ||
75 | +end |
app/controllers/my_profile/themes_controller.rb
@@ -1,91 +0,0 @@ | @@ -1,91 +0,0 @@ | ||
1 | -class ThemesController < MyProfileController | ||
2 | - | ||
3 | - protect 'edit_appearance', :profile | ||
4 | - no_design_blocks | ||
5 | - | ||
6 | - def set | ||
7 | - profile.update_theme(params[:id]) | ||
8 | - redirect_to :action => 'index' | ||
9 | - end | ||
10 | - | ||
11 | - def unset | ||
12 | - profile.update_theme(nil) | ||
13 | - redirect_to :action => 'index' | ||
14 | - end | ||
15 | - | ||
16 | - def index | ||
17 | - @themes = profile.environment.themes + Theme.approved_themes(profile) | ||
18 | - @current_theme = profile.theme | ||
19 | - | ||
20 | - @layout_templates = LayoutTemplate.all | ||
21 | - @current_template = profile.layout_template | ||
22 | - end | ||
23 | - | ||
24 | - def new | ||
25 | - if !request.xhr? | ||
26 | - id = params[:name] ? params[:name].to_slug : 'my-theme' | ||
27 | - t = Theme.new(id, :name => params[:name], :owner => profile, :public => false) | ||
28 | - t.save | ||
29 | - redirect_to :action => 'index' | ||
30 | - else | ||
31 | - render :action => 'new', :layout => false | ||
32 | - end | ||
33 | - end | ||
34 | - | ||
35 | - def edit | ||
36 | - @theme = profile.find_theme(params[:id]) | ||
37 | - @css_files = @theme.css_files | ||
38 | - @image_files = @theme.image_files | ||
39 | - end | ||
40 | - | ||
41 | - def add_css | ||
42 | - @theme = profile.find_theme(params[:id]) | ||
43 | - if request.xhr? | ||
44 | - render :action => 'add_css', :layout => false | ||
45 | - else | ||
46 | - @theme.add_css(params[:css]) | ||
47 | - redirect_to :action => 'edit', :id => @theme.id | ||
48 | - end | ||
49 | - end | ||
50 | - | ||
51 | - def css_editor | ||
52 | - @theme = profile.find_theme(params[:id]) | ||
53 | - @css = params[:css] | ||
54 | - | ||
55 | - @code = @theme.read_css(@css) | ||
56 | - render :action => 'css_editor', :layout => false | ||
57 | - end | ||
58 | - | ||
59 | - post_only :update_css | ||
60 | - def update_css | ||
61 | - @theme = profile.find_theme(params[:id]) | ||
62 | - @theme.update_css(params[:css], params[:csscode]) | ||
63 | - redirect_to :action => 'edit', :id => @theme.id | ||
64 | - end | ||
65 | - | ||
66 | - def add_image | ||
67 | - @theme = profile.find_theme(params[:id]) | ||
68 | - if request.xhr? | ||
69 | - render :action => 'add_image', :layout => false | ||
70 | - else | ||
71 | - @theme.add_image(params[:image].original_filename, params[:image].read) | ||
72 | - redirect_to :action => 'edit', :id => @theme.id | ||
73 | - end | ||
74 | - end | ||
75 | - | ||
76 | - def start_test | ||
77 | - session[:theme] = params[:id] | ||
78 | - redirect_to :controller => 'content_viewer', :profile => profile.identifier, :action => 'view_page' | ||
79 | - end | ||
80 | - | ||
81 | - def stop_test | ||
82 | - session[:theme] = nil | ||
83 | - redirect_to :action => 'index' | ||
84 | - end | ||
85 | - | ||
86 | - def set_layout_template | ||
87 | - profile.update_layout_template(params[:id]) | ||
88 | - redirect_to :action => 'index' | ||
89 | - end | ||
90 | - | ||
91 | -end |
@@ -0,0 +1,42 @@ | @@ -0,0 +1,42 @@ | ||
1 | +class ThemesController < ApplicationController | ||
2 | + | ||
3 | + before_filter :login_required | ||
4 | + | ||
5 | + no_design_blocks | ||
6 | + | ||
7 | + # attr_reader :target | ||
8 | + | ||
9 | + def target | ||
10 | + @target | ||
11 | + end | ||
12 | + | ||
13 | + def index | ||
14 | + @environment = environment | ||
15 | + @themes = environment.themes + Theme.approved_themes(target) | ||
16 | + | ||
17 | + @current_theme = target.theme | ||
18 | + | ||
19 | + @layout_templates = LayoutTemplate.all | ||
20 | + @current_template = target.layout_template | ||
21 | + end | ||
22 | + | ||
23 | + def set | ||
24 | + target.update_theme(params[:id]) | ||
25 | + redirect_to :action => 'index' | ||
26 | + end | ||
27 | + | ||
28 | + def unset | ||
29 | + if target.kind_of?(Environment) | ||
30 | + target.update_theme('default') | ||
31 | + else | ||
32 | + target.update_theme(nil) | ||
33 | + end | ||
34 | + redirect_to :action => 'index' | ||
35 | + end | ||
36 | + | ||
37 | + def set_layout_template | ||
38 | + target.update_layout_template(params[:id]) | ||
39 | + redirect_to :action => 'index' | ||
40 | + end | ||
41 | + | ||
42 | +end |
app/models/environment.rb
@@ -26,7 +26,8 @@ class Environment < ActiveRecord::Base | @@ -26,7 +26,8 @@ class Environment < ActiveRecord::Base | ||
26 | 'manage_environment_users' => N_('Manage environment users'), | 26 | 'manage_environment_users' => N_('Manage environment users'), |
27 | 'manage_environment_templates' => N_('Manage environment templates'), | 27 | 'manage_environment_templates' => N_('Manage environment templates'), |
28 | 'manage_environment_licenses' => N_('Manage environment licenses'), | 28 | 'manage_environment_licenses' => N_('Manage environment licenses'), |
29 | - 'manage_environment_trusted_sites' => N_('Manage environment trusted sites') | 29 | + 'manage_environment_trusted_sites' => N_('Manage environment trusted sites'), |
30 | + 'edit_appearance' => N_('Edit appearance'), | ||
30 | } | 31 | } |
31 | 32 | ||
32 | module Roles | 33 | module Roles |
@@ -677,6 +678,16 @@ class Environment < ActiveRecord::Base | @@ -677,6 +678,16 @@ class Environment < ActiveRecord::Base | ||
677 | end | 678 | end |
678 | end | 679 | end |
679 | 680 | ||
681 | + def update_theme(theme) | ||
682 | + self.theme = theme | ||
683 | + self.save! | ||
684 | + end | ||
685 | + | ||
686 | + def update_layout_template(template) | ||
687 | + self.layout_template = template | ||
688 | + self.save! | ||
689 | + end | ||
690 | + | ||
680 | before_create do |env| | 691 | before_create do |env| |
681 | env.settings[:themes] ||= %w[ | 692 | env.settings[:themes] ||= %w[ |
682 | aluminium | 693 | aluminium |
app/views/admin_panel/index.rhtml
@@ -6,6 +6,7 @@ | @@ -6,6 +6,7 @@ | ||
6 | <tr><td><%= link_to _('Environment settings'), :action => 'site_info' %></td></tr> | 6 | <tr><td><%= link_to _('Environment settings'), :action => 'site_info' %></td></tr> |
7 | <tr><td><%= link_to _('Features'), :controller => 'features' %></td></tr> | 7 | <tr><td><%= link_to _('Features'), :controller => 'features' %></td></tr> |
8 | <tr><td><%= link_to _('Plugins'), :controller => 'plugins' %></td></tr> | 8 | <tr><td><%= link_to _('Plugins'), :controller => 'plugins' %></td></tr> |
9 | + <tr><td><%= link_to _('Appearance'), :controller =>'environment_themes' %></td></tr> | ||
9 | <tr><td><%= link_to _('Sideboxes'), :controller => 'environment_design'%></td></tr> | 10 | <tr><td><%= link_to _('Sideboxes'), :controller => 'environment_design'%></td></tr> |
10 | <tr><td><%= link_to _('Homepage'), :action => 'set_portal_community' %></td></tr> | 11 | <tr><td><%= link_to _('Homepage'), :action => 'set_portal_community' %></td></tr> |
11 | <tr><td><%= link_to _('Licenses'), :controller =>'licenses' %></td></tr> | 12 | <tr><td><%= link_to _('Licenses'), :controller =>'licenses' %></td></tr> |
app/views/profile_editor/index.rhtml
@@ -22,7 +22,7 @@ | @@ -22,7 +22,7 @@ | ||
22 | 22 | ||
23 | <%= control_panel_button(_('Edit sideboxes'), 'blocks', :controller => 'profile_design', :action => 'index') %> | 23 | <%= control_panel_button(_('Edit sideboxes'), 'blocks', :controller => 'profile_design', :action => 'index') %> |
24 | 24 | ||
25 | - <%= control_panel_button(_('Edit Appearance'), 'design-editor', :controller => 'themes', :action => 'index') %> | 25 | + <%= control_panel_button(_('Edit Appearance'), 'design-editor', :controller => 'profile_themes', :action => 'index') %> |
26 | 26 | ||
27 | <%= control_panel_button(_('Edit Header and Footer'), 'header-and-footer', :controller => 'profile_editor', :action => 'header_footer') unless profile.enterprise? && environment.enabled?('disable_header_and_footer') && !user.is_admin?(environment) %> | 27 | <%= control_panel_button(_('Edit Header and Footer'), 'header-and-footer', :controller => 'profile_editor', :action => 'header_footer') unless profile.enterprise? && environment.enabled?('disable_header_and_footer') && !user.is_admin?(environment) %> |
28 | 28 |
@@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
1 | +<h2><%= _('Add a CSS file') %></h2> | ||
2 | + | ||
3 | +<% form_tag do %> | ||
4 | + <%= labelled_form_field(_('File name'), text_field_tag('css')) %> | ||
5 | + | ||
6 | + <% button_bar do %> | ||
7 | + <%= submit_button(:add, _('Add')) %> | ||
8 | + <%= lightbox_close_button(_('Cancel')) %> | ||
9 | + <% end %> | ||
10 | + | ||
11 | +<% end %> |
@@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
1 | +<h2><%= _('CSS code: "%s"') % @css %></h2> | ||
2 | + | ||
3 | +<% form_tag({:action => 'update_css', :id => @theme.id }, :name => 'csscode_form') do %> | ||
4 | + <%= hidden_field_tag('css', @css) %> | ||
5 | + <%= text_area_tag('csscode', @code, :id => "codepressWindow", :class => 'codepress css') %> | ||
6 | + <% button_bar do %> | ||
7 | + <%= submit_button(:save, _('Save')) %> | ||
8 | + <% end %> | ||
9 | +<% end %> | ||
10 | + | ||
11 | +<!--<script type='text/javascript'>--> | ||
12 | + <!--CodePress.run();--> | ||
13 | +<!--</script>--> |
@@ -0,0 +1,41 @@ | @@ -0,0 +1,41 @@ | ||
1 | +<form> | ||
2 | + <%# FIXME %> | ||
3 | + <h1 id='theme-name'> | ||
4 | + <%= _('Editing theme "%s"') % @theme.name %> | ||
5 | + <%= button(:eyes, _('Preview this theme'), :action => 'start_test', :id => @theme.id) %> | ||
6 | + <%= button(:back, _('Back'), :action => 'index') %> | ||
7 | + </h1> | ||
8 | +</form> | ||
9 | + | ||
10 | + | ||
11 | +<div id='css-files-list'> | ||
12 | + <h2><%= _('CSS files') %></h2> | ||
13 | + <ul> | ||
14 | + <% for css in @css_files %> | ||
15 | + <li><%= link_to_remote(css, :url => { :action => 'css_editor', :id => @theme.id, :css => css }, :update => { :success => 'css-code' }) %></li> | ||
16 | + <% end %> | ||
17 | + </ul> | ||
18 | + <% button_bar do %> | ||
19 | + <%= lightbox_button(:add, _('New CSS'), :action => 'add_css', :id => @theme.id) %> | ||
20 | + <% end %> | ||
21 | +</div> | ||
22 | + | ||
23 | +<div id='image-files-list'> | ||
24 | + <h2><%= _('Images') %></h2> | ||
25 | + <ul> | ||
26 | + <% for image in @image_files %> | ||
27 | + <li><%= image_tag("/user_themes/#{@theme.id}/images/#{image}") %></li> | ||
28 | + <% end %> | ||
29 | + </ul> | ||
30 | + <% button_bar do %> | ||
31 | + <%= lightbox_button(:add, _('Add image'), :action => 'add_image', :id => @theme.id) %> | ||
32 | + <% end %> | ||
33 | +</div> | ||
34 | + | ||
35 | +<div id='css-code'> | ||
36 | + <center style='padding-top: 5em;'> | ||
37 | + <em><%= _('Select a CSS file to edit') %></em> | ||
38 | + </center> | ||
39 | +</div> | ||
40 | + | ||
41 | +<%# javascript_include_tag 'codepress/codepress' %> |
@@ -0,0 +1,48 @@ | @@ -0,0 +1,48 @@ | ||
1 | +<%= render :partial => 'themes/select_template' %> | ||
2 | +<%= render :partial => 'themes/select_theme' %> | ||
3 | + | ||
4 | +<% if environment.enabled?('user_themes') %> | ||
5 | + <div id="user-themes" class="list-options"> | ||
6 | + | ||
7 | + <h2><%= _('My themes') %></h2> | ||
8 | + | ||
9 | + <% for themes in profile.themes.in_groups_of(3) %> | ||
10 | + <div class="list-group"> | ||
11 | + <% for theme in themes %><%= | ||
12 | + if theme | ||
13 | + | ||
14 | + selected = theme.id == @current_theme | ||
15 | + sel_html = selected ? | ||
16 | + content_tag('big', _('(current)') ) : | ||
17 | + link_to(_('Use this theme'), :action => 'set', :id => theme.id) | ||
18 | + | ||
19 | + content_tag( 'div', | ||
20 | + image_tag( | ||
21 | + '/images/icons-app/design-editor.png', | ||
22 | + :alt => (_('The "%s" theme.') % theme.name)) + | ||
23 | + '<div class="opt-info">' + | ||
24 | + content_tag('strong', theme.name, :class => 'name') + | ||
25 | + ' <br/> '+ sel_html +' <br/> ' + | ||
26 | + link_to(_('Edit this theme'), :action => 'edit', :id => theme.id) + | ||
27 | + ' <br/> ' + | ||
28 | + link_to(_('Test this theme'), :action => 'start_test', :id => theme.id) + | ||
29 | + '</div>', | ||
30 | + :class => 'theme-opt list-opt' + (selected ? ' selected' : '') | ||
31 | + ) | ||
32 | + | ||
33 | + end | ||
34 | + %><% end %> | ||
35 | + </div> | ||
36 | + <% end %> | ||
37 | + | ||
38 | + </div><!-- end id="user-themes" --> | ||
39 | +<% end %> | ||
40 | + | ||
41 | +<br style="clear:both" /> | ||
42 | + | ||
43 | +<% button_bar do %> | ||
44 | + <% if environment.enabled?('user_themes') %> | ||
45 | + <%= lightbox_button(:add, _('New theme ...'), :action => 'new') %> | ||
46 | + <% end %> | ||
47 | + <%= button(:back, _('Back'), :controller => 'profile_editor', :action => 'index') %> | ||
48 | +<% end %> |
@@ -0,0 +1,10 @@ | @@ -0,0 +1,10 @@ | ||
1 | +<h2><%= _('Create new theme') %></h2> | ||
2 | + | ||
3 | +<% form_tag(:action => 'new') do %> | ||
4 | + | ||
5 | + <%= labelled_form_field(_('Name of the new theme:'), text_field_tag(:name)) %> | ||
6 | + | ||
7 | + <% button_bar do %> | ||
8 | + <%= submit_button(:save, _('Create')) %> | ||
9 | + <% end %> | ||
10 | +<% end %> |
app/views/shared/theme_test_panel.rhtml
@@ -6,8 +6,8 @@ | @@ -6,8 +6,8 @@ | ||
6 | <p><small><em><%= _('You can move this window away to have a better visualization of specific parts of screen.') %></em></small></p> | 6 | <p><small><em><%= _('You can move this window away to have a better visualization of specific parts of screen.') %></em></small></p> |
7 | 7 | ||
8 | <% button_bar do %> | 8 | <% button_bar do %> |
9 | - <%= button(:ok, _('Finished testing'), :controller => 'themes', :profile => theme_owner, :action => 'stop_test', :id => current_theme) %> | ||
10 | - <%= button(:edit, _('Edit theme'), :controller => 'themes', :profile => theme_owner, :action => 'edit', :id => current_theme) %> | 9 | + <%= button(:ok, _('Finished testing'), :controller => 'profile_themes', :profile => theme_owner, :action => 'stop_test', :id => current_theme) %> |
10 | + <%= button(:edit, _('Edit theme'), :controller => 'profile_themes', :profile => theme_owner, :action => 'edit', :id => current_theme) %> | ||
11 | <% end %> | 11 | <% end %> |
12 | </div> | 12 | </div> |
13 | <%= draggable_element('theme-test-panel') %> | 13 | <%= draggable_element('theme-test-panel') %> |
@@ -0,0 +1,35 @@ | @@ -0,0 +1,35 @@ | ||
1 | +<h1><%= _('Editing Appearance') %></h1> | ||
2 | + | ||
3 | +<div id="template-options" class="list-options"> | ||
4 | + | ||
5 | +<h2><%= _('Select template') %></h2> | ||
6 | + | ||
7 | +<% for templates in @layout_templates.in_groups_of(3) %> | ||
8 | + <div class="list-group"> | ||
9 | + <% for template in templates %><%= | ||
10 | + if template | ||
11 | + base_content = image_tag( | ||
12 | + "/designs/templates/#{template.id}/thumbnail.png", | ||
13 | + :alt => _('The "%s" template')) + | ||
14 | + '<div class="opt-info">'.html_safe + | ||
15 | + content_tag('strong', template.name, :class => 'name') + | ||
16 | + ' <br/> '.html_safe | ||
17 | + | ||
18 | + if @current_template == template.id # selected | ||
19 | + content_tag( 'div', | ||
20 | + base_content + content_tag('big', _('(current)') ) +'</div>'.html_safe, | ||
21 | + :class => 'template-opt list-opt selected') | ||
22 | + else # Not selected | ||
23 | + link_to( | ||
24 | + base_content +'</div>'.html_safe, | ||
25 | + { :action => 'set_layout_template', :id => template.id }, | ||
26 | + :class => 'template-opt list-opt') | ||
27 | + end | ||
28 | + | ||
29 | + end | ||
30 | + %><% end %> | ||
31 | + </div> | ||
32 | +<% end %> | ||
33 | + | ||
34 | +</div><!-- end id="template-options" --> | ||
35 | + |
@@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
1 | +<% if !@themes.empty? %> | ||
2 | +<div id="theme-options" class="list-options"> | ||
3 | + | ||
4 | +<h2><%= _('Select theme') %></h2> | ||
5 | +<%= button :home, _('Use the default theme'), { :action => 'unset'}, :method => 'post', :confirm => _('Are you sure you want to use the environment default theme?') %> | ||
6 | + | ||
7 | +<% for themes in @themes.in_groups_of(3) %> | ||
8 | + <div class="list-group"> | ||
9 | + <% for theme in themes %><%= | ||
10 | + if theme | ||
11 | + | ||
12 | + base_content = image_tag( | ||
13 | + "/designs/themes/#{theme.id}/preview.png", | ||
14 | + :alt => (_('The "%s" theme.') % theme.name)) + | ||
15 | + '<div class="opt-info">'.html_safe + | ||
16 | + content_tag('strong', theme.name, :class => 'name') + | ||
17 | + ' <br/> '.html_safe | ||
18 | + | ||
19 | + if theme.id == @current_theme # selected | ||
20 | + content_tag( 'div', | ||
21 | + base_content + content_tag('big', _('(current)') ) +'</div>'.html_safe, | ||
22 | + :class => 'theme-opt list-opt selected') | ||
23 | + else # Not selected | ||
24 | + link_to( | ||
25 | + base_content + '</div>'.html_safe, | ||
26 | + { :action => 'set', :id => theme.id }, | ||
27 | + :class => 'theme-opt list-opt') | ||
28 | + end | ||
29 | + | ||
30 | + end | ||
31 | + %><% end %> | ||
32 | + </div> | ||
33 | +<% end %> | ||
34 | + | ||
35 | +</div><!-- end id="theme-options" --> | ||
36 | +<% end %> | ||
37 | + |
app/views/themes/add_css.rhtml
@@ -1,11 +0,0 @@ | @@ -1,11 +0,0 @@ | ||
1 | -<h2><%= _('Add a CSS file') %></h2> | ||
2 | - | ||
3 | -<% form_tag do %> | ||
4 | - <%= labelled_form_field(_('File name'), text_field_tag('css')) %> | ||
5 | - | ||
6 | - <% button_bar do %> | ||
7 | - <%= submit_button(:add, _('Add')) %> | ||
8 | - <%= lightbox_close_button(_('Cancel')) %> | ||
9 | - <% end %> | ||
10 | - | ||
11 | -<% end %> |
app/views/themes/add_image.rhtml
app/views/themes/css_editor.rhtml
@@ -1,13 +0,0 @@ | @@ -1,13 +0,0 @@ | ||
1 | -<h2><%= _('CSS code: "%s"') % @css %></h2> | ||
2 | - | ||
3 | -<% form_tag({:action => 'update_css', :id => @theme.id }, :name => 'csscode_form') do %> | ||
4 | - <%= hidden_field_tag('css', @css) %> | ||
5 | - <%= text_area_tag('csscode', @code, :id => "codepressWindow", :class => 'codepress css') %> | ||
6 | - <% button_bar do %> | ||
7 | - <%= submit_button(:save, _('Save')) %> | ||
8 | - <% end %> | ||
9 | -<% end %> | ||
10 | - | ||
11 | -<!--<script type='text/javascript'>--> | ||
12 | - <!--CodePress.run();--> | ||
13 | -<!--</script>--> |
app/views/themes/edit.rhtml
@@ -1,41 +0,0 @@ | @@ -1,41 +0,0 @@ | ||
1 | -<form> | ||
2 | - <%# FIXME %> | ||
3 | - <h1 id='theme-name'> | ||
4 | - <%= _('Editing theme "%s"') % @theme.name %> | ||
5 | - <%= button(:eyes, _('Preview this theme'), :action => 'start_test', :id => @theme.id) %> | ||
6 | - <%= button(:back, _('Back'), :action => 'index') %> | ||
7 | - </h1> | ||
8 | -</form> | ||
9 | - | ||
10 | - | ||
11 | -<div id='css-files-list'> | ||
12 | - <h2><%= _('CSS files') %></h2> | ||
13 | - <ul> | ||
14 | - <% for css in @css_files %> | ||
15 | - <li><%= link_to_remote(css, :url => { :action => 'css_editor', :id => @theme.id, :css => css }, :update => { :success => 'css-code' }) %></li> | ||
16 | - <% end %> | ||
17 | - </ul> | ||
18 | - <% button_bar do %> | ||
19 | - <%= lightbox_button(:add, _('New CSS'), :action => 'add_css', :id => @theme.id) %> | ||
20 | - <% end %> | ||
21 | -</div> | ||
22 | - | ||
23 | -<div id='image-files-list'> | ||
24 | - <h2><%= _('Images') %></h2> | ||
25 | - <ul> | ||
26 | - <% for image in @image_files %> | ||
27 | - <li><%= image_tag("/user_themes/#{@theme.id}/images/#{image}") %></li> | ||
28 | - <% end %> | ||
29 | - </ul> | ||
30 | - <% button_bar do %> | ||
31 | - <%= lightbox_button(:add, _('Add image'), :action => 'add_image', :id => @theme.id) %> | ||
32 | - <% end %> | ||
33 | -</div> | ||
34 | - | ||
35 | -<div id='css-code'> | ||
36 | - <center style='padding-top: 5em;'> | ||
37 | - <em><%= _('Select a CSS file to edit') %></em> | ||
38 | - </center> | ||
39 | -</div> | ||
40 | - | ||
41 | -<%# javascript_include_tag 'codepress/codepress' %> |
app/views/themes/index.rhtml
@@ -1,120 +0,0 @@ | @@ -1,120 +0,0 @@ | ||
1 | -<h1><%= _('Editing Appearance') %></h1> | ||
2 | - | ||
3 | -<div id="template-options" class="list-options"> | ||
4 | - | ||
5 | -<h2><%= _('Select template') %></h2> | ||
6 | - | ||
7 | -<% for templates in @layout_templates.in_groups_of(3) %> | ||
8 | - <div class="list-group"> | ||
9 | - <% for template in templates %><%= | ||
10 | - if template | ||
11 | - base_content = image_tag( | ||
12 | - "/designs/templates/#{template.id}/thumbnail.png", | ||
13 | - :alt => _('The "%s" template')) + | ||
14 | - '<div class="opt-info">'.html_safe + | ||
15 | - content_tag('strong', template.name, :class => 'name') + | ||
16 | - ' <br/> '.html_safe | ||
17 | - | ||
18 | - if @current_template == template.id # selected | ||
19 | - content_tag( 'div', | ||
20 | - base_content + content_tag('big', _('(current)') ) +'</div>'.html_safe, | ||
21 | - :class => 'template-opt list-opt selected') | ||
22 | - else # Not selected | ||
23 | - link_to( | ||
24 | - base_content +'</div>'.html_safe, | ||
25 | - { :action => 'set_layout_template', :id => template.id }, | ||
26 | - :class => 'template-opt list-opt') | ||
27 | - end | ||
28 | - | ||
29 | - end | ||
30 | - %><% end %> | ||
31 | - </div> | ||
32 | -<% end %> | ||
33 | - | ||
34 | -</div><!-- end id="template-options" --> | ||
35 | - | ||
36 | - | ||
37 | -<% if !@themes.empty? %> | ||
38 | -<div id="theme-options" class="list-options"> | ||
39 | - | ||
40 | -<h2><%= _('Select theme') %></h2> | ||
41 | -<%= button :home, _('Use the default theme'), { :action => 'unset'}, :method => 'post', :confirm => _('Are you sure you want to use the environment default theme?') %> | ||
42 | - | ||
43 | -<% for themes in @themes.in_groups_of(3) %> | ||
44 | - <div class="list-group"> | ||
45 | - <% for theme in themes %><%= | ||
46 | - if theme | ||
47 | - | ||
48 | - base_content = image_tag( | ||
49 | - "/designs/themes/#{theme.id}/preview.png", | ||
50 | - :alt => (_('The "%s" theme.') % theme.name)) + | ||
51 | - '<div class="opt-info">'.html_safe + | ||
52 | - content_tag('strong', theme.name, :class => 'name') + | ||
53 | - ' <br/> '.html_safe | ||
54 | - | ||
55 | - if theme.id == @current_theme # selected | ||
56 | - content_tag( 'div', | ||
57 | - base_content + content_tag('big', _('(current)') ) +'</div>'.html_safe, | ||
58 | - :class => 'theme-opt list-opt selected') | ||
59 | - else # Not selected | ||
60 | - link_to( | ||
61 | - base_content + '</div>'.html_safe, | ||
62 | - { :action => 'set', :id => theme.id }, | ||
63 | - :class => 'theme-opt list-opt') | ||
64 | - end | ||
65 | - | ||
66 | - end | ||
67 | - %><% end %> | ||
68 | - </div> | ||
69 | -<% end %> | ||
70 | - | ||
71 | -</div><!-- end id="theme-options" --> | ||
72 | -<% end %> | ||
73 | - | ||
74 | - | ||
75 | - | ||
76 | -<% if environment.enabled?('user_themes') %> | ||
77 | - <div id="user-themes" class="list-options"> | ||
78 | - | ||
79 | - <h2><%= _('My themes') %></h2> | ||
80 | - | ||
81 | - <% for themes in profile.themes.in_groups_of(3) %> | ||
82 | - <div class="list-group"> | ||
83 | - <% for theme in themes %><%= | ||
84 | - if theme | ||
85 | - | ||
86 | - selected = theme.id == @current_theme | ||
87 | - sel_html = selected ? | ||
88 | - content_tag('big', _('(current)') ) : | ||
89 | - link_to(_('Use this theme'), :action => 'set', :id => theme.id) | ||
90 | - | ||
91 | - content_tag( 'div', | ||
92 | - image_tag( | ||
93 | - '/images/icons-app/design-editor.png', | ||
94 | - :alt => (_('The "%s" theme.') % theme.name)) + | ||
95 | - '<div class="opt-info">' + | ||
96 | - content_tag('strong', theme.name, :class => 'name') + | ||
97 | - ' <br/> '+ sel_html +' <br/> ' + | ||
98 | - link_to(_('Edit this theme'), :action => 'edit', :id => theme.id) + | ||
99 | - ' <br/> ' + | ||
100 | - link_to(_('Test this theme'), :action => 'start_test', :id => theme.id) + | ||
101 | - '</div>', | ||
102 | - :class => 'theme-opt list-opt' + (selected ? ' selected' : '') | ||
103 | - ) | ||
104 | - | ||
105 | - end | ||
106 | - %><% end %> | ||
107 | - </div> | ||
108 | - <% end %> | ||
109 | - | ||
110 | - </div><!-- end id="user-themes" --> | ||
111 | -<% end %> | ||
112 | - | ||
113 | -<br style="clear:both" /> | ||
114 | - | ||
115 | -<% button_bar do %> | ||
116 | - <% if environment.enabled?('user_themes') %> | ||
117 | - <%= lightbox_button(:add, _('New theme ...'), :action => 'new') %> | ||
118 | - <% end %> | ||
119 | - <%= button(:back, _('Back'), :controller => 'profile_editor', :action => 'index') %> | ||
120 | -<% end %> |
app/views/themes/new.rhtml
@@ -1,10 +0,0 @@ | @@ -1,10 +0,0 @@ | ||
1 | -<h2><%= _('Create new theme') %></h2> | ||
2 | - | ||
3 | -<% form_tag(:action => 'new') do %> | ||
4 | - | ||
5 | - <%= labelled_form_field(_('Name of the new theme:'), text_field_tag(:name)) %> | ||
6 | - | ||
7 | - <% button_bar do %> | ||
8 | - <%= submit_button(:save, _('Create')) %> | ||
9 | - <% end %> | ||
10 | -<% end %> |
public/stylesheets/application.css
@@ -4323,7 +4323,7 @@ h1#agenda-title { | @@ -4323,7 +4323,7 @@ h1#agenda-title { | ||
4323 | padding-left: 0px; | 4323 | padding-left: 0px; |
4324 | list-style-type: none; | 4324 | list-style-type: none; |
4325 | } | 4325 | } |
4326 | -/* ==> public/stylesheets/controller_themes.css <== */ | 4326 | +/* ==> public/stylesheets/profile_controller_themes.css <== */ |
4327 | 4327 | ||
4328 | .action-themes-index .button-bar { | 4328 | .action-themes-index .button-bar { |
4329 | padding-top: 20px; | 4329 | padding-top: 20px; |
@@ -4397,23 +4397,23 @@ h1#agenda-title { | @@ -4397,23 +4397,23 @@ h1#agenda-title { | ||
4397 | #user-themes a:hover { | 4397 | #user-themes a:hover { |
4398 | text-decoration: underline; | 4398 | text-decoration: underline; |
4399 | } | 4399 | } |
4400 | -.controller-themes .template-preview-cell { | 4400 | +.controller-profile_themes .template-preview-cell { |
4401 | text-align: center; | 4401 | text-align: center; |
4402 | } | 4402 | } |
4403 | -.controller-themes .theme-preview { | 4403 | +.controller-profile_themes .theme-preview { |
4404 | border: 1px solid #BBB; | 4404 | border: 1px solid #BBB; |
4405 | } | 4405 | } |
4406 | -.controller-themes #css-files-list h2, .controller-themes #image-files-list h2 { | 4406 | +.controller-profile_themes #css-files-list h2, .controller-profile_themes #image-files-list h2 { |
4407 | margin-top: 0px; | 4407 | margin-top: 0px; |
4408 | } | 4408 | } |
4409 | -.controller-themes #css-files-list ul, .controller-themes #image-files-list ul, .controller-themes #css-code textarea { | 4409 | +.controller-profile_themes #css-files-list ul, .controller-profile_themes #image-files-list ul, .controller-profile_themes #css-code textarea { |
4410 | height: 280px; | 4410 | height: 280px; |
4411 | } | 4411 | } |
4412 | -.controller-themes #css-files-list ul, .controller-themes #image-files-list ul { | 4412 | +.controller-profile_themes #css-files-list ul, .controller-profile_themes #image-files-list ul { |
4413 | overflow: auto; | 4413 | overflow: auto; |
4414 | } | 4414 | } |
4415 | /* header stuff */ | 4415 | /* header stuff */ |
4416 | -.controller-themes #theme-name input { | 4416 | +.controller-profile_themes #theme-name input { |
4417 | font-size: 18px; | 4417 | font-size: 18px; |
4418 | border: 1px solid black; | 4418 | border: 1px solid black; |
4419 | background: white; | 4419 | background: white; |
@@ -4422,78 +4422,78 @@ h1#agenda-title { | @@ -4422,78 +4422,78 @@ h1#agenda-title { | ||
4422 | } | 4422 | } |
4423 | /* files list */ | 4423 | /* files list */ |
4424 | 4424 | ||
4425 | -.controller-themes #css-files-list { | 4425 | +.controller-profile_themes #css-files-list { |
4426 | width: 200px; | 4426 | width: 200px; |
4427 | float: left; | 4427 | float: left; |
4428 | margin-left: 10px; | 4428 | margin-left: 10px; |
4429 | } | 4429 | } |
4430 | -.controller-themes #css-files-list ul { | 4430 | +.controller-profile_themes #css-files-list ul { |
4431 | margin: 0px; | 4431 | margin: 0px; |
4432 | padding-left: 0px; | 4432 | padding-left: 0px; |
4433 | background: white; | 4433 | background: white; |
4434 | border: 1px solid #bbb; | 4434 | border: 1px solid #bbb; |
4435 | } | 4435 | } |
4436 | -.controller-themes #css-files-list li { | 4436 | +.controller-profile_themes #css-files-list li { |
4437 | list-style: none; | 4437 | list-style: none; |
4438 | margin-bottom: 5px; | 4438 | margin-bottom: 5px; |
4439 | border-bottom: 1px solid #bbb; | 4439 | border-bottom: 1px solid #bbb; |
4440 | } | 4440 | } |
4441 | -.controller-themes #css-files-list li a { | 4441 | +.controller-profile_themes #css-files-list li a { |
4442 | display: block; | 4442 | display: block; |
4443 | padding: 1px 5px; | 4443 | padding: 1px 5px; |
4444 | } | 4444 | } |
4445 | -.controller-themes #css-files-list a:hover { | 4445 | +.controller-profile_themes #css-files-list a:hover { |
4446 | color: red; | 4446 | color: red; |
4447 | } | 4447 | } |
4448 | /* images list */ | 4448 | /* images list */ |
4449 | 4449 | ||
4450 | -.controller-themes #image-files-list { | 4450 | +.controller-profile_themes #image-files-list { |
4451 | width: 200px; | 4451 | width: 200px; |
4452 | float: right; | 4452 | float: right; |
4453 | margin-right: 10px; | 4453 | margin-right: 10px; |
4454 | } | 4454 | } |
4455 | -.controller-themes #image-files-list ul { | 4455 | +.controller-profile_themes #image-files-list ul { |
4456 | background: white; | 4456 | background: white; |
4457 | border: 1px solid #bbb; | 4457 | border: 1px solid #bbb; |
4458 | } | 4458 | } |
4459 | -.controller-themes #image-files-list ul, .controller-themes #image-files-list li { | 4459 | +.controller-profile_themes #image-files-list ul, .controller-profile_themes #image-files-list li { |
4460 | padding: 0px; | 4460 | padding: 0px; |
4461 | margin: 0px; | 4461 | margin: 0px; |
4462 | list-style: none; | 4462 | list-style: none; |
4463 | } | 4463 | } |
4464 | -.controller-themes #image-files-list li { | 4464 | +.controller-profile_themes #image-files-list li { |
4465 | border-bottom: 1px solid #bbb; | 4465 | border-bottom: 1px solid #bbb; |
4466 | padding: 5px 0px; | 4466 | padding: 5px 0px; |
4467 | text-align: center; | 4467 | text-align: center; |
4468 | } | 4468 | } |
4469 | -.controller-themes #image-files-list img { | 4469 | +.controller-profile_themes #image-files-list img { |
4470 | max-width: 98%; | 4470 | max-width: 98%; |
4471 | max-height: 40px; | 4471 | max-height: 40px; |
4472 | } | 4472 | } |
4473 | -.controller-themes .msie6 #image-files-list img { | 4473 | +.controller-profile_themes .msie6 #image-files-list img { |
4474 | width: 50%; | 4474 | width: 50%; |
4475 | height: 40px; | 4475 | height: 40px; |
4476 | } | 4476 | } |
4477 | -.controller-themes #image-files-list li span { | 4477 | +.controller-profile_themes #image-files-list li span { |
4478 | display: block; | 4478 | display: block; |
4479 | width: 100%; | 4479 | width: 100%; |
4480 | overflow: hidden; | 4480 | overflow: hidden; |
4481 | } | 4481 | } |
4482 | /* textbox */ | 4482 | /* textbox */ |
4483 | 4483 | ||
4484 | -.controller-themes #css-code { | 4484 | +.controller-profile_themes #css-code { |
4485 | margin-left: 220px; | 4485 | margin-left: 220px; |
4486 | margin-right: 220px; | 4486 | margin-right: 220px; |
4487 | } | 4487 | } |
4488 | -.controller-themes .msie6 #css-code { | 4488 | +.controller-profile_themes .msie6 #css-code { |
4489 | float: left; | 4489 | float: left; |
4490 | margin-left: 20px; | 4490 | margin-left: 20px; |
4491 | margin-right: 240px; | 4491 | margin-right: 240px; |
4492 | } | 4492 | } |
4493 | -.controller-themes #css-code textarea { | 4493 | +.controller-profile_themes #css-code textarea { |
4494 | width: 100%; | 4494 | width: 100%; |
4495 | } | 4495 | } |
4496 | -.controller-themes .msie6 #css-code textarea { | 4496 | +.controller-profile_themes .msie6 #css-code textarea { |
4497 | width: 500px; | 4497 | width: 500px; |
4498 | } | 4498 | } |
4499 | /* highlights block stuff */ | 4499 | /* highlights block stuff */ |
test/factories.rb
@@ -55,7 +55,7 @@ module Noosfero::Factory | @@ -55,7 +55,7 @@ module Noosfero::Factory | ||
55 | ###### old stuff to be rearranged | 55 | ###### old stuff to be rearranged |
56 | def create_admin_user(env) | 56 | def create_admin_user(env) |
57 | admin_user = User.find_by_login('adminuser') || create_user('adminuser', :email => 'adminuser@noosfero.org', :password => 'adminuser', :password_confirmation => 'adminuser', :environment => env) | 57 | admin_user = User.find_by_login('adminuser') || create_user('adminuser', :email => 'adminuser@noosfero.org', :password => 'adminuser', :password_confirmation => 'adminuser', :environment => env) |
58 | - admin_role = Role.find_by_name('admin_role') || Role.create!(:name => 'admin_role', :permissions => ['view_environment_admin_panel','edit_environment_features', 'edit_environment_design', 'manage_environment_categories', 'manage_environment_roles', 'manage_environment_trusted_sites', 'manage_environment_validators', 'manage_environment_users', 'manage_environment_templates', 'manage_environment_licenses']) | 58 | + admin_role = Role.find_by_name('admin_role') || Role.create!(:name => 'admin_role', :permissions => ['view_environment_admin_panel','edit_environment_features', 'edit_environment_design', 'manage_environment_categories', 'manage_environment_roles', 'manage_environment_trusted_sites', 'manage_environment_validators', 'manage_environment_users', 'manage_environment_templates', 'manage_environment_licenses', 'edit_appearance']) |
59 | RoleAssignment.create!(:accessor => admin_user.person, :role => admin_role, :resource => env) unless admin_user.person.role_assignments.map{|ra|[ra.role, ra.accessor, ra.resource]}.include?([admin_role, admin_user, env]) | 59 | RoleAssignment.create!(:accessor => admin_user.person, :role => admin_role, :resource => env) unless admin_user.person.role_assignments.map{|ra|[ra.role, ra.accessor, ra.resource]}.include?([admin_role, admin_user, env]) |
60 | admin_user.login | 60 | admin_user.login |
61 | end | 61 | end |
@@ -0,0 +1,140 @@ | @@ -0,0 +1,140 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | + | ||
3 | +class EnvironmentThemesController; def rescue_action(e) raise e end; end | ||
4 | + | ||
5 | +class EnvironmentThemesControllerTest < ActionController::TestCase | ||
6 | + | ||
7 | + def setup | ||
8 | + @controller = EnvironmentThemesController.new | ||
9 | + @request = ActionController::TestRequest.new | ||
10 | + @response = ActionController::TestResponse.new | ||
11 | + | ||
12 | + Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | ||
13 | + | ||
14 | + @env = Environment.default | ||
15 | + login = create_admin_user(@env) | ||
16 | + login_as(login) | ||
17 | + @profile = User.find_by_login(login).person | ||
18 | + end | ||
19 | + | ||
20 | + def teardown | ||
21 | + FileUtils.rm_rf(TMP_THEMES_DIR) | ||
22 | + end | ||
23 | + | ||
24 | + TMP_THEMES_DIR = RAILS_ROOT + '/test/tmp/environment_themes_controller' | ||
25 | + | ||
26 | + should 'display themes that can be applied' do | ||
27 | + env = Environment.default | ||
28 | + Theme.stubs(:approved_themes).with(@env).returns([]) | ||
29 | + t1 = 't1' | ||
30 | + t2 = 't2' | ||
31 | + t3 = 't3' | ||
32 | + env.themes = [t1, t2] | ||
33 | + env.save | ||
34 | + | ||
35 | + Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2), Theme.new(t3)]) | ||
36 | + get :index | ||
37 | + | ||
38 | + %w[ t1 t2 ].each do |item| | ||
39 | + assert_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set/#{item}" } | ||
40 | + end | ||
41 | + | ||
42 | + assert_no_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set/t3" } | ||
43 | + end | ||
44 | + | ||
45 | + should 'highlight current theme' do | ||
46 | + env = Environment.default | ||
47 | + t1 = 'one' | ||
48 | + t2 = 'two' | ||
49 | + env.themes = [t1, t2] | ||
50 | + env.save | ||
51 | + | ||
52 | + Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2)]) | ||
53 | + env.update_theme(t1) | ||
54 | + get :index | ||
55 | + | ||
56 | + assert_tag :attributes => { :class => 'theme-opt list-opt selected' } | ||
57 | + assert_no_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set/one" } | ||
58 | + end | ||
59 | + | ||
60 | + should 'save selection of theme' do | ||
61 | + get :set, :id => 'onetheme' | ||
62 | + env = Environment.default | ||
63 | + assert_equal 'onetheme', env.theme | ||
64 | + end | ||
65 | + | ||
66 | + | ||
67 | + should 'unset selection of theme' do | ||
68 | + get :unset | ||
69 | + env = Environment.default | ||
70 | + assert_equal 'default', env.theme | ||
71 | + end | ||
72 | + | ||
73 | + should 'display link to use the default theme' do | ||
74 | + env = Environment.default | ||
75 | + env.themes = ['new-theme'] | ||
76 | + env.save | ||
77 | + | ||
78 | + Theme.stubs(:system_themes).returns([Theme.new('new-theme')]) | ||
79 | + | ||
80 | + get :index | ||
81 | + assert_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/unset" } | ||
82 | + end | ||
83 | + | ||
84 | + should 'point back to admin panel' do | ||
85 | + get :index | ||
86 | + assert_tag :tag => 'a', :attributes => { :href => '/admin' }, :content => 'Back' | ||
87 | + end | ||
88 | + | ||
89 | + should 'list templates' do | ||
90 | + all = LayoutTemplate.all | ||
91 | + | ||
92 | + LayoutTemplate.expects(:all).returns(all) | ||
93 | + get :index | ||
94 | + assert_same all, assigns(:layout_templates) | ||
95 | + end | ||
96 | + | ||
97 | + should 'display links to set template' do | ||
98 | + env = Environment.default | ||
99 | + env.layout_template = 'rightbar' | ||
100 | + env.save! | ||
101 | + t1 = LayoutTemplate.find('default') | ||
102 | + t2 = LayoutTemplate.find('leftbar') | ||
103 | + LayoutTemplate.expects(:all).returns([t1, t2]) | ||
104 | + | ||
105 | + get :index | ||
106 | + assert_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set_layout_template/default"} | ||
107 | + assert_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set_layout_template/leftbar"} | ||
108 | + end | ||
109 | + | ||
110 | + should 'highlight current template' do | ||
111 | + env = Environment.default | ||
112 | + env.update_attributes!(:layout_template => 'default') | ||
113 | + env.layout_template = 'default' | ||
114 | + | ||
115 | + t1 = LayoutTemplate.find('default') | ||
116 | + t2 = LayoutTemplate.find('leftbar') | ||
117 | + LayoutTemplate.expects(:all).returns([t1, t2]) | ||
118 | + | ||
119 | + get :index | ||
120 | + assert_tag :attributes => { :class => 'template-opt list-opt selected' } | ||
121 | + assert_no_tag :tag => 'a', :attributes => { :href => "/admin/environment_themes/set_layout_template/default"} | ||
122 | + end | ||
123 | + | ||
124 | + should 'set template' do | ||
125 | + env = Environment.default | ||
126 | + post :set_layout_template, :id => 'leftbar' | ||
127 | + env.reload | ||
128 | + assert_equal 'leftbar', env.layout_template | ||
129 | + assert_redirected_to :action => 'index' | ||
130 | + end | ||
131 | + | ||
132 | + should 'not display the "Select themes" section if there are no themes to choose from' do | ||
133 | + env = Environment.default | ||
134 | + env.themes = []; env.save! | ||
135 | + Theme.stubs(:system_themes_dir).returns(TMP_THEMES_DIR) # an empty dir | ||
136 | + get :index | ||
137 | + assert_no_tag :content => "Select theme" | ||
138 | + end | ||
139 | + | ||
140 | +end |
@@ -0,0 +1,313 @@ | @@ -0,0 +1,313 @@ | ||
1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
2 | +# require 'profile_themes_controller' | ||
3 | + | ||
4 | +class ProfileThemesController; def rescue_action(e) raise e end; end | ||
5 | + | ||
6 | +class ProfileThemesControllerTest < ActionController::TestCase | ||
7 | + | ||
8 | + def setup | ||
9 | + @controller = ProfileThemesController.new | ||
10 | + @request = ActionController::TestRequest.new | ||
11 | + @response = ActionController::TestResponse.new | ||
12 | + | ||
13 | + Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | ||
14 | + | ||
15 | + @profile = create_user('testinguser').person | ||
16 | + login_as('testinguser') | ||
17 | + | ||
18 | + @env = Environment.default | ||
19 | + @env.enable('user_themes') | ||
20 | + @env.save! | ||
21 | + end | ||
22 | + attr_reader :profile, :env | ||
23 | + | ||
24 | + def teardown | ||
25 | + FileUtils.rm_rf(TMP_THEMES_DIR) | ||
26 | + end | ||
27 | + | ||
28 | + TMP_THEMES_DIR = RAILS_ROOT + '/test/tmp/profile_themes_controller' | ||
29 | + | ||
30 | + should 'display themes that can be applied' do | ||
31 | + env = Environment.default | ||
32 | + Theme.stubs(:approved_themes).with(@profile).returns([Theme.new('t1', :name => 't1')]) | ||
33 | + t2 = 't2' | ||
34 | + t3 = 't3' | ||
35 | + env.themes = [t2] | ||
36 | + env.save | ||
37 | + | ||
38 | + Theme.stubs(:system_themes).returns([Theme.new(t2), Theme.new(t3)]) | ||
39 | + get :index, :profile => 'testinguser' | ||
40 | + | ||
41 | + %w[ t1 t2 ].each do |item| | ||
42 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set/#{item}" } | ||
43 | + end | ||
44 | + | ||
45 | + assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set/t3" } | ||
46 | + end | ||
47 | + | ||
48 | + should 'highlight current theme' do | ||
49 | + env = Environment.default | ||
50 | + t1 = 'one' | ||
51 | + t2 = 'two' | ||
52 | + env.themes = [t1, t2] | ||
53 | + env.save | ||
54 | + | ||
55 | + Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2)]) | ||
56 | + profile.update_theme(t1) | ||
57 | + get :index, :profile => 'testinguser' | ||
58 | + | ||
59 | + assert_tag :attributes => { :class => 'theme-opt list-opt selected' } | ||
60 | + assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set/one" } | ||
61 | + end | ||
62 | + | ||
63 | + should 'display list of my themes for edition' do | ||
64 | + Theme.create('three', :owner => profile) | ||
65 | + Theme.create('four', :owner => profile) | ||
66 | + | ||
67 | + get :index, :profile => 'testinguser' | ||
68 | + | ||
69 | + %w[ three four ].each do |item| | ||
70 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/edit/#{item}" } | ||
71 | + end | ||
72 | + end | ||
73 | + | ||
74 | + should 'save selection of theme' do | ||
75 | + get :set, :profile => 'testinguser', :id => 'onetheme' | ||
76 | + profile = Profile.find(@profile.id) | ||
77 | + assert_equal 'onetheme', profile.theme | ||
78 | + end | ||
79 | + | ||
80 | + should 'save selection of theme even if model is invalid' do | ||
81 | + @profile.sex = nil | ||
82 | + @profile.save! | ||
83 | + @profile.environment.custom_person_fields = { 'sex' => {'required' => 'true', 'active' => 'true'} }; @profile.environment.save! | ||
84 | + | ||
85 | + get :set, :profile => 'testinguser', :id => 'onetheme' | ||
86 | + profile = Profile.find(@profile.id) | ||
87 | + assert_equal 'onetheme', profile.theme | ||
88 | + end | ||
89 | + | ||
90 | + should 'unset selection of theme' do | ||
91 | + get :unset, :profile => 'testinguser' | ||
92 | + assert_equal nil, profile.theme | ||
93 | + end | ||
94 | + | ||
95 | + should 'display link to use the default theme' do | ||
96 | + env = Environment.default | ||
97 | + env.themes = ['new-theme'] | ||
98 | + env.save | ||
99 | + | ||
100 | + Theme.stubs(:system_themes).returns([Theme.new('new-theme')]) | ||
101 | + | ||
102 | + get :index, :profile => 'testinguser' | ||
103 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/unset" } | ||
104 | + end | ||
105 | + | ||
106 | + should 'point back to control panel' do | ||
107 | + get :index, :profile => 'testinguser' | ||
108 | + assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser' }, :content => 'Back' | ||
109 | + end | ||
110 | + | ||
111 | + should 'display screen for creating new theme' do | ||
112 | + @request.expects(:xhr?).returns(true).at_least_once | ||
113 | + get :new, :profile => 'testinguser' | ||
114 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/new', :method => /post/i }, :descendant => { :tag => 'input', :attributes => { :type => 'text', :name => 'name' } } | ||
115 | + end | ||
116 | + | ||
117 | + should 'create a new theme' do | ||
118 | + post :new, :profile => 'testinguser', :name => 'My theme' | ||
119 | + | ||
120 | + ok('theme should be created') do | ||
121 | + profile.themes.first.id == 'my-theme' | ||
122 | + end | ||
123 | + end | ||
124 | + | ||
125 | + should 'edit a theme' do | ||
126 | + theme = Theme.create('mytheme', :owner => profile) | ||
127 | + get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
128 | + | ||
129 | + assert_equal theme, assigns(:theme) | ||
130 | + end | ||
131 | + | ||
132 | + should 'list CSS files in theme' do | ||
133 | + theme = Theme.create('mytheme', :owner => profile) | ||
134 | + theme.add_css('one.css') | ||
135 | + theme.add_css('two.css') | ||
136 | + | ||
137 | + get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
138 | + | ||
139 | + %w[ one.css two.css ].each do |item| | ||
140 | + assert_includes assigns(:css_files), item | ||
141 | + assert_tag :tag => 'li', :descendant => { :tag => 'a', :content => item} | ||
142 | + end | ||
143 | + end | ||
144 | + | ||
145 | + should 'display dialog for creating new CSS' do | ||
146 | + theme = Theme.create('mytheme', :owner => profile) | ||
147 | + @request.stubs(:xhr?).returns(true) | ||
148 | + get :add_css, :profile => 'testinguser', :id => 'mytheme' | ||
149 | + | ||
150 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/add_css/mytheme', :method => /post/i} | ||
151 | + assert_tag :tag => 'input', :attributes => { :name => 'css', :type => 'text' } | ||
152 | + assert_tag :tag => 'input', :attributes => { :type => 'submit' } | ||
153 | + end | ||
154 | + | ||
155 | + should 'be able to add new CSS to theme' do | ||
156 | + theme = Theme.create('mytheme', :owner => profile) | ||
157 | + post :add_css, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
158 | + | ||
159 | + assert_response :redirect | ||
160 | + | ||
161 | + reloaded_theme = Theme.find('mytheme') | ||
162 | + assert_includes reloaded_theme.css_files, 'test.css' | ||
163 | + end | ||
164 | + | ||
165 | + should 'load code from a given CSS file' do | ||
166 | + theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
167 | + get :css_editor, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
168 | + | ||
169 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/update_css/mytheme' }, :descendant => { :tag => 'textarea', :content => '/* sample code */' } | ||
170 | + end | ||
171 | + | ||
172 | + should 'be able to save CSS code' do | ||
173 | + theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
174 | + get :css_editor, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
175 | + | ||
176 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/update_css/mytheme' }, :descendant => { :tag => 'input', :attributes => { :type => 'submit' } } | ||
177 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/update_css/mytheme' }, :descendant => { :tag => 'input', :attributes => { :type => 'hidden', :name => 'css', :value => 'test.css' } } | ||
178 | + end | ||
179 | + | ||
180 | + should 'update css code when saving' do | ||
181 | + theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
182 | + post :update_css, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css', :csscode => 'body { background: white; }' | ||
183 | + assert_equal 'body { background: white; }', theme.read_css('test.css') | ||
184 | + end | ||
185 | + | ||
186 | + should 'list image files in theme' do | ||
187 | + theme = Theme.create('mytheme', :owner => profile) | ||
188 | + theme.add_image('one.png', 'FAKE IMAGE DATA 1') | ||
189 | + theme.add_image('two.png', 'FAKE IMAGE DATA 2') | ||
190 | + | ||
191 | + get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
192 | + | ||
193 | + assert_tag :tag => 'img', :attributes => { :src => '/user_themes/mytheme/images/one.png' } | ||
194 | + assert_tag :tag => 'img', :attributes => { :src => '/user_themes/mytheme/images/two.png' } | ||
195 | + end | ||
196 | + | ||
197 | + should 'display "add image" button' do | ||
198 | + theme = Theme.create('mytheme', :owner => profile) | ||
199 | + get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
200 | + | ||
201 | + assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/profile_themes/add_image/mytheme' } | ||
202 | + end | ||
203 | + | ||
204 | + should 'display the "add image" dialog' do | ||
205 | + theme = Theme.create('mytheme', :owner => profile) | ||
206 | + @request.stubs(:xhr?).returns(true) | ||
207 | + | ||
208 | + get :add_image, :profile => 'testinguser', :id => 'mytheme' | ||
209 | + assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/profile_themes/add_image/mytheme', :method => /post/i, :enctype => 'multipart/form-data' }, :descendant => { :tag => 'input', :attributes => { :name => 'image', :type => 'file' } } | ||
210 | + end | ||
211 | + | ||
212 | + should 'be able to add new image to theme' do | ||
213 | + theme = Theme.create('mytheme', :owner => profile) | ||
214 | + @request.stubs(:xhr?).returns(false) | ||
215 | + | ||
216 | + post :add_image, :profile => 'testinguser', :id => 'mytheme', :image => fixture_file_upload('/files/rails.png', 'image/png', :binary) | ||
217 | + assert_redirected_to :action => "edit", :id => 'mytheme' | ||
218 | + assert theme.image_files.include?('rails.png') | ||
219 | + assert(system('diff', RAILS_ROOT + '/test/fixtures/files/rails.png', TMP_THEMES_DIR + '/mytheme/images/rails.png'), 'should put the correct uploaded file in the right place') | ||
220 | + end | ||
221 | + | ||
222 | + should 'link to "test theme"' do | ||
223 | + Theme.create('one', :owner => profile) | ||
224 | + Theme.create('two', :owner => profile) | ||
225 | + get :index, :profile => 'testinguser' | ||
226 | + | ||
227 | + %w[ one two ].each do |item| | ||
228 | + assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/profile_themes/start_test/' + item } | ||
229 | + end | ||
230 | + end | ||
231 | + | ||
232 | + should 'start testing theme' do | ||
233 | + theme = Theme.create('theme-under-test', :owner => profile) | ||
234 | + post :start_test, :profile => 'testinguser', :id => 'theme-under-test' | ||
235 | + | ||
236 | + assert_equal 'theme-under-test', session[:theme] | ||
237 | + assert_redirected_to :controller => 'content_viewer', :profile => 'testinguser', :action => 'view_page' | ||
238 | + end | ||
239 | + | ||
240 | + should 'stop testing theme' do | ||
241 | + theme = Theme.create('theme-under-test', :owner => profile) | ||
242 | + post :stop_test, :profile => 'testinguser', :id => 'theme-under-test' | ||
243 | + | ||
244 | + assert_nil session[:theme] | ||
245 | + assert_redirected_to :action => 'index' | ||
246 | + end | ||
247 | + | ||
248 | + should 'list templates' do | ||
249 | + all = LayoutTemplate.all | ||
250 | + | ||
251 | + LayoutTemplate.expects(:all).returns(all) | ||
252 | + get :index, :profile => 'testinguser' | ||
253 | + assert_same all, assigns(:layout_templates) | ||
254 | + end | ||
255 | + | ||
256 | + should 'display links to set template' do | ||
257 | + profile.layout_template = 'rightbar' | ||
258 | + profile.save! | ||
259 | + t1 = LayoutTemplate.find('default') | ||
260 | + t2 = LayoutTemplate.find('leftbar') | ||
261 | + LayoutTemplate.expects(:all).returns([t1, t2]) | ||
262 | + | ||
263 | + get :index, :profile => 'testinguser' | ||
264 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set_layout_template/default"} | ||
265 | + assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set_layout_template/leftbar"} | ||
266 | + end | ||
267 | + | ||
268 | + should 'highlight current template' do | ||
269 | + profile.layout_template = 'default' | ||
270 | + profile.save! | ||
271 | + | ||
272 | + t1 = LayoutTemplate.find('default') | ||
273 | + t2 = LayoutTemplate.find('leftbar') | ||
274 | + LayoutTemplate.expects(:all).returns([t1, t2]) | ||
275 | + | ||
276 | + get :index, :profile => 'testinguser' | ||
277 | + assert_tag :attributes => { :class => 'template-opt list-opt selected' } | ||
278 | + assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/profile_themes/set_layout_template/default"} | ||
279 | + end | ||
280 | + | ||
281 | + should 'set template' do | ||
282 | + post :set_layout_template, :profile => 'testinguser', :id => 'leftbar' | ||
283 | + profile = Profile.find(@profile.id) | ||
284 | + assert_equal 'leftbar', profile.layout_template | ||
285 | + assert_redirected_to :action => 'index' | ||
286 | + end | ||
287 | + | ||
288 | + should 'set template even if the model is invalid' do | ||
289 | + @profile.sex = nil | ||
290 | + @profile.save! | ||
291 | + @profile.environment.custom_person_fields = { 'sex' => {'required' => 'true', 'active' => 'true'} }; @profile.environment.save! | ||
292 | + | ||
293 | + post :set_layout_template, :profile => 'testinguser', :id => 'leftbar' | ||
294 | + profile = Profile.find(@profile.id) | ||
295 | + assert_equal 'leftbar', profile.layout_template | ||
296 | + assert_redirected_to :action => 'index' | ||
297 | + end | ||
298 | + | ||
299 | + should 'not display "new theme" button when user themes are disabled' do | ||
300 | + env.disable('user_themes') | ||
301 | + env.save! | ||
302 | + get :index, :profile => 'testinguser' | ||
303 | + assert_no_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/profile_themes/new' } | ||
304 | + end | ||
305 | + | ||
306 | + should 'not display the "Select themes" section if there are no themes to choose from' do | ||
307 | + env.themes = []; env.save! | ||
308 | + Theme.stubs(:system_themes_dir).returns(TMP_THEMES_DIR) # an empty dir | ||
309 | + get :index, :profile => "testinguser" | ||
310 | + assert_no_tag :content => "Select theme" | ||
311 | + end | ||
312 | + | ||
313 | +end |
test/functional/themes_controller_test.rb
@@ -1,311 +0,0 @@ | @@ -1,311 +0,0 @@ | ||
1 | -require File.dirname(__FILE__) + '/../test_helper' | ||
2 | -require 'themes_controller' | ||
3 | - | ||
4 | -class ThemesController; def rescue_action(e) raise e end; end | ||
5 | - | ||
6 | -class ThemesControllerTest < ActionController::TestCase | ||
7 | - | ||
8 | - def setup | ||
9 | - @controller = ThemesController.new | ||
10 | - @request = ActionController::TestRequest.new | ||
11 | - @response = ActionController::TestResponse.new | ||
12 | - | ||
13 | - Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | ||
14 | - | ||
15 | - @profile = create_user('testinguser').person | ||
16 | - login_as('testinguser') | ||
17 | - | ||
18 | - @env = Environment.default | ||
19 | - @env.enable('user_themes') | ||
20 | - @env.save! | ||
21 | - end | ||
22 | - attr_reader :profile, :env | ||
23 | - | ||
24 | - def teardown | ||
25 | - FileUtils.rm_rf(TMP_THEMES_DIR) | ||
26 | - end | ||
27 | - | ||
28 | - TMP_THEMES_DIR = RAILS_ROOT + '/test/tmp/themes_controller' | ||
29 | - | ||
30 | - should 'display themes that can be applied' do | ||
31 | - env = Environment.default | ||
32 | - Theme.stubs(:approved_themes).with(@profile).returns([Theme.new('t1', :name => 't1')]) | ||
33 | - t2 = 't2' | ||
34 | - t3 = 't3' | ||
35 | - env.themes = [t2] | ||
36 | - env.save | ||
37 | - | ||
38 | - Theme.stubs(:system_themes).returns([Theme.new(t2), Theme.new(t3)]) | ||
39 | - get :index, :profile => 'testinguser' | ||
40 | - | ||
41 | - %w[ t1 t2 ].each do |item| | ||
42 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/#{item}" } | ||
43 | - end | ||
44 | - | ||
45 | - assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/t3" } | ||
46 | - end | ||
47 | - | ||
48 | - should 'highlight current theme' do | ||
49 | - env = Environment.default | ||
50 | - t1 = 'one' | ||
51 | - t2 = 'two' | ||
52 | - env.themes = [t1, t2] | ||
53 | - env.save | ||
54 | - | ||
55 | - Theme.stubs(:system_themes).returns([Theme.new(t1), Theme.new(t2)]) | ||
56 | - profile.update_theme(t1) | ||
57 | - get :index, :profile => 'testinguser' | ||
58 | - | ||
59 | - assert_tag :attributes => { :class => 'theme-opt list-opt selected' } | ||
60 | - assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set/one" } | ||
61 | - end | ||
62 | - | ||
63 | - should 'display list of my themes for edition' do | ||
64 | - Theme.create('three', :owner => profile) | ||
65 | - Theme.create('four', :owner => profile) | ||
66 | - | ||
67 | - get :index, :profile => 'testinguser' | ||
68 | - | ||
69 | - %w[ three four ].each do |item| | ||
70 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/edit/#{item}" } | ||
71 | - end | ||
72 | - end | ||
73 | - | ||
74 | - should 'save selection of theme' do | ||
75 | - get :set, :profile => 'testinguser', :id => 'onetheme' | ||
76 | - profile = Profile.find(@profile.id) | ||
77 | - assert_equal 'onetheme', profile.theme | ||
78 | - end | ||
79 | - | ||
80 | - should 'save selection of theme even if model is invalid' do | ||
81 | - @profile.sex = nil | ||
82 | - @profile.save! | ||
83 | - @profile.environment.custom_person_fields = { 'sex' => {'required' => 'true', 'active' => 'true'} }; @profile.environment.save! | ||
84 | - | ||
85 | - get :set, :profile => 'testinguser', :id => 'onetheme' | ||
86 | - profile = Profile.find(@profile.id) | ||
87 | - assert_equal 'onetheme', profile.theme | ||
88 | - end | ||
89 | - | ||
90 | - should 'unset selection of theme' do | ||
91 | - get :unset, :profile => 'testinguser' | ||
92 | - assert_equal nil, profile.theme | ||
93 | - end | ||
94 | - | ||
95 | - should 'display link to use the default theme' do | ||
96 | - env = Environment.default | ||
97 | - env.themes = ['new-theme'] | ||
98 | - env.save | ||
99 | - | ||
100 | - Theme.stubs(:system_themes).returns([Theme.new('new-theme')]) | ||
101 | - | ||
102 | - get :index, :profile => 'testinguser' | ||
103 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/unset" } | ||
104 | - end | ||
105 | - | ||
106 | - should 'point back to control panel' do | ||
107 | - get :index, :profile => 'testinguser' | ||
108 | - assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser' }, :content => 'Back' | ||
109 | - end | ||
110 | - | ||
111 | - should 'display screen for creating new theme' do | ||
112 | - @request.expects(:xhr?).returns(true).at_least_once | ||
113 | - get :new, :profile => 'testinguser' | ||
114 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/new', :method => /post/i }, :descendant => { :tag => 'input', :attributes => { :type => 'text', :name => 'name' } } | ||
115 | - end | ||
116 | - | ||
117 | - should 'create a new theme' do | ||
118 | - post :new, :profile => 'testinguser', :name => 'My theme' | ||
119 | - | ||
120 | - ok('theme should be created') do | ||
121 | - profile.themes.first.id == 'my-theme' | ||
122 | - end | ||
123 | - end | ||
124 | - | ||
125 | - should 'edit a theme' do | ||
126 | - theme = Theme.create('mytheme', :owner => profile) | ||
127 | - get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
128 | - | ||
129 | - assert_equal theme, assigns(:theme) | ||
130 | - end | ||
131 | - | ||
132 | - should 'list CSS files in theme' do | ||
133 | - theme = Theme.create('mytheme', :owner => profile) | ||
134 | - theme.add_css('one.css') | ||
135 | - theme.add_css('two.css') | ||
136 | - | ||
137 | - get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
138 | - | ||
139 | - %w[ one.css two.css ].each do |item| | ||
140 | - assert_includes assigns(:css_files), item | ||
141 | - assert_tag :tag => 'li', :descendant => { :tag => 'a', :content => item} | ||
142 | - end | ||
143 | - end | ||
144 | - | ||
145 | - should 'display dialog for creating new CSS' do | ||
146 | - theme = Theme.create('mytheme', :owner => profile) | ||
147 | - @request.stubs(:xhr?).returns(true) | ||
148 | - get :add_css, :profile => 'testinguser', :id => 'mytheme' | ||
149 | - | ||
150 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/add_css/mytheme', :method => /post/i} | ||
151 | - assert_tag :tag => 'input', :attributes => { :name => 'css', :type => 'text' } | ||
152 | - assert_tag :tag => 'input', :attributes => { :type => 'submit' } | ||
153 | - end | ||
154 | - | ||
155 | - should 'be able to add new CSS to theme' do | ||
156 | - theme = Theme.create('mytheme', :owner => profile) | ||
157 | - post :add_css, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
158 | - | ||
159 | - assert_response :redirect | ||
160 | - | ||
161 | - reloaded_theme = Theme.find('mytheme') | ||
162 | - assert_includes reloaded_theme.css_files, 'test.css' | ||
163 | - end | ||
164 | - | ||
165 | - should 'load code from a given CSS file' do | ||
166 | - theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
167 | - get :css_editor, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
168 | - | ||
169 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/update_css/mytheme' }, :descendant => { :tag => 'textarea', :content => '/* sample code */' } | ||
170 | - end | ||
171 | - | ||
172 | - should 'be able to save CSS code' do | ||
173 | - theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
174 | - get :css_editor, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css' | ||
175 | - | ||
176 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/update_css/mytheme' }, :descendant => { :tag => 'input', :attributes => { :type => 'submit' } } | ||
177 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/update_css/mytheme' }, :descendant => { :tag => 'input', :attributes => { :type => 'hidden', :name => 'css', :value => 'test.css' } } | ||
178 | - end | ||
179 | - | ||
180 | - should 'update css code when saving' do | ||
181 | - theme = Theme.create('mytheme', :owner => profile); theme.update_css('test.css', '/* sample code */') | ||
182 | - post :update_css, :profile => 'testinguser', :id => 'mytheme', :css => 'test.css', :csscode => 'body { background: white; }' | ||
183 | - assert_equal 'body { background: white; }', theme.read_css('test.css') | ||
184 | - end | ||
185 | - | ||
186 | - should 'list image files in theme' do | ||
187 | - theme = Theme.create('mytheme', :owner => profile) | ||
188 | - theme.add_image('one.png', 'FAKE IMAGE DATA 1') | ||
189 | - theme.add_image('two.png', 'FAKE IMAGE DATA 2') | ||
190 | - | ||
191 | - get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
192 | - | ||
193 | - assert_tag :tag => 'img', :attributes => { :src => '/user_themes/mytheme/images/one.png' } | ||
194 | - assert_tag :tag => 'img', :attributes => { :src => '/user_themes/mytheme/images/two.png' } | ||
195 | - end | ||
196 | - | ||
197 | - should 'display "add image" button' do | ||
198 | - theme = Theme.create('mytheme', :owner => profile) | ||
199 | - get :edit, :profile => 'testinguser', :id => 'mytheme' | ||
200 | - | ||
201 | - assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/themes/add_image/mytheme' } | ||
202 | - end | ||
203 | - | ||
204 | - should 'display the "add image" dialog' do | ||
205 | - theme = Theme.create('mytheme', :owner => profile) | ||
206 | - @request.stubs(:xhr?).returns(true) | ||
207 | - | ||
208 | - get :add_image, :profile => 'testinguser', :id => 'mytheme' | ||
209 | - assert_tag :tag => 'form', :attributes => { :action => '/myprofile/testinguser/themes/add_image/mytheme', :method => /post/i, :enctype => 'multipart/form-data' }, :descendant => { :tag => 'input', :attributes => { :name => 'image', :type => 'file' } } | ||
210 | - end | ||
211 | - | ||
212 | - should 'be able to add new image to theme' do | ||
213 | - theme = Theme.create('mytheme', :owner => profile) | ||
214 | - @request.stubs(:xhr?).returns(false) | ||
215 | - | ||
216 | - post :add_image, :profile => 'testinguser', :id => 'mytheme', :image => fixture_file_upload('/files/rails.png', 'image/png', :binary) | ||
217 | - assert_redirected_to :action => "edit", :id => 'mytheme' | ||
218 | - assert theme.image_files.include?('rails.png') | ||
219 | - assert(system('diff', RAILS_ROOT + '/test/fixtures/files/rails.png', TMP_THEMES_DIR + '/mytheme/images/rails.png'), 'should put the correct uploaded file in the right place') | ||
220 | - end | ||
221 | - | ||
222 | - should 'link to "test theme"' do | ||
223 | - Theme.create('one', :owner => profile) | ||
224 | - Theme.create('two', :owner => profile) | ||
225 | - get :index, :profile => 'testinguser' | ||
226 | - | ||
227 | - %w[ one two ].each do |item| | ||
228 | - assert_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/themes/start_test/' + item } | ||
229 | - end | ||
230 | - end | ||
231 | - | ||
232 | - should 'start testing theme' do | ||
233 | - theme = Theme.create('theme-under-test', :owner => profile) | ||
234 | - post :start_test, :profile => 'testinguser', :id => 'theme-under-test' | ||
235 | - | ||
236 | - assert_equal 'theme-under-test', session[:theme] | ||
237 | - assert_redirected_to :controller => 'content_viewer', :profile => 'testinguser', :action => 'view_page' | ||
238 | - end | ||
239 | - | ||
240 | - should 'stop testing theme' do | ||
241 | - theme = Theme.create('theme-under-test', :owner => profile) | ||
242 | - post :stop_test, :profile => 'testinguser', :id => 'theme-under-test' | ||
243 | - | ||
244 | - assert_nil session[:theme] | ||
245 | - assert_redirected_to :action => 'index' | ||
246 | - end | ||
247 | - | ||
248 | - should 'list templates' do | ||
249 | - all = LayoutTemplate.all | ||
250 | - | ||
251 | - LayoutTemplate.expects(:all).returns(all) | ||
252 | - get :index, :profile => 'testinguser' | ||
253 | - assert_same all, assigns(:layout_templates) | ||
254 | - end | ||
255 | - | ||
256 | - should 'display links to set template' do | ||
257 | - profile.update_attributes!(:layout_template => 'rightbar') | ||
258 | - t1 = LayoutTemplate.find('default') | ||
259 | - t2 = LayoutTemplate.find('leftbar') | ||
260 | - LayoutTemplate.expects(:all).returns([t1, t2]) | ||
261 | - | ||
262 | - get :index, :profile => 'testinguser' | ||
263 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set_layout_template/default"} | ||
264 | - assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set_layout_template/leftbar"} | ||
265 | - end | ||
266 | - | ||
267 | - should 'highlight current template' do | ||
268 | - profile.update_attributes!(:layout_template => 'default') | ||
269 | - | ||
270 | - t1 = LayoutTemplate.find('default') | ||
271 | - t2 = LayoutTemplate.find('leftbar') | ||
272 | - LayoutTemplate.expects(:all).returns([t1, t2]) | ||
273 | - | ||
274 | - get :index, :profile => 'testinguser' | ||
275 | - assert_tag :attributes => { :class => 'template-opt list-opt selected' } | ||
276 | - assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/testinguser/themes/set_layout_template/default"} | ||
277 | - end | ||
278 | - | ||
279 | - should 'set template' do | ||
280 | - post :set_layout_template, :profile => 'testinguser', :id => 'leftbar' | ||
281 | - profile = Profile.find(@profile.id) | ||
282 | - assert_equal 'leftbar', profile.layout_template | ||
283 | - assert_redirected_to :action => 'index' | ||
284 | - end | ||
285 | - | ||
286 | - should 'set template even if the model is invalid' do | ||
287 | - @profile.sex = nil | ||
288 | - @profile.save! | ||
289 | - @profile.environment.custom_person_fields = { 'sex' => {'required' => 'true', 'active' => 'true'} }; @profile.environment.save! | ||
290 | - | ||
291 | - post :set_layout_template, :profile => 'testinguser', :id => 'leftbar' | ||
292 | - profile = Profile.find(@profile.id) | ||
293 | - assert_equal 'leftbar', profile.layout_template | ||
294 | - assert_redirected_to :action => 'index' | ||
295 | - end | ||
296 | - | ||
297 | - should 'not display "new theme" button when user themes are disabled' do | ||
298 | - env.disable('user_themes') | ||
299 | - env.save! | ||
300 | - get :index, :profile => 'testinguser' | ||
301 | - assert_no_tag :tag => 'a', :attributes => { :href => '/myprofile/testinguser/themes/new' } | ||
302 | - end | ||
303 | - | ||
304 | - should 'not display the "Select themes" section if there are no themes to choose from' do | ||
305 | - env.themes = []; env.save! | ||
306 | - Theme.stubs(:system_themes_dir).returns(TMP_THEMES_DIR) # an empty dir | ||
307 | - get :index, :profile => "testinguser" | ||
308 | - assert_no_tag :content => "Select theme" | ||
309 | - end | ||
310 | - | ||
311 | -end |