diff --git a/vendor/plugins/design/lib/acts_as_design.rb b/vendor/plugins/design/lib/acts_as_design.rb index a4abda7..ac5aac5 100644 --- a/vendor/plugins/design/lib/acts_as_design.rb +++ b/vendor/plugins/design/lib/acts_as_design.rb @@ -25,6 +25,13 @@ class ActiveRecord::Base serialize :design_data attr_protected :design_data + after_create do |design| + template = Design::Template.find(design.template) + while design.boxes.size < template.number_of_boxes + design.boxes << Design::Box.new(:name => 'Block') + end + end + def design_data self[:design_data] ||= Hash.new end diff --git a/vendor/plugins/design/lib/design.rb b/vendor/plugins/design/lib/design.rb index b299edb..4d6a899 100644 --- a/vendor/plugins/design/lib/design.rb +++ b/vendor/plugins/design/lib/design.rb @@ -1,7 +1,7 @@ require 'design/controller_methods' require 'design/fixed_design_holder' -require 'design/proxy_design_holder' +require 'design/template' require 'design/helper' require 'design/editor' @@ -22,7 +22,7 @@ module Design if config.has_key?(:holder) holder_variable_name = config[:holder] - data[:design] = Design::ProxyDesignHolder.new(self.instance_variable_get("@#{holder_variable_name}")) + data[:design] = self.instance_variable_get("@#{holder_variable_name}") else options = (config[:fixed].kind_of? Hash) ? config[:fixed] : {} data[:design] = Design::FixedDesignHolder.new(options) diff --git a/vendor/plugins/design/lib/design/editor.rb b/vendor/plugins/design/lib/design/editor.rb index 80c21d5..ea6d4a6 100644 --- a/vendor/plugins/design/lib/design/editor.rb +++ b/vendor/plugins/design/lib/design/editor.rb @@ -6,27 +6,52 @@ module Design # from flexible_template module Editor - def designer - end - - def flexible_template_edit_template? - @ft_config[:edit_mode] + def design_editor + + if request.post? + design_editor_set_template + design_editor_set_theme + design_editor_set_icon_theme + + if self.class.design_plugin_config[:autosave] && design.respond_to?(:save) + design.save + end + + if request.xhr? + render :text => 'ok' + else + redirect_to :action => 'design_editor' + end + + else + render :action => 'design_editor' + end end - - # Set the default template to the profile - def set_default_template - set_template(design,params[:template_name]) if exist_template? params[:template_name] + + private + + # Set to the owner the template choosed + def design_editor_set_template + if exists_template?(params[:template]) + design.template = params[:template] + end end - - # Set the default theme to the profile - def set_default_theme - set_theme(design,params[:theme_name]) if exist_theme? params[:theme_name] + + # Set to the owner the theme choosed + def design_editor_set_theme + if exists_theme?(params[:theme]) + design.theme = params[:theme] + end end - - # Set the default icons theme to the profile - def set_default_icon_theme - set_icon_theme(design,params[:icon_theme_name]) if exist_icon_theme? params[:icon_theme_name] + + # Set to the owner the icon_theme choosed + def design_editor_set_icon_theme + if request.post? && exists_icon_theme?(params[:icon_theme]) + design.icon_theme = params[:icon_theme] + end end + + # TODO: see below here def flexible_template_set_sort_mode box = design.boxes.find(params[:box_id]) @@ -97,23 +122,6 @@ module Design private - # Set to the owner the theme choosed - def set_theme(object, theme_name) - object.flexible_template_theme = theme_name - object.save - end - - # Set to the owner the icons theme choosed - def set_icon_theme(object,icon_theme_name) - object.flexible_template_icon_theme = icon_theme_name - object.save - end - - # Set to the owner the template choosed - def set_template(object, template_name) - object.flexible_template_template = template_name - object.save - end #Load a set of boxes belongs to a owner. We have to situations. # 1 - The owner has equal or more boxes that boxes defined in template. @@ -154,16 +162,16 @@ module Design number_of_boxes end - def exist_template? template - @ft_config[:available_templates].include?(template) + def exists_template?(template) + Design.available_templates.include?(template) end - def exist_theme? theme - @ft_config[:available_themes].include?(theme) + def exists_theme?(theme) + Design.available_themes.include?(theme) end - def exist_icon_theme? icon_theme - @ft_config[:available_icon_themes].include?(icon_theme) + def exists_icon_theme?(icon_theme) + Design.available_icon_themes.include?(icon_theme) end def parse_path(files_path = [], remove_until = 'public') diff --git a/vendor/plugins/design/lib/design/editor/helper.rb b/vendor/plugins/design/lib/design/editor/helper.rb index 0a637f5..2aceab5 100644 --- a/vendor/plugins/design/lib/design/editor/helper.rb +++ b/vendor/plugins/design/lib/design/editor/helper.rb @@ -9,9 +9,7 @@ module Design module Helper # draws the user interface for the design editor. - def design_display_editor() - # TODO: check this - raise NotImplementedError + def design_display_editor(content) content = [content_tag( :ul,[ @@ -33,8 +31,8 @@ module Design ].join("\n"), :class => 'select_options' ), - @ft_config[:boxes].map{ |box| - content_tag(:div, edit_blocks(box, main_content) , :id=>"box_#{box.number}") + design.boxes.map { |box| + content_tag(:div, edit_blocks(box, content) , :id=>"box_#{box.number}") }].join("\n") content = content_tag(:div, content, :id => 'flexible_template_edit_mode') @@ -57,6 +55,7 @@ module Design # end + # FIXME: WTF? def flexible_template_block_helper_dict(str) { 'plain_content' => _('Plain Content') , @@ -67,6 +66,70 @@ module Design private + ######################################## + # TEMPLATE/THEME/ICON THEME CHANGE BOXES + ######################################## + + # Generate a select option to choose one of the available templates. + # The available templates are those in 'public/templates' + def select_template + available_templates = Design.available_templates + + template_options = options_for_select(available_templates.map{|template| [template, template] }, design.template) + [ select_tag('template', template_options ), + change_template].join("\n") + end + + # Generate a observer to reload a page when a template is selected + def change_template + observe_field( 'template', + :url => {:action => 'design_editor'}, + :with =>"'template=' + escape(value)", + :complete => "document.location.reload();", + :method => :post + ) + end + + # Generate a select option to choose one of the available themes. + # The available themes are those in 'public/themes' + def select_theme + available_themes = Design.available_themes + theme_options = options_for_select(available_themes.map{|theme| [theme, theme] }, design.theme) + [ select_tag('theme', theme_options ), + change_theme].join("\n") + end + + # Generate a observer to reload a page when a theme is selected + def change_theme + observe_field( 'theme', + :url => {:action => 'design_editor'}, + :with =>"'theme=' + escape(value)", + :complete => "document.location.reload();", + :method => :post + ) + end + + # Generate a select option to choose one of the available icons themes. + # The available icons themes are those in 'public/icons' + def select_icon_theme + available_icon_themes = Design.available_icon_themes + icon_theme_options = options_for_select(available_icon_themes.map{|icon_theme| [icon_theme, icon_theme] }, design.icon_theme ) + [ select_tag('icon_theme', icon_theme_options ), + change_icon_theme].join("\n") + end + + # Generate a observer to reload a page when a icons theme is selected + def change_icon_theme + observe_field( 'icon_theme', + :url => {:action => 'design_editor'}, + :with =>"'icon_theme=' + escape(value)", + :complete => "document.location.reload();", + :method => :post + ) + end + + + ################################################# # TEMPLATES METHODS RELATED ################################################# @@ -126,7 +189,7 @@ module Design # Allows an draggable element change between diferrents boxes def drag_drop_items(box) - boxes = @ft_config[:boxes].reject{|b| b.id == box.id} + boxes = design.boxes.reject{|b| b.id == box.id} boxes.map{ |b| drop_receiving_element("box_#{box.number}", @@ -140,24 +203,6 @@ module Design end - # Generate a select option to choose one of the available templates. - # The available templates are those in 'public/templates' - def select_template - available_templates = @ft_config[:available_templates] - - template_options = options_for_select(available_templates.map{|template| [template, template] }, @ft_config[:template]) - [ select_tag('template_name', template_options ), - change_template].join("\n") - end - - # Generate a observer to reload a page when a template is selected - def change_template - observe_field( 'template_name', - :url => {:action => 'set_default_template'}, - :with =>"'template_name=' + escape(value) + '&object_id=' + escape(#{@ft_config[:owner].id})", - :complete => "document.location.reload();" - ) - end def available_blocks #TOD O check if are valids blocks @@ -230,46 +275,10 @@ module Design end - # Generate a select option to choose one of the available themes. - # The available themes are those in 'public/themes' - def select_theme - available_themes = @ft_config[:available_themes] - theme_options = options_for_select(available_themes.map{|theme| [theme, theme] }, @ft_config[:theme]) - [ select_tag('theme_name', theme_options ), - change_theme].join("\n") - end - - # Generate a observer to reload a page when a theme is selected - def change_theme - observe_field( 'theme_name', - :url => {:action => 'set_default_theme'}, - :with =>"'theme_name=' + escape(value) + '&object_id=' + escape(#{@ft_config[:owner].id})", - :complete => "document.location.reload();" - ) - end - - ################################################# #ICONS THEMES RELATED ################################################# - # Generate a select option to choose one of the available icons themes. - # The available icons themes are those in 'public/icons' - def select_icon_theme - available_icon_themes = @ft_config[:available_icon_themes] - icon_theme_options = options_for_select(available_icon_themes.map{|icon_theme| [icon_theme, icon_theme] }, @ft_config[:icon_theme]) - [ select_tag('icon_theme_name', icon_theme_options ), - change_icon_theme].join("\n") - end - - # Generate a observer to reload a page when a icons theme is selected - def change_icon_theme - observe_field( 'icon_theme_name', - :url => {:action => 'set_default_icon_theme'}, - :with =>"'icon_theme_name=' + escape(value) + '&object_id=' + escape(#{@ft_config[:owner].id})", - :complete => "document.location.reload();" - ) - end end # END OF module Helper diff --git a/vendor/plugins/design/lib/design/helper.rb b/vendor/plugins/design/lib/design/helper.rb index 3d2cfc9..7168317 100644 --- a/vendor/plugins/design/lib/design/helper.rb +++ b/vendor/plugins/design/lib/design/helper.rb @@ -26,10 +26,19 @@ module Design # # If not blocks are present (e.g. the design holder has no blocks yet), # +content+ is returned right away. + # + # If running in design_editor mode def design_display(content = "") + # dispatch to Design::Editor::Helper if running in editor mode + if (self.respond_to?(:design_display_editor) && params[:action] =~ /^design_editor/) + return design_display_editor(content) + end + # no blocks. nothing to be done - return content if design.boxes.empty? + if design.boxes.empty? + return content + end # Generate all boxes of the current profile and considering the defined # on template. diff --git a/vendor/plugins/design/lib/design/template.rb b/vendor/plugins/design/lib/design/template.rb new file mode 100644 index 0000000..c60945b --- /dev/null +++ b/vendor/plugins/design/lib/design/template.rb @@ -0,0 +1,30 @@ +module Design + class Template + + def initialize(name, data) + @data = data + @data['name'] = name + end + def self.find(name) + directory = File.join(Design.public_filesystem_root, Design.design_root, 'templates', name) + yaml_files = Dir.glob(File.join(directory, '*.yml')) + + if yaml_files.size != 1 + raise "#{name} is not a valid template. There must be one (and only one) YAML (*.yml) file describing it in #{directory})" + end + + data = YAML.load_file(yaml_files.first) + + self.new(name, data) + end + def name + @data['name'] + end + def title + @data['title'] || name + end + def number_of_boxes + @data['number_of_boxes'] || 3 + end + end +end diff --git a/vendor/plugins/design/test/acts_as_design_test.rb b/vendor/plugins/design/test/acts_as_design_test.rb index 1aa95a0..0d03316 100644 --- a/vendor/plugins/design/test/acts_as_design_test.rb +++ b/vendor/plugins/design/test/acts_as_design_test.rb @@ -2,6 +2,14 @@ require File.join(File.dirname(__FILE__), 'test_helper') class ActsAsDesignTest < Test::Unit::TestCase + def setup + Design.public_filesystem_root = File.join(File.dirname(__FILE__)) + end + + def teardown + Design.public_filesystem_root = nil + end + def test_should_provide_template_attribute user = DesignTestUser.new assert_equal 'default', user.template @@ -42,4 +50,13 @@ class ActsAsDesignTest < Test::Unit::TestCase end end + def test_should_create_boxes_when_creating + user = DesignTestUser.create!(:name => 'A test user') + + # default template (test/designs/templates/default/default.yml) defines + # 3 boxes + assert_equal 3, Design::Template.find('default').number_of_boxes + assert_equal 3, user.boxes.size + end + end diff --git a/vendor/plugins/design/test/design_editor_test.rb b/vendor/plugins/design/test/design_editor_test.rb index 098f064..3b2fd3a 100644 --- a/vendor/plugins/design/test/design_editor_test.rb +++ b/vendor/plugins/design/test/design_editor_test.rb @@ -3,7 +3,7 @@ require File.join(File.dirname(__FILE__), 'test_helper') class DesignEditorTest < Test::Unit::TestCase def setup - @controller = DesignHelperTestController.new + @controller = DesignEditorTestController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new @@ -14,4 +14,65 @@ class DesignEditorTest < Test::Unit::TestCase Design.public_filesystem_root = nil end + def test_should_render_design_in_editor_mode + get :design_editor + assert_response :success + assert_template 'design_editor' + end + + def test_should_set_new_template + assert_equal 'default', @controller.send(:design).template + post :design_editor, :template => 'empty' + assert_response :redirect + assert_redirected_to :action => 'design_editor' + assert_equal 'empty', @controller.send(:design).template + assert @controller.send(:design).saved? + end + + def test_should_not_set_to_unexisting_template + assert_equal 'default', @controller.send(:design).template + post :design_editor, :template => 'no_existing_template' + assert_response :redirect + assert_redirected_to :action => 'design_editor' + assert_equal 'default', @controller.send(:design).template + assert @controller.send(:design).saved? + end + + + def test_should_set_new_theme + assert_equal 'default', @controller.send(:design).theme + post :design_editor, :theme => 'empty' + assert_response :redirect + assert_redirected_to :action => 'design_editor' + assert_equal 'empty', @controller.send(:design).theme + assert @controller.send(:design).saved? + end + + def test_should_not_set_to_unexisting_theme + assert_equal 'default', @controller.send(:design).theme + post :design_editor, :theme => 'no_existing_theme' + assert_response :redirect + assert_redirected_to :action => 'design_editor' + assert_equal 'default', @controller.send(:design).theme + assert @controller.send(:design).saved? + end + + def test_should_set_new_icon_theme + assert_equal 'default', @controller.send(:design).icon_theme + post :design_editor, :icon_theme => 'empty' + assert_response :redirect + assert_redirected_to :action => 'design_editor' + assert_equal 'empty', @controller.send(:design).icon_theme + assert @controller.send(:design).saved? + end + + def test_should_not_set_to_unexisting_icon_theme + assert_equal 'default', @controller.send(:design).icon_theme + post :design_editor, :icon_theme => 'no_existing_icon_theme' + assert_response :redirect + assert_redirected_to :action => 'design_editor' + assert_equal 'default', @controller.send(:design).icon_theme + assert @controller.send(:design).saved? + end + end diff --git a/vendor/plugins/design/test/design_helper_test.rb b/vendor/plugins/design/test/design_helper_test.rb index f21e902..3c9a33f 100644 --- a/vendor/plugins/design/test/design_helper_test.rb +++ b/vendor/plugins/design/test/design_helper_test.rb @@ -81,6 +81,7 @@ class DesignHelperTest < Test::Unit::TestCase def test_should_generate_all_boxes get :index + assert_response :success assert_tag :tag => 'div', :attributes => { :id => 'box_1' } assert_tag :tag => 'div', :attributes => { :id => 'box_2' } assert_tag :tag => 'div', :attributes => { :id => 'box_3' } @@ -88,6 +89,7 @@ class DesignHelperTest < Test::Unit::TestCase def test_should_render_array_as_list get :index + assert_response :success assert_tag :tag => 'ul', :descendant => { :tag => 'li', :content => 'item1' } @@ -101,16 +103,19 @@ class DesignHelperTest < Test::Unit::TestCase def test_should_process_block_returned_as_content get :index + assert_response :success assert_tag :tag => 'a', :attributes => { :href => /controller_linked_from_block/ } end def test_should_put_string_as_is get :index + assert_response :success assert_tag :tag => 'div', :content => "this is a fixed content block hacked for testing", :attributes => { :class => 'block' } end def test_should_provide_javascript_link_if_available get :javascript + assert_response :success assert_tag :tag => 'script', :attributes => { :type => 'text/javascript', :src => '/designs/templates/default/javascripts/one.js' @@ -123,6 +128,7 @@ class DesignHelperTest < Test::Unit::TestCase def test_should_provide_stylesheet_links_if_available get :template_stylesheets + assert_response :success assert_tag :tag => 'link', :attributes => { :type => 'text/css', :href => '/designs/templates/default/stylesheets/one.css' @@ -135,6 +141,7 @@ class DesignHelperTest < Test::Unit::TestCase def test_should_provide_theme_stylesheet_links_if_available get :theme_stylesheets + assert_response :success assert_tag :tag => 'link', :attributes => { :type => 'text/css', :href => '/designs/themes/default/one.css' @@ -143,6 +150,7 @@ class DesignHelperTest < Test::Unit::TestCase def test_should_support_displaying_icons get :icons + assert_response :success assert_tag :tag => 'img', :attributes => { :src => '/designs/icons/default/something.png' } @@ -153,6 +161,7 @@ class DesignHelperTest < Test::Unit::TestCase def test_should_provide_full_header_tags get :all_header_tags + assert_response :success # template JS assert_tag :tag => 'script', :attributes => { diff --git a/vendor/plugins/design/test/designs/templates/default/default.yml b/vendor/plugins/design/test/designs/templates/default/default.yml new file mode 100644 index 0000000..286a64a --- /dev/null +++ b/vendor/plugins/design/test/designs/templates/default/default.yml @@ -0,0 +1,2 @@ +title: A default template for testing +number_of_boxes: 3 diff --git a/vendor/plugins/design/test/proxy_design_holder_test.rb b/vendor/plugins/design/test/proxy_design_holder_test.rb deleted file mode 100644 index 3114887..0000000 --- a/vendor/plugins/design/test/proxy_design_holder_test.rb +++ /dev/null @@ -1,43 +0,0 @@ -require File.join(File.dirname(__FILE__), 'test_helper') - - -class ProxyDesignHolderTest < Test::Unit::TestCase - - # FIXME: rewrite this test with mocha - def test_design_should_interact_with_sample_holder - design = Design::ProxyDesignHolder.new(SampleHolderForTestingProxyDesignHolder.new) - design.template = 'bli' - assert_equal 'bli', design.template - design.theme = 'bli' - assert_equal 'bli', design.theme - design.icon_theme = 'bli' - assert_equal 'bli', design.icon_theme - design.boxes = [] - assert_equal [], design.boxes - end - - def test_design_user_controller_should_get_a_proper_design - controller = ProxyDesignHolderTestController.new - design = controller.send(:design) - design.template = 'bli' - assert_equal 'bli', design.template - design.theme = 'bli' - assert_equal 'bli', design.theme - design.icon_theme = 'bli' - assert_equal 'bli', design.icon_theme - design.boxes = [] - assert_equal [], design.boxes - end - - def test_should_not_proxy_unrelated_method_calls - # to be safe - assert_nothing_raised do - 1.succ - end - assert_raise NoMethodError do - design = Design::ProxyDesignHolder.new(1) - design.succ - end - end - -end diff --git a/vendor/plugins/design/test/test_helper.rb b/vendor/plugins/design/test/test_helper.rb index df069c3..129f240 100644 --- a/vendor/plugins/design/test/test_helper.rb +++ b/vendor/plugins/design/test/test_helper.rb @@ -47,6 +47,15 @@ end class SampleHolderForTestingProxyDesignHolder attr_accessor :template, :theme, :icon_theme, :boxes + def initialize + @saved = false + end + def save + @saved = true + end + def saved? + @saved + end end class ProxyDesignHolderTestController < ActionController::Base @@ -69,8 +78,26 @@ class InheritanceDesignTestController < ProxyDesignHolderTestController end class DesignEditorTestController < ActionController::Base - design_editor :holder => 'sample_object' + + self.template_root = File.join(File.dirname(__FILE__), 'views') + layout 'design_editor_test' + design_editor :holder => 'sample_object', :autosave => true def initialize @sample_object = SampleHolderForTestingProxyDesignHolder.new + @sample_object.template = 'default' + @sample_object.theme = 'default' + @sample_object.icon_theme = 'default' + def @sample_object.id + 1 + end + + box1 = Design::Box.new(:number => 1) + box2 = Design::Box.new(:number => 2) + main_block = Design::MainBlock.new(:position => 1) + box2.blocks << main_block + main_block.box = box2 + main_block.name = 'Main block' + box3 = Design::Box.new(:number => 3) + @sample_object.boxes = [ box1, box2, box3 ] end end diff --git a/vendor/plugins/design/test/views/design_editor_test/design_editor.rhtml b/vendor/plugins/design/test/views/design_editor_test/design_editor.rhtml new file mode 100644 index 0000000..a903a8f --- /dev/null +++ b/vendor/plugins/design/test/views/design_editor_test/design_editor.rhtml @@ -0,0 +1,3 @@ +
This is a sample text so you can have an idea of how your design will look like.
diff --git a/vendor/plugins/design/test/views/layouts/design_editor_test.rhtml b/vendor/plugins/design/test/views/layouts/design_editor_test.rhtml new file mode 100644 index 0000000..d6911f7 --- /dev/null +++ b/vendor/plugins/design/test/views/layouts/design_editor_test.rhtml @@ -0,0 +1,8 @@ + + + <%= design_all_header_tags %> + + + <%= design_display(yield) %> + + -- libgit2 0.21.2