Commit df6f32a7c72389da55aff01b50645b7df65280e5

Authored by LeandroNunes
1 parent 123c4f76

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
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
... ... @@ -1,9 +0,0 @@
1   -class MainBlock < Block
2   -
3   - #This method always return true. It means the current block have to display the result of controller action.
4   - #It has the same result of put the yield variable on the application layout
5   - def main?
6   - true
7   - end
8   -
9   -end
db/migrate/004_acts_as_taggable_migration.rb 0 → 100644
... ... @@ -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