Module: PagesControllerExtensions

Defined in:
lib/pages_controller_extensions.rb

Class Method Summary collapse

Class Method Details

.included(clazz) ⇒ Object



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/pages_controller_extensions.rb', line 2

def self.included(clazz)
  clazz.class_eval do
    def index_with_tree_children
      if params[:page_id] && (Page.find(params[:page_id]).respond_to?(:tree_children)) || params[:page_id] =~ /_/
        id, *tree_children = params[:page_id].split('_')
        @parent = tree_children.inject(Page.find(id)) {|current, slug| current.tree_child(slug) }
        @level = params[:level].to_i
#          @template_name = 'index'
        response.headers['Content-Type'] = 'text/html;charset=utf-8'
        render :action => 'children.html.haml', :layout => false, :locals => {:simple => true}
      else
        index_without_tree_children
      end
    end
    alias_method_chain :index, :tree_children
    
    def tree_children
      id, *tree_children = params[:page_id].split('_')
      @parent = tree_children.inject(Page.find(id)) {|current, slug| current.tree_child(slug) }
      @level = params[:level].to_i
      @template_name = 'index'
      response.headers['Content-Type'] = 'text/html;charset=utf-8'
      render :action => 'children.html.haml', :layout => false
    end
    
    def more_nodes
      id, *tree_children = params[:page_id].split('_')
      if tree_children.nil? # regular page
        @parent = Page.find id
      else
        @parent = tree_children.inject(Page.find(id)) {|current, slug| current.tree_child(slug) }
      end

      @level = params[:level].to_i
      @offset = params[:offset].to_i
      @end = @offset + 10
      @template_name = 'index'
      response.headers['Content-Type'] = 'text/html;charset=utf-8'
      render :action => 'children.html.haml', :layout => false
    end
    
    before_filter :include_admin_tree_javascript, :only => :index
    private
      def include_admin_tree_javascript
        @content_for_page_scripts ||= ''
        @content_for_page_scripts <<(<<-EOF)
   Object.extend(SiteMapBehavior.prototype, {
     onclick: function(event) {
        if (this.isExpander(event.target)) {
          var row = event.findElement('tr');
          if (this.hasChildren(row)) {
            this.toggleBranch(row, event.target);
          }
        }
    		if (this.isMoreNodeFetcher(event.target)) {
    			var row = event.findElement('tr')
    			this.getMoreNodes(row, event.target);
    			return false;
    		}
      },
     extractPageId: function(row) {
       if (/page_([\\d]+(_[\\d_A-Z]+)?)/i.test(row.id)) {
         return RegExp.$1;
      }
       else {
         return row.id;
       }
     },
      extractOffset: function(row) {
        var level = this.extractLevel(row.previous(1))
        var counter = 10
        var found = 0
        while(found == 0){
          if(this.extractLevel(row.previous(counter)) == level)
            counter += 1
          else
            found = 1
        }
        return counter
      },        
      isMoreNodeFetcher: function(element) {
        return element.match('a.more_node_fetcher');
      },
     getBranch: function(row) {
       var id = this.extractPageId(row);
        var level = this.extractLevel(row);
        var spinner = $('busy_' + id);
        
        if(id.include("_")){
    			new Ajax.Updater(
    				row,
    				'/admin/pages/' + id + '/tree_children?level=' + level,
    				{
    					insertion: "after",
    					onLoading:  function() { spinner.show(); this.updating = true  }.bind(this),
    	        onComplete: function() { spinner.fade(); this.updating = false }.bind(this),
    	        method: 'get'
    				}
    			);
    		}
        else{
          new Ajax.Updater(
          	row,
    	      '/admin/pages/' + id + '/children?level=' + level,
    	      {
    	        insertion: "after",
    	        onLoading:  function() { spinner.show(); this.updating = true  }.bind(this),
    	        onComplete: function() { spinner.fade(); this.updating = false }.bind(this),
    	        method: 'get'
    	      }
    	    );
    		}
      },
      getMoreNodes: function(row) {
        var offset = this.extractOffset(row);
        var level = this.extractLevel(row.previous(offset));
        var id = this.extractPageId(row.previous(offset));
        var spinner = $('node_fetcher_' + id + '_spinner');
        new Ajax.Updater(
  				row,
  				'/admin/pages/' + id + '/more_nodes/' + offset + '?level=' + level,
  				{
  					insertion: "before",
  					onLoading:  function() { spinner.show(); this.updating = true  }.bind(this),
  	        onComplete: function() { spinner.fade(); this.updating = false }.bind(this),
  	        method: 'get'
  				}
  			);
      }
   });
 EOF
      end
  end
end