Commit df6f32a7c72389da55aff01b50645b7df65280e5
1 parent
123c4f76
Exists in
master
and in
28 other branches
ActionItem0: refactoring of templates transformations. Creating a manage_templat…
…e plugin to manage the web git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@78 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
15 changed files
with
31 additions
and
414 deletions
Show diff stats
app/controllers/application.rb
... | ... | @@ -5,6 +5,8 @@ class ApplicationController < ActionController::Base |
5 | 5 | before_filter :detect_stuff_by_domain |
6 | 6 | attr_reader :virtual_community |
7 | 7 | |
8 | + uses_manage_template :edit => false | |
9 | + | |
8 | 10 | before_filter :load_boxes |
9 | 11 | #TODO To diplay the content we need a variable called '@boxes'. |
10 | 12 | #This variable is a set of boxes belongs to a owner | ... | ... |
app/controllers/edit_template_controller.rb
1 | 1 | class EditTemplateController < ApplicationController |
2 | 2 | |
3 | - before_filter :manage_template | |
4 | - | |
5 | - attr_accessor :controller_manage_template | |
6 | - | |
7 | - def manage_template? | |
8 | - self.controller_manage_template == true ? true : false | |
9 | - end | |
10 | - | |
11 | - # This method changes a block content to a different box place and | |
12 | - # updates all boxes at the ends | |
13 | - def change_box | |
14 | - b = Block.find(params[:block]) | |
15 | - b.box = Box.find(params[:box_id]) | |
16 | - b.save | |
17 | - render :update do |page| | |
18 | - @boxes.each do |box| | |
19 | - @box = box | |
20 | - page.replace_html "box_#{box.number}", {:partial => 'layouts/box_template'} | |
21 | - end | |
22 | - end | |
23 | - end | |
24 | - | |
25 | - def sort_box | |
26 | - blocks = Array.new | |
27 | - box_number = params[:box_number] | |
28 | - pos = 0 | |
29 | - params["sort_#{box_number}"].each do |block_id| | |
30 | - pos = pos + 1 | |
31 | - b = Block.find(block_id) | |
32 | - b.position = pos | |
33 | - b.save | |
34 | - blocks.push(b) | |
35 | - end | |
36 | - @box = box_number | |
37 | - render :partial => 'layouts/box_template' | |
38 | - end | |
39 | - | |
40 | - def set_sort_mode | |
41 | - box = Box.find(params[:box_id]) | |
42 | - render :update do |page| | |
43 | - @box = box | |
44 | - page.replace_html "box_#{box.number}", {:partial => 'layouts/box_template'} | |
45 | - page.sortable "sort_#{box.number}", :url => {:action => 'sort_box', :box_number => box.number} | |
46 | - end | |
47 | - end | |
48 | - | |
49 | - private | |
50 | - | |
51 | - def manage_template | |
52 | - self.controller_manage_template = true | |
53 | - end | |
3 | + uses_manage_template :edit => true | |
54 | 4 | |
55 | 5 | end | ... | ... |
app/helpers/application_helper.rb
... | ... | @@ -27,23 +27,6 @@ module ApplicationHelper |
27 | 27 | ) |
28 | 28 | end |
29 | 29 | |
30 | - # This method expect an array of boxes and the content retuned of a controller action | |
31 | - # It will generate the boxes div according the yaml definition | |
32 | - def display_boxes(boxes, main_content = "") | |
33 | - # If no boxes is passed return the main content | |
34 | - return main_content if boxes.nil? | |
35 | - | |
36 | - #Generate all boxes of the current profile and considering the defined on template. | |
37 | - content = boxes.map do |box| | |
38 | - content_tag(:div, edit_mode? ? edit_blocks(box, main_content) : show_blocks(box, main_content) , :id=>"box_#{box.number}") | |
39 | - end | |
40 | - | |
41 | - #In case of edit mode add a new div with a class named 'edit_mode' covering all div boxes. | |
42 | - content = content_tag(:div, content, :class => 'edit_mode') if edit_mode? | |
43 | - | |
44 | - content | |
45 | - end | |
46 | - | |
47 | 30 | # Load all the css files of a existing template with the template_name passed as argument. |
48 | 31 | # |
49 | 32 | # The files loaded are in the path: |
... | ... | @@ -73,27 +56,4 @@ module ApplicationHelper |
73 | 56 | end |
74 | 57 | end |
75 | 58 | |
76 | - private | |
77 | - | |
78 | - # Check if the current controller is the controller that allows layout editing | |
79 | - def edit_mode? | |
80 | - controller.manage_template? | |
81 | - end | |
82 | - | |
83 | - # Shows the block as the struture bellow | |
84 | - # <ul id="sort#{number of the box}"> | |
85 | - # <li class="block_item_box_#{number of the box}" id="block_#{id of block}"> | |
86 | - # </li> | |
87 | - # </ul> | |
88 | - # | |
89 | - def show_blocks(box, main_content = "") | |
90 | - blocks = box.blocks_sort_by_position | |
91 | - content_tag(:ul, | |
92 | - blocks.map {|b| | |
93 | - content_tag(:li, b.main? ? main_content : b.to_html, :class =>"block_item_box_#{box.number}" , :id => "block_#{b.id}" ) | |
94 | - }, :id => "sort_#{box.number}" | |
95 | - ) | |
96 | - end | |
97 | - | |
98 | - | |
99 | 59 | end | ... | ... |
app/helpers/edit_template_helper.rb
1 | 1 | # Methods added to this helper will be available to all templates in the application. |
2 | 2 | module EditTemplateHelper |
3 | 3 | |
4 | - private | |
5 | - | |
6 | - # Shows the blocks as defined in <tt>show_blocks</tt> adding the sortable and draggable elements. | |
7 | - # In this case the layout can be manipulated | |
8 | - def edit_blocks(box, main_content = "") | |
9 | - blocks = box.blocks_sort_by_position | |
10 | - content_tag(:ul, box.name + | |
11 | - link_to_remote(_('sort'), {:update => "sort_#{box.number}", :url => {:action => 'set_sort_mode', :box_id => box.id }}, :class => 'sort_button') + | |
12 | - blocks.map {|b| | |
13 | - content_tag(:li, b.name, :class =>"block_item_box_#{box.number}" , :id => "block_#{b.id}" ) + draggable("block_#{b.id}") | |
14 | - }.to_s, :id => "sort_#{box.number}" | |
15 | - ) + drag_drop_items(box) | |
16 | - end | |
17 | - | |
18 | - # Allows the biven box to have sortable elements | |
19 | - def sortable_block(box_number) | |
20 | - sortable_element "sort_#{box_number}", | |
21 | - :url => {:action => 'sort_box', :box_number => box_number }, | |
22 | - :complete => visual_effect(:highlight, "sort_#{box_number}") | |
23 | - end | |
24 | - | |
25 | - # Allows an element item to be draggable | |
26 | - def draggable(item) | |
27 | - draggable_element(item, :ghosting => true, :revert => true) | |
28 | - end | |
29 | - | |
30 | - # Allows an draggable element change between diferrents boxes | |
31 | - def drag_drop_items(box) | |
32 | - boxes = Box.find_not_box(box.id) | |
33 | - | |
34 | - boxes.map{ |b| | |
35 | - drop_receiving_element("box_#{box.number}", | |
36 | - :accept => "block_item_box_#{b.number}", | |
37 | - :complete => "$('spinner').hide();", | |
38 | - :before => "$('spinner').show();", | |
39 | - :hoverclass => 'hover', | |
40 | - :with => "'block=' + encodeURIComponent(element.id.split('_').last())", | |
41 | - :url => {:action=>:change_box, :box_id => box.id}) | |
42 | - }.to_s | |
43 | - end | |
44 | - | |
45 | - | |
46 | 4 | end | ... | ... |
app/models/block.rb
... | ... | @@ -1,26 +0,0 @@ |
1 | -#It's the class that define the block's content will be displayed on box in a determined web | |
2 | -class Block < ActiveRecord::Base | |
3 | - include ActionView::Helpers::TagHelper | |
4 | - belongs_to :box | |
5 | - | |
6 | - #<tt>position</tt> codl not be nil and must be an integer | |
7 | - validates_numericality_of :position, :only_integer => true , :message => _('%{fn} must be composed only of integers') | |
8 | - | |
9 | - # A block must be associated to a box | |
10 | - validates_presence_of :box_id | |
11 | - | |
12 | - # Method that define the html code displayed on the box. | |
13 | - # This method cannot be used directly it will be redefined by the children classes | |
14 | - def to_html | |
15 | - raise _("This is a main class, don't use it") | |
16 | - end | |
17 | - | |
18 | - # This method always return false excepted when redefined by the MainBlock class. It mean the current block it's not the result of a | |
19 | - # controller action. | |
20 | - # | |
21 | - # The child class MainBlock subscribes this method returning true. | |
22 | - def main? | |
23 | - false | |
24 | - end | |
25 | - | |
26 | -end |
app/models/box.rb
... | ... | @@ -1,21 +0,0 @@ |
1 | -class Box < ActiveRecord::Base | |
2 | - has_many :blocks | |
3 | - belongs_to :owner, :polymorphic => true | |
4 | - | |
5 | - #we cannot have two boxs with the same number to the same owner | |
6 | - validates_uniqueness_of :number, :scope => [:owner_type, :owner_id] | |
7 | - | |
8 | - #<tt>number</tt> could not be nil and must be an integer | |
9 | - validates_numericality_of :number, :only_integer => true, :message => _('%{fn} must be composed only of integers.') | |
10 | - | |
11 | - # Find all boxes except the box with the id given. | |
12 | - def self.find_not_box(box_id) | |
13 | - return Box.find(:all, :conditions => ['id != ?', box_id]) | |
14 | - end | |
15 | - | |
16 | - # Return all blocks of the current box object sorted by the position block | |
17 | - def blocks_sort_by_position | |
18 | - self.blocks.sort{|x,y| x.position <=> y.position} | |
19 | - end | |
20 | - | |
21 | -end |
app/models/main_block.rb
... | ... | @@ -0,0 +1,28 @@ |
1 | +class ActsAsTaggableMigration < ActiveRecord::Migration | |
2 | + def self.up | |
3 | + create_table :tags do |t| | |
4 | + t.column :name, :string | |
5 | + t.column :parent_id, :integer | |
6 | + t.column :pending, :bool | |
7 | + end | |
8 | + | |
9 | + create_table :taggings do |t| | |
10 | + t.column :tag_id, :integer | |
11 | + t.column :taggable_id, :integer | |
12 | + | |
13 | + # You should make sure that the column created is | |
14 | + # long enough to store the required class names. | |
15 | + t.column :taggable_type, :string | |
16 | + | |
17 | + t.column :created_at, :datetime | |
18 | + end | |
19 | + | |
20 | + add_index :taggings, :tag_id | |
21 | + add_index :taggings, [:taggable_id, :taggable_type] | |
22 | + end | |
23 | + | |
24 | + def self.down | |
25 | + drop_table :taggings | |
26 | + drop_table :tags | |
27 | + end | |
28 | +end | ... | ... |
db/migrate/004_create_boxes.rb
... | ... | @@ -1,14 +0,0 @@ |
1 | -class CreateBoxes < ActiveRecord::Migration | |
2 | - def self.up | |
3 | - create_table :boxes do |t| | |
4 | - t.column :name, :string | |
5 | - t.column :number, :integer | |
6 | - t.column :owner_type, :string | |
7 | - t.column :owner_id, :integer | |
8 | - end | |
9 | - end | |
10 | - | |
11 | - def self.down | |
12 | - drop_table :boxes | |
13 | - end | |
14 | -end |
db/migrate/005_create_blocks.rb
... | ... | @@ -1,14 +0,0 @@ |
1 | -class CreateBlocks < ActiveRecord::Migration | |
2 | - def self.up | |
3 | - create_table :blocks do |t| | |
4 | - t.column :name, :string | |
5 | - t.column :box_id, :integer | |
6 | - t.column :position, :integer | |
7 | - t.column :type, :string | |
8 | - end | |
9 | - end | |
10 | - | |
11 | - def self.down | |
12 | - drop_table :blocks | |
13 | - end | |
14 | -end |
db/migrate/006_acts_as_taggable_migration.rb
... | ... | @@ -1,28 +0,0 @@ |
1 | -class ActsAsTaggableMigration < ActiveRecord::Migration | |
2 | - def self.up | |
3 | - create_table :tags do |t| | |
4 | - t.column :name, :string | |
5 | - t.column :parent_id, :integer | |
6 | - t.column :pending, :bool | |
7 | - end | |
8 | - | |
9 | - create_table :taggings do |t| | |
10 | - t.column :tag_id, :integer | |
11 | - t.column :taggable_id, :integer | |
12 | - | |
13 | - # You should make sure that the column created is | |
14 | - # long enough to store the required class names. | |
15 | - t.column :taggable_type, :string | |
16 | - | |
17 | - t.column :created_at, :datetime | |
18 | - end | |
19 | - | |
20 | - add_index :taggings, :tag_id | |
21 | - add_index :taggings, [:taggable_id, :taggable_type] | |
22 | - end | |
23 | - | |
24 | - def self.down | |
25 | - drop_table :taggings | |
26 | - drop_table :tags | |
27 | - end | |
28 | -end |
test/fixtures/blocks.yml
... | ... | @@ -1,40 +0,0 @@ |
1 | -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html | |
2 | -#Main Block | |
3 | -one: | |
4 | - id: 1 | |
5 | - box_id: 2 | |
6 | - position: 1 | |
7 | - type: 'MainBlock' | |
8 | - name: 'Main Content' | |
9 | -# Link Blocks | |
10 | -two: | |
11 | - id: 2 | |
12 | - box_id: 1 | |
13 | - position: 2 | |
14 | - type: 'LinkBlock' | |
15 | - name: 'List of Links 1' | |
16 | -three: | |
17 | - id: 3 | |
18 | - box_id: 1 | |
19 | - position: 3 | |
20 | - type: 'LinkBlock' | |
21 | - name: 'List of Link 2' | |
22 | -#List Blocks | |
23 | -four: | |
24 | - id: 4 | |
25 | - box_id: 1 | |
26 | - position: 1 | |
27 | - type: 'ListBlock' | |
28 | - name: 'List of Names 1' | |
29 | -five: | |
30 | - id: 5 | |
31 | - box_id: 3 | |
32 | - position: 1 | |
33 | - type: 'ListBlock' | |
34 | - name: 'List of Names 2' | |
35 | -six: | |
36 | - id: 6 | |
37 | - box_id: 3 | |
38 | - position: 2 | |
39 | - type: 'ListBlock' | |
40 | - name: 'List of Names 3' |
test/fixtures/boxes.yml
... | ... | @@ -1,19 +0,0 @@ |
1 | -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html | |
2 | -one: | |
3 | - id: 1 | |
4 | - number: 1 | |
5 | - owner_type: 'Profile' | |
6 | - owner_id: 1 | |
7 | - name: 'Box One' | |
8 | -two: | |
9 | - id: 2 | |
10 | - number: 2 | |
11 | - owner_type: 'Profile' | |
12 | - owner_id: 1 | |
13 | - name: 'Box Two' | |
14 | -three: | |
15 | - id: 3 | |
16 | - number: 3 | |
17 | - owner_type: 'Profile' | |
18 | - owner_id: 1 | |
19 | - name: 'Box Three' |
test/unit/block_test.rb
... | ... | @@ -1,58 +0,0 @@ |
1 | -require File.dirname(__FILE__) + '/../test_helper' | |
2 | - | |
3 | -class BlockTest < Test::Unit::TestCase | |
4 | - fixtures :blocks | |
5 | - | |
6 | - # Replace this with your real tests. | |
7 | - def test_create | |
8 | - count = Block.count | |
9 | - b = Block.new | |
10 | - assert !b.valid? | |
11 | - assert b.errors.invalid?(:box_id) | |
12 | - assert b.errors.invalid?(:position) | |
13 | - | |
14 | - u = User.new | |
15 | - assert u.save | |
16 | - box = Box.new | |
17 | - box.owner = u | |
18 | - box.number = 1000 | |
19 | - assert box.save | |
20 | - b.box = box | |
21 | - assert !b.valid? | |
22 | - assert b.errors.invalid?(:position) | |
23 | - | |
24 | - b.position=1 | |
25 | - assert b.save | |
26 | - | |
27 | - assert_equal count + 1, Block.count | |
28 | - end | |
29 | - | |
30 | - def test_box_presence | |
31 | - b = Block.new | |
32 | - b.position = 1000 | |
33 | - assert !b.valid? | |
34 | - assert b.errors.invalid?(:box_id) | |
35 | - | |
36 | - u = User.new | |
37 | - assert u.save | |
38 | - box = Box.new | |
39 | - box.owner = u | |
40 | - box.number = 1000 | |
41 | - assert box.save | |
42 | - b.box = box | |
43 | - assert b.valid? | |
44 | - | |
45 | - end | |
46 | - | |
47 | - def test_destroy | |
48 | - b = Block.find(1) | |
49 | - assert b.destroy | |
50 | - end | |
51 | - | |
52 | - def test_valid_fixtures | |
53 | - Block.find(:all).each do |b| | |
54 | - assert b.valid? | |
55 | - end | |
56 | - end | |
57 | - | |
58 | -end |
test/unit/box_test.rb
... | ... | @@ -1,52 +0,0 @@ |
1 | -require File.dirname(__FILE__) + '/../test_helper' | |
2 | - | |
3 | -class BoxTest < Test::Unit::TestCase | |
4 | - fixtures :boxes, :blocks | |
5 | - | |
6 | - def test_destroy | |
7 | - count = Box.count | |
8 | - assert Box.find(1).destroy | |
9 | - assert_equal count - 1, Box.count | |
10 | - end | |
11 | - | |
12 | - def test_create | |
13 | - count = Box.count | |
14 | - b = Box.new | |
15 | - b.number = 2 | |
16 | - assert b.save | |
17 | - assert count + 1, Box.count | |
18 | - end | |
19 | - | |
20 | - | |
21 | - def test_number_format | |
22 | - b = Box.new | |
23 | - b.number = "none" | |
24 | - assert !b.valid? | |
25 | - assert b.errors.invalid?(:number) | |
26 | - | |
27 | - b = Box.new | |
28 | - b.number = 10.2 | |
29 | - assert !b.save | |
30 | - | |
31 | - b = Box.new | |
32 | - b.number = 10 | |
33 | - assert b.save | |
34 | - | |
35 | - end | |
36 | - | |
37 | - def test_unique_number | |
38 | - assert Box.delete_all | |
39 | - assert Box.create(:number => 1) | |
40 | - | |
41 | - b = Box.new(:number => 1) | |
42 | - assert !b.valid? | |
43 | - assert b.errors.invalid?(:number) | |
44 | - end | |
45 | - | |
46 | - def test_presence_number | |
47 | - b = Box.new(:number => nil) | |
48 | - assert !b.valid? | |
49 | - assert b.errors.invalid?(:number) | |
50 | - end | |
51 | - | |
52 | -end |