Commit 416a5be0d8e0b350c0295fe56c210999915e6c0f
1 parent
438ab96e
Exists in
master
and in
28 other branches
ActionItem152: removed design plugin; adding a home-made block manager
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1202 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
39 changed files
with
592 additions
and
58 deletions
Show diff stats
app/controllers/admin/admin_panel_controller.rb
| @@ -8,7 +8,9 @@ class AdminPanelController < AdminController | @@ -8,7 +8,9 @@ class AdminPanelController < AdminController | ||
| 8 | # as the default holder | 8 | # as the default holder |
| 9 | before_filter :load_default_enviroment | 9 | before_filter :load_default_enviroment |
| 10 | 10 | ||
| 11 | - design :holder => 'environment' | 11 | + def boxes_holder |
| 12 | + environment | ||
| 13 | + end | ||
| 12 | 14 | ||
| 13 | protected | 15 | protected |
| 14 | 16 |
app/controllers/admin/edit_template_controller.rb
| 1 | class EditTemplateController < AdminController | 1 | class EditTemplateController < AdminController |
| 2 | 2 | ||
| 3 | - design_editor :holder => 'environment', :autosave => true, :block_types => :block_types | 3 | + #FIXME |
| 4 | + #design_editor :holder => 'environment', :autosave => true, :block_types => :block_types | ||
| 4 | 5 | ||
| 5 | def block_types | 6 | def block_types |
| 6 | %w[ | 7 | %w[ |
app/controllers/application.rb
| @@ -5,7 +5,14 @@ class ApplicationController < ActionController::Base | @@ -5,7 +5,14 @@ class ApplicationController < ActionController::Base | ||
| 5 | helper :document | 5 | helper :document |
| 6 | helper :language | 6 | helper :language |
| 7 | 7 | ||
| 8 | - design :holder => 'environment' | 8 | + def boxes_holder |
| 9 | + environment | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | + def boxes_editor? | ||
| 13 | + false | ||
| 14 | + end | ||
| 15 | + protected :boxes_editor? | ||
| 9 | 16 | ||
| 10 | def self.no_design_blocks | 17 | def self.no_design_blocks |
| 11 | @no_design_blocks = true | 18 | @no_design_blocks = true |
| @@ -0,0 +1,52 @@ | @@ -0,0 +1,52 @@ | ||
| 1 | +class BoxOrganizerController < ApplicationController | ||
| 2 | + | ||
| 3 | + def move_block | ||
| 4 | + @block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) | ||
| 5 | + | ||
| 6 | + @source_box = @block.box | ||
| 7 | + | ||
| 8 | + target_position = nil | ||
| 9 | + | ||
| 10 | + if (params[:target] =~ /before-block-([0-9]+)/) | ||
| 11 | + block_before = boxes_holder.blocks.find($1) | ||
| 12 | + target_position = block_before.position | ||
| 13 | + | ||
| 14 | + @target_box = block_before.box | ||
| 15 | + else | ||
| 16 | + (params[:target] =~ /end-of-box-([0-9])+/) | ||
| 17 | + | ||
| 18 | + @target_box = boxes_holder.boxes.find($1) | ||
| 19 | + end | ||
| 20 | + | ||
| 21 | + if (@source_box != @target_box) | ||
| 22 | + @block.remove_from_list | ||
| 23 | + @block.box = @target_box | ||
| 24 | + end | ||
| 25 | + | ||
| 26 | + if target_position.nil? | ||
| 27 | + # insert in the end of the box | ||
| 28 | + @block.insert_at(@target_box.blocks.size + 1) | ||
| 29 | + @block.move_to_bottom | ||
| 30 | + else | ||
| 31 | + # insert the block in the given position | ||
| 32 | + @block.insert_at(@block.position && @block.position < target_position ? target_position - 1 : target_position) | ||
| 33 | + end | ||
| 34 | + | ||
| 35 | + @block.save! | ||
| 36 | + | ||
| 37 | + @target_box.reload | ||
| 38 | + end | ||
| 39 | + | ||
| 40 | + def move_block_down | ||
| 41 | + @block = boxes_holder.blocks.find(params[:id]) | ||
| 42 | + @block.move_lower | ||
| 43 | + redirect_to :back | ||
| 44 | + end | ||
| 45 | + | ||
| 46 | + def move_block_up | ||
| 47 | + @block = boxes_holder.blocks.find(params[:id]) | ||
| 48 | + @block.move_higher | ||
| 49 | + redirect_to :back | ||
| 50 | + end | ||
| 51 | + | ||
| 52 | +end |
app/controllers/my_profile/cms_controller.rb
| @@ -2,7 +2,9 @@ class CmsController < MyProfileController | @@ -2,7 +2,9 @@ class CmsController < MyProfileController | ||
| 2 | 2 | ||
| 3 | protect 'post_content', :profile, :only => [:edit, :new, :reorder, :delete] | 3 | protect 'post_content', :profile, :only => [:edit, :new, :reorder, :delete] |
| 4 | 4 | ||
| 5 | - design :holder => :profile | 5 | + def boxes_holder |
| 6 | + profile | ||
| 7 | + end | ||
| 6 | 8 | ||
| 7 | include CmsHelper | 9 | include CmsHelper |
| 8 | 10 | ||
| @@ -11,6 +13,7 @@ class CmsController < MyProfileController | @@ -11,6 +13,7 @@ class CmsController < MyProfileController | ||
| 11 | TextileArticle, | 13 | TextileArticle, |
| 12 | RssFeed, | 14 | RssFeed, |
| 13 | UploadedFile, | 15 | UploadedFile, |
| 16 | + ImageGallery, | ||
| 14 | ] | 17 | ] |
| 15 | 18 | ||
| 16 | def view | 19 | def view |
app/controllers/my_profile/profile_editor_controller.rb
| @@ -4,7 +4,8 @@ class ProfileEditorController < MyProfileController | @@ -4,7 +4,8 @@ class ProfileEditorController < MyProfileController | ||
| 4 | 4 | ||
| 5 | helper :profile | 5 | helper :profile |
| 6 | 6 | ||
| 7 | - design_editor :holder => 'profile',:autosave => true, :block_types => :block_types | 7 | + # FIXME |
| 8 | + #design_editor :holder => 'profile',:autosave => true, :block_types => :block_types | ||
| 8 | 9 | ||
| 9 | 10 | ||
| 10 | def block_types | 11 | def block_types |
app/controllers/public/account_controller.rb
| @@ -2,8 +2,6 @@ class AccountController < PublicController | @@ -2,8 +2,6 @@ class AccountController < PublicController | ||
| 2 | 2 | ||
| 3 | before_filter :load_default_environment | 3 | before_filter :load_default_environment |
| 4 | 4 | ||
| 5 | - design :holder => 'environment' | ||
| 6 | - | ||
| 7 | # say something nice, you goof! something sweet. | 5 | # say something nice, you goof! something sweet. |
| 8 | def index | 6 | def index |
| 9 | unless logged_in? | 7 | unless logged_in? |
app/controllers/public/category_controller.rb
| @@ -5,7 +5,9 @@ class CategoryController < ApplicationController | @@ -5,7 +5,9 @@ class CategoryController < ApplicationController | ||
| 5 | #FIXME This is not necessary because the application controller define the envrioment | 5 | #FIXME This is not necessary because the application controller define the envrioment |
| 6 | # as the default holder | 6 | # as the default holder |
| 7 | 7 | ||
| 8 | - design :holder => 'environment' | 8 | + def boxes_holder |
| 9 | + environment | ||
| 10 | + end | ||
| 9 | 11 | ||
| 10 | def load_default_enviroment | 12 | def load_default_enviroment |
| 11 | @environment = Environment.default | 13 | @environment = Environment.default |
app/controllers/public/home_controller.rb
app/helpers/application_helper.rb
| @@ -5,6 +5,8 @@ module ApplicationHelper | @@ -5,6 +5,8 @@ module ApplicationHelper | ||
| 5 | include PermissionName | 5 | include PermissionName |
| 6 | 6 | ||
| 7 | include LightboxHelper | 7 | include LightboxHelper |
| 8 | + | ||
| 9 | + include BoxesHelper | ||
| 8 | 10 | ||
| 9 | # Displays context help. You can pass the content of the help message as the | 11 | # Displays context help. You can pass the content of the help message as the |
| 10 | # first parameter or using template code inside a block passed to this | 12 | # first parameter or using template code inside a block passed to this |
| @@ -144,14 +146,6 @@ module ApplicationHelper | @@ -144,14 +146,6 @@ module ApplicationHelper | ||
| 144 | end | 146 | end |
| 145 | end | 147 | end |
| 146 | 148 | ||
| 147 | - def search_box | ||
| 148 | - [form_tag({:controller => 'search', :action => 'index'}, :method => 'get'), | ||
| 149 | - design_display_button_submit('find', '', :title => _('Search')), | ||
| 150 | - text_field_tag( 'query', _('your search here'), :id => "input_search", :onfocus => 'javascript: if (this.value == %s) { this.value = ""; }' % _('your search here').inspect, :onblur => "javascript: if (this.value == '') { this.value = %s}" % _('your search here').inspect), | ||
| 151 | - '</form>', | ||
| 152 | - ].join("\n") | ||
| 153 | - end | ||
| 154 | - | ||
| 155 | def footer | 149 | def footer |
| 156 | # FIXME: add some information from the environment | 150 | # FIXME: add some information from the environment |
| 157 | [ | 151 | [ |
| @@ -267,7 +261,11 @@ module ApplicationHelper | @@ -267,7 +261,11 @@ module ApplicationHelper | ||
| 267 | end | 261 | end |
| 268 | 262 | ||
| 269 | def button(type, label, url, html_options = {}) | 263 | def button(type, label, url, html_options = {}) |
| 270 | - design_display_button(type, label, url, { :class => 'with_text' }.merge(html_options)) | 264 | + the_class = "button #{type}" |
| 265 | + if html_options.has_key?(:class) | ||
| 266 | + the_class << ' ' << html_options[:class] | ||
| 267 | + end | ||
| 268 | + link_to(content_tag('span', label), url, html_options.merge(:class => the_class )) | ||
| 271 | end | 269 | end |
| 272 | 270 | ||
| 273 | def submit_button(type, label, html_options = {}) | 271 | def submit_button(type, label, html_options = {}) |
| @@ -275,20 +273,28 @@ module ApplicationHelper | @@ -275,20 +273,28 @@ module ApplicationHelper | ||
| 275 | 273 | ||
| 276 | html_options[:class] = [html_options[:class], 'submit'].compact.join(' ') | 274 | html_options[:class] = [html_options[:class], 'submit'].compact.join(' ') |
| 277 | 275 | ||
| 278 | - bt_submit = design_display_button_submit(type, label, { :class => 'with_text' }.merge(html_options)) | ||
| 279 | - content_tag('p', bt_submit + bt_cancel, :class => 'submitline') | 276 | + the_class = "button with_text #{type}" |
| 277 | + if html_options.has_key?(:class) | ||
| 278 | + the_class << ' ' << html_options[:class] | ||
| 279 | + end | ||
| 280 | + | ||
| 281 | + bt_submit = submit_tag(label, html_options.merge(:class => the_class)) | ||
| 280 | 282 | ||
| 283 | + content_tag('p', bt_submit + bt_cancel, :class => 'submitline') | ||
| 281 | end | 284 | end |
| 282 | 285 | ||
| 283 | def button_to_function(type, label, js_code, html_options = {}) | 286 | def button_to_function(type, label, js_code, html_options = {}) |
| 284 | - #design_display_function_button(type, label, js_code, { :class => 'with_text' }.merge(html_options)) | ||
| 285 | html_options[:class] = "" unless html_options[:class] | 287 | html_options[:class] = "" unless html_options[:class] |
| 286 | html_options[:class] << " button #{type}" | 288 | html_options[:class] << " button #{type}" |
| 287 | link_to_function(label, js_code, html_options) | 289 | link_to_function(label, js_code, html_options) |
| 288 | end | 290 | end |
| 289 | 291 | ||
| 290 | - def icon(icon_name) | ||
| 291 | - design_display_icon(icon_name) | 292 | + def icon(icon_name, html_options = {}) |
| 293 | + the_class = "button #{icon_name}" | ||
| 294 | + if html_options.has_key?(:class) | ||
| 295 | + the_class << ' ' << html_options[:class] | ||
| 296 | + end | ||
| 297 | + content_tag('div', '', html_options.merge(:class => the_class)) | ||
| 292 | end | 298 | end |
| 293 | 299 | ||
| 294 | def button_bar(options = {}, &block) | 300 | def button_bar(options = {}, &block) |
| @@ -0,0 +1,109 @@ | @@ -0,0 +1,109 @@ | ||
| 1 | +module BoxesHelper | ||
| 2 | + | ||
| 3 | + def box_decorator | ||
| 4 | + @box_decorator || DontMoveBlocks | ||
| 5 | + end | ||
| 6 | + | ||
| 7 | + def with_box_decorator(dec, &block) | ||
| 8 | + @box_decorator = dec | ||
| 9 | + result = block.call | ||
| 10 | + @box_decorator = DontMoveBlocks | ||
| 11 | + | ||
| 12 | + result | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + def display_boxes_editor(holder) | ||
| 16 | + with_box_decorator self do | ||
| 17 | + content_tag('div', display_boxes(holder, '<' + _('Main content') + '>'), :id => 'box-organizer') | ||
| 18 | + end | ||
| 19 | + end | ||
| 20 | + | ||
| 21 | + def display_boxes(holder, main_content) | ||
| 22 | + boxes = holder.boxes.first(holder.boxes_limit) | ||
| 23 | + content = boxes.reverse.map { |item| display_box(item, main_content) }.join("\n") | ||
| 24 | + content = main_content if (content.blank?) | ||
| 25 | + content_tag('div', content, :class => 'boxes', :id => 'boxes' ) | ||
| 26 | + end | ||
| 27 | + | ||
| 28 | + def display_box(box, main_content) | ||
| 29 | + content_tag('div', content_tag('div', display_box_content(box, main_content), :class => 'blocks'), :class => 'box', :id => "box-#{box.position}" ) | ||
| 30 | + end | ||
| 31 | + | ||
| 32 | + def display_updated_box(box) | ||
| 33 | + with_box_decorator self do | ||
| 34 | + display_box_content(box, '<' + _('Main content') + '>') | ||
| 35 | + end | ||
| 36 | + end | ||
| 37 | + | ||
| 38 | + def display_box_content(box, main_content) | ||
| 39 | + box.blocks.map { |item| display_block(item, main_content) }.join("\n") + box_decorator.block_target(box) | ||
| 40 | + end | ||
| 41 | + | ||
| 42 | + def display_block(block, main_content = nil) | ||
| 43 | + content = block.content(main_content) | ||
| 44 | + result = | ||
| 45 | + case content | ||
| 46 | + when Hash | ||
| 47 | + content_tag('iframe', '', :src => url_for(content)) | ||
| 48 | + when String | ||
| 49 | + if content =~ /^https?:\/\// | ||
| 50 | + content_tag('iframe', '', :src => content) | ||
| 51 | + else | ||
| 52 | + content | ||
| 53 | + end | ||
| 54 | + end | ||
| 55 | + | ||
| 56 | + classes = ['block', block.class.name.underscore.gsub('_', '-') ].uniq.join(' ') | ||
| 57 | + | ||
| 58 | + box_decorator.block_target(block.box, block) + content_tag('div', result + box_decorator.block_move_buttons(block), :class => classes, :id => "block-#{block.id}") + box_decorator.block_handle(block) | ||
| 59 | + end | ||
| 60 | + | ||
| 61 | + module DontMoveBlocks | ||
| 62 | + # does nothing | ||
| 63 | + def self.block_target(box, block = nil) | ||
| 64 | + '' | ||
| 65 | + end | ||
| 66 | + # does nothing | ||
| 67 | + def self.block_handle(block) | ||
| 68 | + '' | ||
| 69 | + end | ||
| 70 | + def self.block_move_buttons(block) | ||
| 71 | + '' | ||
| 72 | + end | ||
| 73 | + end | ||
| 74 | + | ||
| 75 | + # generates a place where you can drop a block and get the block moved to | ||
| 76 | + # there. | ||
| 77 | + # | ||
| 78 | + # If +block+ is not nil, then it means "place the dropped block before this | ||
| 79 | + # one.". Otherwise, it means "place the dropped block at the end of the | ||
| 80 | + # list" | ||
| 81 | + # | ||
| 82 | + # +box+ is always needed | ||
| 83 | + def block_target(box, block = nil) | ||
| 84 | + id = | ||
| 85 | + if block.nil? | ||
| 86 | + "end-of-box-#{box.id}" | ||
| 87 | + else | ||
| 88 | + "before-block-#{block.id}" | ||
| 89 | + end | ||
| 90 | + | ||
| 91 | + content_tag('div', ' ', :id => id, :class => 'block-target' ) + drop_receiving_element(id, :url => { :action => 'move_block', :target => id }, :accept => 'block', :hoverclass => 'block-target-hover') | ||
| 92 | + end | ||
| 93 | + | ||
| 94 | + # makes the given block draggable so it can be moved away. | ||
| 95 | + def block_handle(block) | ||
| 96 | + draggable_element("block-#{block.id}", :revert => true) | ||
| 97 | + end | ||
| 98 | + | ||
| 99 | + def block_move_buttons(block) | ||
| 100 | + buttons = [] | ||
| 101 | + | ||
| 102 | + # FIXME hardcoded paths !!! | ||
| 103 | + buttons << link_to(image_tag('/designs/icons/default/gtk-go-up.png', :alt => _('Move block up')), { :action => 'move_block_up', :id => block.id }, { :method => 'post' }) unless block.first? | ||
| 104 | + buttons << link_to(image_tag('/designs/icons/default/gtk-go-down.png', :alt => _('Move block down')), { :action => 'move_block_down' ,:id => block.id }, { :method => 'post'}) unless block.last? | ||
| 105 | + | ||
| 106 | + content_tag('div', buttons.join("\n"), :class => 'block-move-buttons') | ||
| 107 | + end | ||
| 108 | + | ||
| 109 | +end |
| @@ -0,0 +1,13 @@ | @@ -0,0 +1,13 @@ | ||
| 1 | +class Block < ActiveRecord::Base | ||
| 2 | + acts_as_list :scope => :box | ||
| 3 | + belongs_to :box | ||
| 4 | + | ||
| 5 | + def content(main_content = nil) | ||
| 6 | + "This is block number %d" % self.id | ||
| 7 | + end | ||
| 8 | + | ||
| 9 | + def editor | ||
| 10 | + { :controller => 'block_editor', :id => self.id } | ||
| 11 | + end | ||
| 12 | + | ||
| 13 | +end |
app/models/environment.rb
| @@ -25,7 +25,14 @@ class Environment < ActiveRecord::Base | @@ -25,7 +25,14 @@ class Environment < ActiveRecord::Base | ||
| 25 | # Relationships and applied behaviour | 25 | # Relationships and applied behaviour |
| 26 | # ################################################# | 26 | # ################################################# |
| 27 | 27 | ||
| 28 | - acts_as_design | 28 | + acts_as_having_boxes |
| 29 | + | ||
| 30 | + after_create do |env| | ||
| 31 | + 3.times do | ||
| 32 | + env.boxes << Box.new | ||
| 33 | + end | ||
| 34 | + env.boxes.first.blocks << MainBlock.new | ||
| 35 | + end | ||
| 29 | 36 | ||
| 30 | # One Environment can be reached by many domains | 37 | # One Environment can be reached by many domains |
| 31 | has_many :domains, :as => :owner | 38 | has_many :domains, :as => :owner |
app/models/link_block.rb
app/models/profile.rb
| @@ -14,7 +14,7 @@ class Profile < ActiveRecord::Base | @@ -14,7 +14,7 @@ class Profile < ActiveRecord::Base | ||
| 14 | 14 | ||
| 15 | acts_as_accessible | 15 | acts_as_accessible |
| 16 | 16 | ||
| 17 | - acts_as_design | 17 | + acts_as_having_boxes |
| 18 | 18 | ||
| 19 | acts_as_searchable :fields => [ :name, :identifier ] | 19 | acts_as_searchable :fields => [ :name, :identifier ] |
| 20 | 20 | ||
| @@ -81,6 +81,13 @@ class Profile < ActiveRecord::Base | @@ -81,6 +81,13 @@ class Profile < ActiveRecord::Base | ||
| 81 | self.environment ||= Environment.default | 81 | self.environment ||= Environment.default |
| 82 | end | 82 | end |
| 83 | 83 | ||
| 84 | + after_create do |profile| | ||
| 85 | + 3.times do | ||
| 86 | + profile.boxes << Box.new | ||
| 87 | + end | ||
| 88 | + profile.boxes.first.blocks << MainBlock.new | ||
| 89 | + end | ||
| 90 | + | ||
| 84 | # Returns information about the profile's owner that was made public by | 91 | # Returns information about the profile's owner that was made public by |
| 85 | # him/her. | 92 | # him/her. |
| 86 | # | 93 | # |
app/models/recent_documents_block.rb
| @@ -0,0 +1,8 @@ | @@ -0,0 +1,8 @@ | ||
| 1 | +from = "box-#{@source_box.position}" | ||
| 2 | +to = "box-#{@target_box.position}" | ||
| 3 | + | ||
| 4 | +page.replace_html(from, display_updated_box(@source_box)) | ||
| 5 | +page.replace_html(to, display_updated_box(@target_box)) | ||
| 6 | + | ||
| 7 | +page.visual_effect(:highlight, from) | ||
| 8 | +page.visual_effect(:highlight, to) unless (from == to) |
app/views/layouts/application.rhtml
| @@ -10,12 +10,17 @@ | @@ -10,12 +10,17 @@ | ||
| 10 | </title> | 10 | </title> |
| 11 | <meta name="description" content="FIXME: Descriptions of Noosfero" /> | 11 | <meta name="description" content="FIXME: Descriptions of Noosfero" /> |
| 12 | <meta name="keywords" content="Noosfero, Community, Open Source" /> | 12 | <meta name="keywords" content="Noosfero, Community, Open Source" /> |
| 13 | - <%= design_all_header_tags %> | ||
| 14 | <%= stylesheet_link_tag 'common' %> | 13 | <%= stylesheet_link_tag 'common' %> |
| 15 | <%= stylesheet_link_tag 'help' %> | 14 | <%= stylesheet_link_tag 'help' %> |
| 16 | <%= stylesheet_link_tag 'menu' %> | 15 | <%= stylesheet_link_tag 'menu' %> |
| 17 | <%= stylesheet_link_tag 'button' %> | 16 | <%= stylesheet_link_tag 'button' %> |
| 18 | <%= stylesheet_link_tag 'search' %> | 17 | <%= stylesheet_link_tag 'search' %> |
| 18 | + <%= stylesheet_link_tag 'blocks' %> | ||
| 19 | + | ||
| 20 | + <%# FIXME %> | ||
| 21 | + <%= stylesheet_link_tag '/designs/templates/default/stylesheets/style.css' %> | ||
| 22 | + | ||
| 23 | + <%= javascript_include_tag(:defaults) %> | ||
| 19 | <%= javascript_include_tag 'menu' %> | 24 | <%= javascript_include_tag 'menu' %> |
| 20 | <%= include_lightbox_header %> | 25 | <%= include_lightbox_header %> |
| 21 | <%# cms stuff %> | 26 | <%# cms stuff %> |
| @@ -70,10 +75,15 @@ | @@ -70,10 +75,15 @@ | ||
| 70 | <div id='header_content'> | 75 | <div id='header_content'> |
| 71 | </div> | 76 | </div> |
| 72 | 77 | ||
| 73 | - <% if uses_design_blocks? %> | ||
| 74 | - <%= design_display(yield) %> | ||
| 75 | - <% else %> | 78 | + <% if @controller.send(:boxes_editor?) %> |
| 76 | <%= yield %> | 79 | <%= yield %> |
| 80 | + <%= display_boxes_editor(@controller.boxes_holder) %> | ||
| 81 | + <% else %> | ||
| 82 | + <% if uses_design_blocks? %> | ||
| 83 | + <%= display_boxes(@controller.boxes_holder, yield) %> | ||
| 84 | + <% else %> | ||
| 85 | + <%= yield %> | ||
| 86 | + <% end %> | ||
| 77 | <% end %> | 87 | <% end %> |
| 78 | 88 | ||
| 79 | </div><!-- id="content" --> | 89 | </div><!-- id="content" --> |
config/environment.rb
| @@ -80,6 +80,7 @@ require 'noosfero/transliterations' | @@ -80,6 +80,7 @@ require 'noosfero/transliterations' | ||
| 80 | 80 | ||
| 81 | require 'acts_as_filesystem' | 81 | require 'acts_as_filesystem' |
| 82 | require 'acts_as_searchable' | 82 | require 'acts_as_searchable' |
| 83 | +require 'acts_as_having_boxes' | ||
| 83 | 84 | ||
| 84 | # to the hell, I want all my models loaded before the application run anything | 85 | # to the hell, I want all my models loaded before the application run anything |
| 85 | Dir.glob("#{RAILS_ROOT}/app/models/*.rb").each do |model| | 86 | Dir.glob("#{RAILS_ROOT}/app/models/*.rb").each do |model| |
db/migrate/001_add_design_support.rb
| 1 | class AddDesignSupport < ActiveRecord::Migration | 1 | class AddDesignSupport < ActiveRecord::Migration |
| 2 | def self.up | 2 | def self.up |
| 3 | - create_table :design_boxes do |t| | ||
| 4 | - t.column :name, :string | ||
| 5 | - t.column :title, :string | ||
| 6 | - t.column :number, :integer | 3 | + |
| 4 | + create_table :boxes do |t| | ||
| 7 | t.column :owner_type, :string | 5 | t.column :owner_type, :string |
| 8 | t.column :owner_id, :integer | 6 | t.column :owner_id, :integer |
| 7 | + | ||
| 8 | + # acts_as_list | ||
| 9 | + t.column :position, :integer | ||
| 9 | end | 10 | end |
| 10 | 11 | ||
| 11 | - create_table :design_blocks do |t| | 12 | + create_table :blocks do |t| |
| 12 | t.column :title, :string | 13 | t.column :title, :string |
| 13 | t.column :box_id, :integer | 14 | t.column :box_id, :integer |
| 14 | - t.column :position, :integer | ||
| 15 | t.column :type, :string | 15 | t.column :type, :string |
| 16 | t.column :settings, :text | 16 | t.column :settings, :text |
| 17 | + | ||
| 18 | + # acts_as_list | ||
| 19 | + t.column :position, :integer | ||
| 17 | end | 20 | end |
| 18 | 21 | ||
| 19 | end | 22 | end |
| 20 | 23 | ||
| 21 | def self.down | 24 | def self.down |
| 22 | - drop_table :design_boxes | ||
| 23 | - drop_table :design_blocks | 25 | + drop_table :boxes |
| 26 | + drop_table :blocks | ||
| 24 | end | 27 | end |
| 25 | 28 | ||
| 26 | end | 29 | end |
| @@ -0,0 +1,36 @@ | @@ -0,0 +1,36 @@ | ||
| 1 | +module ActsAsHavingBoxes | ||
| 2 | + | ||
| 3 | + module ClassMethods | ||
| 4 | + def acts_as_having_boxes | ||
| 5 | + has_many :boxes, :as => :owner, :dependent => :destroy, :order => 'position' | ||
| 6 | + self.send(:include, ActsAsHavingBoxes) | ||
| 7 | + end | ||
| 8 | + end | ||
| 9 | + | ||
| 10 | + module BlockArray | ||
| 11 | + def find(id) | ||
| 12 | + select { |item| item.id == id.to_i }.first | ||
| 13 | + end | ||
| 14 | + end | ||
| 15 | + | ||
| 16 | + def blocks(reload = false) | ||
| 17 | + if (reload) | ||
| 18 | + @blocks = nil | ||
| 19 | + end | ||
| 20 | + if @blocks.nil? | ||
| 21 | + @blocks = boxes.inject([]) do |acc,obj| | ||
| 22 | + acc.concat(obj.blocks) | ||
| 23 | + end | ||
| 24 | + @blocks.send(:extend, BlockArray) | ||
| 25 | + end | ||
| 26 | + @blocks | ||
| 27 | + end | ||
| 28 | + | ||
| 29 | + # returns 3 unless the class table has a boxes_limit column. In that case | ||
| 30 | + # return the value of the column. | ||
| 31 | + def boxes_limit | ||
| 32 | + self[:boxes_limit] || 3 | ||
| 33 | + end | ||
| 34 | +end | ||
| 35 | + | ||
| 36 | +ActiveRecord::Base.extend(ActsAsHavingBoxes::ClassMethods) |
lib/needs_profile.rb
| @@ -3,7 +3,9 @@ module NeedsProfile | @@ -3,7 +3,9 @@ module NeedsProfile | ||
| 3 | module ClassMethods | 3 | module ClassMethods |
| 4 | def needs_profile | 4 | def needs_profile |
| 5 | before_filter :load_profile | 5 | before_filter :load_profile |
| 6 | - design :holder => 'profile' | 6 | + def boxes_holder |
| 7 | + profile | ||
| 8 | + end | ||
| 7 | end | 9 | end |
| 8 | end | 10 | end |
| 9 | 11 |
public/designs/icons/default/README
| @@ -34,6 +34,8 @@ gtk-find.png Nuovo stock/ | @@ -34,6 +34,8 @@ gtk-find.png Nuovo stock/ | ||
| 34 | gtk-go-back-ltr.png Nuovo stock/ | 34 | gtk-go-back-ltr.png Nuovo stock/ |
| 35 | gtk-media-next-ltr.png Nuovo stock/ | 35 | gtk-media-next-ltr.png Nuovo stock/ |
| 36 | gtk-add.png Nuovo stock/ | 36 | gtk-add.png Nuovo stock/ |
| 37 | +gtk-go-up.png Nuovo stock/ | ||
| 38 | +gtk-go-down.png Nuovo stock/ | ||
| 37 | ### END OF ICONS LISTING ### | 39 | ### END OF ICONS LISTING ### |
| 38 | 40 | ||
| 39 | Licensing of GNOME themes | 41 | Licensing of GNOME themes |
1 KB
public/designs/icons/default/gtk-go-up.png
public/designs/icons/default/style.css
| @@ -14,3 +14,5 @@ | @@ -14,3 +14,5 @@ | ||
| 14 | .button.back { background-image: url(gtk-go-back-ltr.png); } | 14 | .button.back { background-image: url(gtk-go-back-ltr.png); } |
| 15 | .button.next { background-image: url(gtk-media-next-ltr.png); } | 15 | .button.next { background-image: url(gtk-media-next-ltr.png); } |
| 16 | .button.add { background-image: url(gtk-add.png); } | 16 | .button.add { background-image: url(gtk-add.png); } |
| 17 | +.button.up { background-image: url(gtk-go-up.png); } | ||
| 18 | +.button.down { background-image: url(gtk-go-down.png); } |
| @@ -0,0 +1,58 @@ | @@ -0,0 +1,58 @@ | ||
| 1 | + | ||
| 2 | +/* main box */ | ||
| 3 | +#box-1 { | ||
| 4 | + margin-left: 210px; | ||
| 5 | + margin-right: 210px; | ||
| 6 | +} | ||
| 7 | + | ||
| 8 | +#box-2 { | ||
| 9 | + float: left; | ||
| 10 | + width: 200px; | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +#box-3 { | ||
| 14 | + float: right; | ||
| 15 | + width: 200px; | ||
| 16 | +} | ||
| 17 | + | ||
| 18 | + | ||
| 19 | +.block { | ||
| 20 | + margin: 5px; | ||
| 21 | + padding: 5px; | ||
| 22 | +} | ||
| 23 | + | ||
| 24 | +.block-target { | ||
| 25 | + margin: 5px; | ||
| 26 | + height: 2px; | ||
| 27 | + height: 15px; | ||
| 28 | + border: 1px dashed #e0e0e0; | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +.block-target-hover { | ||
| 32 | + background: #ffd; | ||
| 33 | + border: 1px solid red; | ||
| 34 | + height: 30px; | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +.block iframe { | ||
| 38 | + width: 100%; | ||
| 39 | + border: none; | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +/*********************************************************** | ||
| 43 | + * put borders around boxes and blocks when organizing boxes | ||
| 44 | + ***********************************************************/ | ||
| 45 | + | ||
| 46 | +#box-organizer .box { | ||
| 47 | + border: 1px solid #ccc; | ||
| 48 | +} | ||
| 49 | + | ||
| 50 | +#box-organizer #box-1 .block { | ||
| 51 | + border: 2px dashed green; | ||
| 52 | +} | ||
| 53 | +#box-organizer #box-2 .block { | ||
| 54 | + border: 2px dashed red; | ||
| 55 | +} | ||
| 56 | +#box-organizer #box-3 .block { | ||
| 57 | + border: 2px dashed blue; | ||
| 58 | +} |
test/functional/application_controller_test.rb
| @@ -107,7 +107,7 @@ class ApplicationControllerTest < Test::Unit::TestCase | @@ -107,7 +107,7 @@ class ApplicationControllerTest < Test::Unit::TestCase | ||
| 107 | 107 | ||
| 108 | should 'use design plugin to generate blocks' do | 108 | should 'use design plugin to generate blocks' do |
| 109 | get :index | 109 | get :index |
| 110 | - assert_tag :tag => 'div', :attributes => { :id => 'boxes', :class => 'design_boxes' } | 110 | + assert_tag :tag => 'div', :attributes => { :id => 'boxes', :class => 'boxes' } |
| 111 | end | 111 | end |
| 112 | 112 | ||
| 113 | should 'not use design plugin when tells so' do | 113 | should 'not use design plugin when tells so' do |
| @@ -116,6 +116,6 @@ class ApplicationControllerTest < Test::Unit::TestCase | @@ -116,6 +116,6 @@ class ApplicationControllerTest < Test::Unit::TestCase | ||
| 116 | end | 116 | end |
| 117 | @controller = NoDesignBlocksTestController.new | 117 | @controller = NoDesignBlocksTestController.new |
| 118 | get :index | 118 | get :index |
| 119 | - assert_no_tag :tag => 'div', :attributes => { :id => 'boxes', :class => 'design_boxes' } | 119 | + assert_no_tag :tag => 'div', :attributes => { :id => 'boxes', :class => 'boxes' } |
| 120 | end | 120 | end |
| 121 | end | 121 | end |
| @@ -0,0 +1,135 @@ | @@ -0,0 +1,135 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | +require 'profile_design_controller' | ||
| 3 | + | ||
| 4 | +class ProfileDesignController; def rescue_action(e) raise e end; end | ||
| 5 | + | ||
| 6 | +class ProfileDesignControllerTest < Test::Unit::TestCase | ||
| 7 | + | ||
| 8 | + def setup | ||
| 9 | + @controller = ProfileDesignController.new | ||
| 10 | + @request = ActionController::TestRequest.new | ||
| 11 | + @response = ActionController::TestResponse.new | ||
| 12 | + | ||
| 13 | + holder = create_user('designtestuser').person | ||
| 14 | + holder.save! | ||
| 15 | + | ||
| 16 | + @box1 = Box.new | ||
| 17 | + @box2 = Box.new | ||
| 18 | + @box3 = Box.new | ||
| 19 | + | ||
| 20 | + holder.boxes << @box1 | ||
| 21 | + holder.boxes << @box2 | ||
| 22 | + holder.boxes << @box3 | ||
| 23 | + | ||
| 24 | + ###### BOX 1 | ||
| 25 | + @b1 = Block.new | ||
| 26 | + @box1.blocks << @b1 | ||
| 27 | + @b1.save! | ||
| 28 | + | ||
| 29 | + @b2 = Block.new | ||
| 30 | + @box1.blocks << @b2 | ||
| 31 | + @b2.save! | ||
| 32 | + | ||
| 33 | + ###### BOX 2 | ||
| 34 | + @b3 = Block.new | ||
| 35 | + @box2.blocks << @b3 | ||
| 36 | + @b3.save! | ||
| 37 | + | ||
| 38 | + @b4 = MainBlock.new | ||
| 39 | + @box2.blocks << @b4 | ||
| 40 | + @b4.save! | ||
| 41 | + | ||
| 42 | + @b5 = Block.new | ||
| 43 | + @box2.blocks << @b5 | ||
| 44 | + @b5.save! | ||
| 45 | + | ||
| 46 | + @b6 = Block.new | ||
| 47 | + @box2.blocks << @b6 | ||
| 48 | + @b6.save! | ||
| 49 | + | ||
| 50 | + ###### BOX 3 | ||
| 51 | + @b7 = Block.new | ||
| 52 | + @box3.blocks << @b7 | ||
| 53 | + @b7.save! | ||
| 54 | + | ||
| 55 | + @b8 = Block.new | ||
| 56 | + @box3.blocks << @b8 | ||
| 57 | + @b8.save! | ||
| 58 | + | ||
| 59 | + @request.env['HTTP_REFERER'] = '/editor' | ||
| 60 | + | ||
| 61 | + @controller.expects(:boxes_holder).returns(holder).at_least_once | ||
| 62 | + end | ||
| 63 | + | ||
| 64 | + def test_should_move_block_to_the_end_of_another_block | ||
| 65 | + get :move_block, :profile => 'ze', :id => "block-#{@b1.id}", :target => "end-of-box-#{@box2.id}" | ||
| 66 | + | ||
| 67 | + assert_response :success | ||
| 68 | + | ||
| 69 | + @b1.reload | ||
| 70 | + @box2.reload | ||
| 71 | + | ||
| 72 | + assert_equal @box2, @b1.box | ||
| 73 | + assert @b1.in_list? | ||
| 74 | + assert_equal @box2.blocks.size, @b1.position # i.e. assert @b1.last? | ||
| 75 | + end | ||
| 76 | + | ||
| 77 | + def test_should_move_block_to_the_middle_of_another_block | ||
| 78 | + # block 4 is in box 2 | ||
| 79 | + get :move_block, :profile => 'ze', :id => "block-#{@b1.id}", :target => "before-block-#{@b4.id}" | ||
| 80 | + | ||
| 81 | + assert_response :success | ||
| 82 | + | ||
| 83 | + @b1.reload | ||
| 84 | + @b4.reload | ||
| 85 | + | ||
| 86 | + assert_equal @b4.box, @b1.box | ||
| 87 | + assert @b1.in_list? | ||
| 88 | + assert_equal @b4.position - 1, @b1.position | ||
| 89 | + end | ||
| 90 | + | ||
| 91 | + def test_block_can_be_moved_up | ||
| 92 | + get :move_block, :profile => 'ze', :id => "block-#{@b4.id}", :target => "before-block-#{@b3.id}" | ||
| 93 | + | ||
| 94 | + assert_response :success | ||
| 95 | + @b4.reload | ||
| 96 | + @b3.reload | ||
| 97 | + | ||
| 98 | + assert_equal @b3.position - 1, @b4.position | ||
| 99 | + end | ||
| 100 | + | ||
| 101 | + def test_block_can_be_moved_down | ||
| 102 | + assert_equal [1,2,3], [@b3,@b4,@b5].map {|item| item.position} | ||
| 103 | + | ||
| 104 | + # b3 -> before b5 | ||
| 105 | + get :move_block, :profile => 'ze', :id => "block-#{@b3.id}", :target => "before-block-#{@b5.id}" | ||
| 106 | + | ||
| 107 | + [@b3,@b4,@b5].each do |item| | ||
| 108 | + item.reload | ||
| 109 | + end | ||
| 110 | + | ||
| 111 | + assert_equal [1,2,3], [@b4, @b3, @b5].map {|item| item.position} | ||
| 112 | + end | ||
| 113 | + | ||
| 114 | + def test_should_be_able_to_move_block_directly_down | ||
| 115 | + post :move_block_down, :profile => 'ze', :id => @b1.id | ||
| 116 | + assert_response :redirect | ||
| 117 | + | ||
| 118 | + @b1.reload | ||
| 119 | + @b2.reload | ||
| 120 | + | ||
| 121 | + assert_equal [1,2], [@b2,@b1].map {|item| item.position} | ||
| 122 | + end | ||
| 123 | + | ||
| 124 | + def test_should_be_able_to_move_block_directly_up | ||
| 125 | + post :move_block_up, :profile => 'ze', :id => @b2.id | ||
| 126 | + assert_response :redirect | ||
| 127 | + | ||
| 128 | + @b1.reload | ||
| 129 | + @b2.reload | ||
| 130 | + | ||
| 131 | + assert_equal [1,2], [@b2,@b1].map {|item| item.position} | ||
| 132 | + end | ||
| 133 | + | ||
| 134 | +end | ||
| 135 | + |
test/functional/region_validators_controller_test.rb
| @@ -27,7 +27,7 @@ class RegionValidatorsControllerTest < Test::Unit::TestCase | @@ -27,7 +27,7 @@ class RegionValidatorsControllerTest < Test::Unit::TestCase | ||
| 27 | environment.regions << region | 27 | environment.regions << region |
| 28 | assert !region.new_record? | 28 | assert !region.new_record? |
| 29 | 29 | ||
| 30 | - @controller.expects(:environment).returns(environment) | 30 | + @controller.expects(:environment).returns(environment).at_least_once |
| 31 | 31 | ||
| 32 | get :region, :id => region.id | 32 | get :region, :id => region.id |
| 33 | 33 |
test/integration/routing_test.rb
| @@ -80,12 +80,13 @@ class RoutingTest < ActionController::IntegrationTest | @@ -80,12 +80,13 @@ class RoutingTest < ActionController::IntegrationTest | ||
| 80 | assert_routing('/cat', :controller => 'category', :action => 'index') | 80 | assert_routing('/cat', :controller => 'category', :action => 'index') |
| 81 | end | 81 | end |
| 82 | 82 | ||
| 83 | - def test_routing_to_controllers_inside_design_blocks_directory | ||
| 84 | - assert_routing('/block/cojones/favorite_links_profile/show/1', :profile => 'cojones', :controller => 'favorite_links_profile', :action => 'show', :id => '1') | ||
| 85 | - assert_routing('/block/cojones/favorite_links_profile/save', :profile => 'cojones', :controller => 'favorite_links_profile', :action => 'save') | 83 | + #FIXME remove this if design_blocks is not going to be used; or uncomment otherwise; |
| 84 | + #def test_routing_to_controllers_inside_design_blocks_directory | ||
| 85 | + # assert_routing('/block/cojones/favorite_links_profile/show/1', :profile => 'cojones', :controller => 'favorite_links_profile', :action => 'show', :id => '1') | ||
| 86 | + # assert_routing('/block/cojones/favorite_links_profile/save', :profile => 'cojones', :controller => 'favorite_links_profile', :action => 'save') | ||
| 86 | 87 | ||
| 87 | - assert_routing('/block/cojones/list_block/show/1', :profile => 'cojones', :controller => 'list_block', :action => 'show', :id => '1') | ||
| 88 | - end | 88 | + # assert_routing('/block/cojones/list_block/show/1', :profile => 'cojones', :controller => 'list_block', :action => 'show', :id => '1') |
| 89 | + #end | ||
| 89 | 90 | ||
| 90 | def test_tag_viewing | 91 | def test_tag_viewing |
| 91 | assert_routing('/tag', :controller => 'search', :action => 'tags') | 92 | assert_routing('/tag', :controller => 'search', :action => 'tags') |
| @@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | + | ||
| 3 | +class ActsAsHavingBoxesTest < Test::Unit::TestCase | ||
| 4 | + | ||
| 5 | + should 'be able to find blocks by id' do | ||
| 6 | + env = Environment.create!(:name => 'my test environment') | ||
| 7 | + env.boxes.destroy_all | ||
| 8 | + | ||
| 9 | + env.boxes << Box.new | ||
| 10 | + block = Block.new | ||
| 11 | + env.boxes.first.blocks << block | ||
| 12 | + | ||
| 13 | + assert_equal block, env.blocks.find(block.id) | ||
| 14 | + end | ||
| 15 | + | ||
| 16 | +end |
test/unit/environment_test.rb
| @@ -199,13 +199,24 @@ class EnvironmentTest < Test::Unit::TestCase | @@ -199,13 +199,24 @@ class EnvironmentTest < Test::Unit::TestCase | ||
| 199 | assert env_boxes > 0 | 199 | assert env_boxes > 0 |
| 200 | assert env_blocks > 0 | 200 | assert env_blocks > 0 |
| 201 | 201 | ||
| 202 | - boxes = Design::Box.count | ||
| 203 | - blocks = Design::Block.count | 202 | + boxes = Box.count |
| 203 | + blocks = Block.count | ||
| 204 | 204 | ||
| 205 | env.destroy | 205 | env.destroy |
| 206 | 206 | ||
| 207 | - assert_equal boxes - env_boxes, Design::Box.count | ||
| 208 | - assert_equal blocks - env_blocks, Design::Block.count | 207 | + assert_equal boxes - env_boxes, Box.count |
| 208 | + assert_equal blocks - env_blocks, Block.count | ||
| 209 | + end | ||
| 210 | + | ||
| 211 | + should 'have boxes and blocks upon creation' do | ||
| 212 | + environment = Environment.create!(:name => 'a test environment') | ||
| 213 | + assert environment.boxes.size > 0 | ||
| 214 | + assert environment.blocks.size > 0 | ||
| 215 | + end | ||
| 216 | + | ||
| 217 | + should 'have at least one MainBlock upon creation' do | ||
| 218 | + environment = Environment.create!(:name => 'a test environment') | ||
| 219 | + assert(environment.blocks.any? { |block| block.kind_of? MainBlock }) | ||
| 209 | end | 220 | end |
| 210 | 221 | ||
| 211 | end | 222 | end |
test/unit/profile_test.rb
| @@ -200,21 +200,34 @@ class ProfileTest < Test::Unit::TestCase | @@ -200,21 +200,34 @@ class ProfileTest < Test::Unit::TestCase | ||
| 200 | assert_equal profile, Profile['testprofile'] | 200 | assert_equal profile, Profile['testprofile'] |
| 201 | end | 201 | end |
| 202 | 202 | ||
| 203 | + should 'have boxes and blocks upon creation' do | ||
| 204 | + profile = Profile.create!(:name => 'test profile', :identifier => 'testprofile') | ||
| 205 | + | ||
| 206 | + assert profile.boxes.size > 0 | ||
| 207 | + assert profile.blocks.size > 0 | ||
| 208 | + end | ||
| 209 | + | ||
| 210 | + should 'have at least one MainBlock upon creation' do | ||
| 211 | + profile = Profile.create!(:name => 'test profile', :identifier => 'testprofile') | ||
| 212 | + assert(profile.blocks.any? { |block| block.kind_of? MainBlock }) | ||
| 213 | + end | ||
| 214 | + | ||
| 203 | should 'remove boxes and blocks when removing profile' do | 215 | should 'remove boxes and blocks when removing profile' do |
| 204 | - profile = Profile.create!(:name => 'test environment', :identifier => 'testenv') | 216 | + profile = Profile.create!(:name => 'test profile', :identifier => 'testprofile') |
| 205 | 217 | ||
| 206 | profile_boxes = profile.boxes.size | 218 | profile_boxes = profile.boxes.size |
| 207 | profile_blocks = profile.blocks.size | 219 | profile_blocks = profile.blocks.size |
| 220 | + | ||
| 208 | assert profile_boxes > 0 | 221 | assert profile_boxes > 0 |
| 209 | assert profile_blocks > 0 | 222 | assert profile_blocks > 0 |
| 210 | 223 | ||
| 211 | - boxes = Design::Box.count | ||
| 212 | - blocks = Design::Block.count | 224 | + boxes = Box.count |
| 225 | + blocks = Block.count | ||
| 213 | 226 | ||
| 214 | profile.destroy | 227 | profile.destroy |
| 215 | 228 | ||
| 216 | - assert_equal boxes - profile_boxes, Design::Box.count | ||
| 217 | - assert_equal blocks - profile_blocks, Design::Block.count | 229 | + assert_equal boxes - profile_boxes, Box.count |
| 230 | + assert_equal blocks - profile_blocks, Block.count | ||
| 218 | end | 231 | end |
| 219 | 232 | ||
| 220 | should 'provide url to itself' do | 233 | should 'provide url to itself' do |