caboose-cms 0.3.129 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/caboose/admin_block_edit.js +267 -0
  3. data/app/assets/javascripts/caboose/admin_page_edit_content.js +71 -45
  4. data/app/assets/javascripts/caboose/admin_page_edit_content_bak.js +164 -0
  5. data/app/assets/javascripts/caboose/admin_page_new_blocks.js +4 -4
  6. data/app/assets/stylesheets/caboose/admin_page_edit_content.css +37 -16
  7. data/app/controllers/caboose/block_types_controller.rb +162 -0
  8. data/app/controllers/caboose/blocks_controller.rb +293 -0
  9. data/app/controllers/caboose/edit_controller.rb +33 -0
  10. data/app/controllers/caboose/pages_controller.rb +4 -3
  11. data/app/controllers/caboose/posts_controller.rb +1 -1
  12. data/app/models/caboose/block.rb +222 -0
  13. data/app/models/caboose/block_type.rb +28 -0
  14. data/app/models/caboose/core_plugin.rb +6 -6
  15. data/app/models/caboose/page.rb +8 -4
  16. data/app/models/caboose/schema.rb +90 -59
  17. data/app/models/caboose/utilities/schema.rb +3 -3
  18. data/app/views/caboose/block_types/admin_edit.html.erb +111 -0
  19. data/app/views/caboose/{page_block_types → block_types}/admin_index.html.erb +2 -2
  20. data/app/views/caboose/{page_block_types → block_types}/admin_new.html.erb +9 -6
  21. data/app/views/caboose/blocks/_block.html.erb +8 -0
  22. data/app/views/caboose/blocks/_heading.html.erb +7 -0
  23. data/app/views/caboose/blocks/_html.html.erb +7 -0
  24. data/app/views/caboose/blocks/_image.html.erb +0 -0
  25. data/app/views/caboose/blocks/_layout_default.html.erb +33 -0
  26. data/app/views/caboose/blocks/_layout_default_content.html.erb +16 -0
  27. data/app/views/caboose/blocks/_layout_default_footer.html.erb +20 -0
  28. data/app/views/caboose/blocks/_layout_default_header.html.erb +32 -0
  29. data/app/views/caboose/blocks/_richtext.html.erb +7 -0
  30. data/app/views/caboose/{page_blocks/_richtext.html.erb → blocks/_text.html.erb} +1 -2
  31. data/app/views/caboose/blocks/admin_edit.html.erb +106 -0
  32. data/app/views/caboose/{page_blocks → blocks}/admin_edit_custom.html.erb +0 -0
  33. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h1.html.erb +0 -0
  34. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h2.html.erb +0 -0
  35. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h3.html.erb +0 -0
  36. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h4.html.erb +0 -0
  37. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h5.html.erb +0 -0
  38. data/app/views/caboose/{page_blocks → blocks}/admin_edit_h6.html.erb +0 -0
  39. data/app/views/caboose/{page_blocks → blocks}/admin_edit_richtext.html.erb +0 -0
  40. data/app/views/caboose/blocks/admin_new.html.erb +55 -0
  41. data/app/views/caboose/pages/_admin_header.html.erb +1 -1
  42. data/app/views/caboose/pages/_content.html.erb +1 -1
  43. data/app/views/caboose/pages/_new_block_header.html.erb +13 -0
  44. data/app/views/caboose/pages/admin_edit_content.html.erb +24 -20
  45. data/app/views/caboose/pages/show.html.erb +13 -30
  46. data/app/views/layouts/caboose/application.html.erb +26 -14
  47. data/config/routes.rb +38 -30
  48. data/lib/caboose/engine.rb +2 -2
  49. data/lib/caboose/version.rb +1 -1
  50. metadata +33 -35
  51. data/app/controllers/caboose/page_block_field_values_controller.rb +0 -55
  52. data/app/controllers/caboose/page_block_fields_controller.rb +0 -123
  53. data/app/controllers/caboose/page_block_types_controller.rb +0 -100
  54. data/app/controllers/caboose/page_blocks_controller.rb +0 -165
  55. data/app/models/caboose/page_block.rb +0 -49
  56. data/app/models/caboose/page_block_field.rb +0 -21
  57. data/app/models/caboose/page_block_field_value.rb +0 -39
  58. data/app/models/caboose/page_block_renderers/h1.rb +0 -5
  59. data/app/models/caboose/page_block_renderers/h2.rb +0 -5
  60. data/app/models/caboose/page_block_renderers/h3.rb +0 -5
  61. data/app/models/caboose/page_block_renderers/h4.rb +0 -5
  62. data/app/models/caboose/page_block_renderers/h5.rb +0 -5
  63. data/app/models/caboose/page_block_renderers/h6.rb +0 -5
  64. data/app/models/caboose/page_block_renderers/p.rb +0 -5
  65. data/app/models/caboose/page_block_renderers/richtext.rb +0 -5
  66. data/app/models/caboose/page_block_type.rb +0 -12
  67. data/app/views/caboose/page_block_fields/admin_edit.html.erb +0 -77
  68. data/app/views/caboose/page_block_fields/admin_new.html.erb +0 -30
  69. data/app/views/caboose/page_block_types/admin_edit.html.erb +0 -82
  70. data/app/views/caboose/page_blocks/_heading.html.erb +0 -7
  71. data/app/views/caboose/page_blocks/_partial.html.erb +0 -11
  72. data/app/views/caboose/page_blocks/admin_edit.html.erb +0 -69
@@ -0,0 +1,164 @@
1
+
2
+ var PageContentController = function(page_id) { this.init(page_id); };
3
+
4
+ PageContentController.prototype = {
5
+
6
+ page_id: false,
7
+ new_block_type_id: false,
8
+
9
+ init: function(page_id)
10
+ {
11
+ this.page_id = page_id;
12
+ var that = this;
13
+ //this.render_blocks(function() {
14
+ // that.sortable_blocks();
15
+ // that.draggable_blocks();
16
+ //});
17
+ },
18
+
19
+ sortable_blocks: function()
20
+ {
21
+ var that = this;
22
+ $('#blocks').sortable({
23
+ //hoverClass: "ui-state-active",
24
+ placeholder: 'sortable-placeholder',
25
+ forcePlaceholderSize: true,
26
+ handle: '.sort_handle',
27
+ receive: function(e, ui) {
28
+ that.new_block_type_id = ui.item.attr('id').replace('new_block_', '');
29
+ },
30
+ update: function(e, ui) {
31
+ if (that.new_block_type_id)
32
+ {
33
+ $.ajax({
34
+ url: '/admin/pages/' + that.page_id + '/blocks',
35
+ type: 'post',
36
+ data: { block_type_id: that.new_block_type_id, index: ui.item.index() },
37
+ success: function(resp) { that.render_blocks(function() { that.edit_block(resp.block.id); }); }
38
+ });
39
+ that.new_block_type_id = false;
40
+ }
41
+ else
42
+ {
43
+ $.ajax({
44
+ url: '/admin/pages/' + that.page_id + '/block-order',
45
+ type: 'put',
46
+ data: $('#blocks').sortable('serialize', { key: "block_ids[]" }),
47
+ success: function(resp) {}
48
+ });
49
+ }
50
+ }
51
+ });
52
+ },
53
+
54
+ draggable_blocks: function()
55
+ {
56
+ $('#new_blocks li').draggable({
57
+ dropOnEmpty: true,
58
+ connectToSortable: "#blocks",
59
+ helper: "clone",
60
+ revert: "invalid"
61
+ });
62
+ },
63
+
64
+ edit_block: function(block_id)
65
+ {
66
+ caboose_modal_url('/admin/pages/' + this.page_id + '/blocks/' + block_id + '/edit');
67
+ },
68
+
69
+ delete_block: function(block_id, confirm)
70
+ {
71
+ var that = this;
72
+ if (!confirm)
73
+ {
74
+ var p = $('<p/>')
75
+ .addClass('note warning')
76
+ .append("Are you sure you want to delete the block? ")
77
+ .append($('<input/>').attr('type', 'button').val('Yes').click(function() { that.delete_block(block_id, true); })).append(" ")
78
+ .append($('<input/>').attr('type', 'button').val('No').click(function() { that.render_block(block_id); }));
79
+ $('#block_container_' + block_id).attr('onclick','').unbind('click');
80
+ $('#block_container_' + block_id).empty().append(p);
81
+ return;
82
+ }
83
+ $.ajax({
84
+ url: '/admin/pages/' + this.page_id + '/blocks/' + block_id,
85
+ type: 'delete',
86
+ success: function(resp) {
87
+ that.render_blocks();
88
+ }
89
+ });
90
+ },
91
+
92
+ /*****************************************************************************
93
+ Block Rendering
94
+ *****************************************************************************/
95
+
96
+ render_blocks: function(after)
97
+ {
98
+ $('#blocks').empty();
99
+ var that = this;
100
+ $.ajax({
101
+ url: '/admin/pages/' + this.page_id + '/blocks/render?empty_text=[Empty, click to edit]',
102
+ success: function(blocks) {
103
+ if (blocks.length == 0)
104
+ {
105
+ $('#blocks').parent().append("<p>This page is empty. Please add a new block.</p>");
106
+ }
107
+ $(blocks).each(function(i,b) {
108
+ $('#blocks')
109
+ .append($('<li/>')
110
+ .attr('id', 'block_container_' + b.id)
111
+ //.append($('<a/>').attr('id', 'block_' + b.id + '_sort_handle' ).addClass('sort_handle' ).append($('<span/>').addClass('ui-icon ui-icon-arrow-2-n-s')))
112
+ //.append($('<a/>').attr('id', 'block_' + b.id + '_delete_handle').addClass('delete_handle').append($('<span/>').addClass('ui-icon ui-icon-close')).click(function(e) { e.preventDefault(); that.delete_block(b.id); }))
113
+ //.append($('<div/>').attr('id', 'block_' + b.id).addClass('block'))
114
+ );
115
+ });
116
+ $(blocks).each(function(i,b) {
117
+ that.render_block_html(b.id, b.html);
118
+ });
119
+ that.set_clickable();
120
+ if (after) after();
121
+ }
122
+ });
123
+ },
124
+
125
+ render_block_html: function(block_id, html)
126
+ {
127
+ var that = this;
128
+ $('#block_container_' + block_id).empty().html(html);
129
+ },
130
+
131
+ set_clickable: function()
132
+ {
133
+ var that = this;
134
+ $.ajax({
135
+ url: '/admin/pages/' + this.page_id + '/blocks/tree',
136
+ success: function(blocks) {
137
+ $(blocks).each(function(i,b) {
138
+ that.set_clickable_helper(b);
139
+ });
140
+ }
141
+ });
142
+ },
143
+
144
+ set_clickable_helper: function(b)
145
+ {
146
+ var that = this;
147
+ if (!b.children || b.children.length == 0)
148
+ {
149
+ $('#block_' + b.id).attr('onclick','').unbind('click');
150
+ $('#block_' + b.id).click(function(e) { that.edit_block(b.id); });
151
+ }
152
+ else
153
+ {
154
+ $.each(b.children, function(i, b2) {
155
+ that.set_clickable_helper(b2);
156
+ });
157
+ }
158
+ }
159
+ };
160
+
161
+ function toggle_blocks()
162
+ {
163
+ $('#new_blocks_container2').slideToggle();
164
+ }
@@ -15,15 +15,15 @@ PageContentEditor.prototype = {
15
15
  add_controls: function(id)
16
16
  {
17
17
  var that = this;
18
- //$('#pageblock_controls').empty();
19
- //$('#pageblock_controls')
18
+ //$('#block_controls').empty();
19
+ //$('#block_controls')
20
20
  // .append($('<h2/>').attr('id', 'edit_blocks_header').html('Edit Blocks'))
21
21
  // .append($('<div/>').addClass('content').append($('<p/>').html('Select a block to edit.')));
22
- $('#pageblocks').selectable({
22
+ $('#blocks').selectable({
23
23
  filter: "li",
24
24
  cancel: ".handle",
25
25
  selected: function(e, ui) {
26
- var block_id = ui.selected.id.replace("pageblock_container_", "");
26
+ var block_id = ui.selected.id.replace("block_container_", "");
27
27
  that.edit_block(block_id);
28
28
  }
29
29
  });
@@ -1,22 +1,22 @@
1
1
 
2
- #content .page_block h1 {
2
+ #content .block h1 {
3
3
  background: transparent;
4
4
  border-bottom: none;
5
5
  }
6
6
 
7
- #pageblocks { list-style: none; margin: 0 20px 0 -20px; padding: 0; min-height: 100px; }
8
- #pageblocks > li { list-style: none; margin: 0; padding: 0; position: relative; }
9
- #pageblocks > li:hover { background: #fff799; }
10
- #pageblocks .ui-selecting { background: #ddd; }
11
- #pageblocks .ui-selected { background: #fff799; }
12
- #pageblocks .sortable-placeholder { height: 40px; background: #fff799; border: #ccc 1px solid; }
7
+ #blocks { list-style: none; margin: 0 20px 0 -20px; padding: 0; min-height: 100px; }
8
+ #blocks > li { list-style: none; margin: 0; padding: 0; position: relative; }
9
+ #blocks > li:hover { background: #fff799; }
10
+ #blocks .ui-selecting { background: #ddd; }
11
+ #blocks .ui-selected { background: #fff799; }
12
+ #blocks .sortable-placeholder { height: 40px; background: #fff799; border: #ccc 1px solid; }
13
13
 
14
- #pageblocks li .sort_handle { display: none; }
15
- #pageblocks li .delete_handle { display: none; }
16
- #pageblocks li:hover .sort_handle { position: absolute; top: 0; right: 22px; display: block; width: 20px; height: 20px; background-color: #ccc; }
17
- #pageblocks li:hover .delete_handle { position: absolute; top: 0; right: 0px; display: block; width: 20px; height: 20px; background-color: #ccc; }
18
- #pageblocks li:hover .sort_handle span { margin: 2px 1px; }
19
- #pageblocks li:hover .delete_handle span { margin: 2px 1px; }
14
+ #blocks li .sort_handle { display: none; }
15
+ #blocks li .delete_handle { display: none; }
16
+ #blocks li:hover .sort_handle { position: absolute; top: 0; right: 22px; display: block; width: 20px; height: 20px; background-color: #ccc; }
17
+ #blocks li:hover .delete_handle { position: absolute; top: 0; right: 0px; display: block; width: 20px; height: 20px; background-color: #ccc; }
18
+ #blocks li:hover .sort_handle span { margin: 2px 1px; }
19
+ #blocks li:hover .delete_handle span { margin: 2px 1px; }
20
20
 
21
21
  .sortable_placeholder {
22
22
  background: #ccc;
@@ -24,17 +24,17 @@
24
24
  width: 100%;
25
25
  }
26
26
 
27
- .page_block.over {
27
+ .block.over {
28
28
  background: #fef49c;
29
29
  }
30
30
 
31
- .page_block {
31
+ .block {
32
32
  z-index: 19;
33
33
  border: transparent 1px solid;
34
34
  margin: 0 0 2px 20px;
35
35
  }
36
36
 
37
- #page_block_new {
37
+ #block_new {
38
38
  border: #ccc 1px solid;
39
39
  padding: 10px;
40
40
  background: #fef49c;
@@ -61,3 +61,24 @@
61
61
  #new_blocks_container2 input { margin-left: 28px; }
62
62
  #new_blocks { list-style: none; margin: 0; padding: 0; }
63
63
  #new_blocks li { list-style: none; margin: 2px; padding: 4px; background: #eee; border: #ccc 1px solid; text-align: left; }
64
+
65
+ /*********************************/
66
+
67
+ #content h1#page_title {
68
+ position: absolute;
69
+ top: -36px;
70
+ left: 60px;
71
+ background: transparent;
72
+ margin: 0;
73
+ padding: 0;
74
+ color: #fff;
75
+ border: 0;
76
+ font-size: 20pt;
77
+ }
78
+ #tabs { display: none; }
79
+ #content2 { margin-left: 0; }
80
+ .block { border: #ccc 1px dotted; }
81
+ #new_blocks_container1 {
82
+ top: -58px;
83
+ right: 250px;
84
+ }
@@ -0,0 +1,162 @@
1
+
2
+ module Caboose
3
+ class BlockTypesController < ApplicationController
4
+
5
+ #===========================================================================
6
+ # Admin actions
7
+ #===========================================================================
8
+
9
+ # GET /admin/block-types
10
+ def admin_index
11
+ return if !user_is_allowed('pages', 'view')
12
+ @block_types = BlockType.where("parent_id is null or parent_id = 0").reorder(:name).all
13
+ render :layout => 'caboose/admin'
14
+ end
15
+
16
+ # GET /admin/block-types/:id
17
+ def admin_show
18
+ return if !user_is_allowed('pages', 'view')
19
+ block_type = BlockType.find(params[:id])
20
+ render :json => block_type
21
+ end
22
+
23
+ # GET /admin/block-types/new
24
+ # GET /admin/block-types/:id/new
25
+ def admin_new
26
+ return unless user_is_allowed('pages', 'add')
27
+ @block_type = BlockType.new
28
+ @parent_id = params[:id]
29
+ render :layout => 'caboose/admin'
30
+ end
31
+
32
+ # GET /admin/block-types/:id/edit
33
+ def admin_edit
34
+ return unless user_is_allowed('pages', 'edit')
35
+ @block_type = BlockType.find(params[:id])
36
+ render :layout => 'caboose/admin'
37
+ end
38
+
39
+ # POST /admin/block-types
40
+ def admin_create
41
+ return unless user_is_allowed('pages', 'add')
42
+
43
+ resp = Caboose::StdClass.new({
44
+ 'error' => nil,
45
+ 'redirect' => nil
46
+ })
47
+
48
+ bt = BlockType.new(
49
+ :parent_id => params[:parent_id] ? params[:parent_id] : nil,
50
+ :name => params[:name].downcase.gsub(' ', '_'),
51
+ :description => params[:name],
52
+ :field_type => params[:field_type],
53
+ :allow_child_blocks => true
54
+ )
55
+ bt.save
56
+
57
+ # Send back the response
58
+ resp.redirect = "/admin/block-types/#{bt.id}/edit"
59
+ render :json => resp
60
+ end
61
+
62
+ # PUT /admin/block-types/:id
63
+ def admin_update
64
+ return unless user_is_allowed('pages', 'edit')
65
+
66
+ resp = StdClass.new({'attributes' => {}})
67
+ bt = BlockType.find(params[:id])
68
+ save = true
69
+
70
+ params.each do |k,v|
71
+ case k
72
+ when 'parent_id' then bt.parent_id = v
73
+ when 'name' then bt.name = v
74
+ when 'description' then bt.description = v
75
+ when 'render_function' then bt.render_function = v
76
+ when 'use_render_function' then bt.use_render_function = v
77
+ when 'use_render_function_for_layout' then bt.use_render_function_for_layout = v
78
+ when 'allow_child_blocks' then bt.allow_child_blocks = v
79
+ when 'name' then bt.name = v
80
+ when 'field_type' then bt.field_type = v
81
+ when 'default' then bt.default = v
82
+ when 'width' then bt.width = v
83
+ when 'height' then bt.height = v
84
+ when 'fixed_placeholder' then bt.fixed_placeholder = v
85
+ when 'options' then bt.options = v
86
+ when 'options_function' then bt.options_function = v
87
+ when 'options_url' then bt.options_url = v
88
+ end
89
+ end
90
+
91
+ resp.success = save && bt.save
92
+ render :json => resp
93
+ end
94
+
95
+ # DELETE /admin/block-types/:id
96
+ def admin_delete
97
+ return unless user_is_allowed('pages', 'delete')
98
+ BlockType.find(params[:id]).destroy
99
+ resp = StdClass.new({
100
+ 'redirect' => "/admin/block-types"
101
+ })
102
+ render :json => resp
103
+ end
104
+
105
+ # GET /admin/block-types/field-type-options
106
+ def admin_field_type_options
107
+ return unless user_is_allowed('pages', 'edit')
108
+ options = [
109
+ { 'value' => 'checkbox' , 'text' => 'Checkbox' },
110
+ { 'value' => 'checkbox_multiple' , 'text' => 'Checkbox (multiple)' },
111
+ { 'value' => 'image' , 'text' => 'Image' },
112
+ { 'value' => 'file' , 'text' => 'File' },
113
+ { 'value' => 'richtext' , 'text' => 'Rich Text' },
114
+ { 'value' => 'select' , 'text' => 'Multiple choice (select box)' },
115
+ { 'value' => 'text' , 'text' => 'Textbox' },
116
+ { 'value' => 'textarea' , 'text' => 'Textarea' },
117
+ { 'value' => 'block' , 'text' => 'Block' }
118
+ ]
119
+ render :json => options
120
+ end
121
+
122
+ # GET /admin/block-types/:id/options
123
+ def admin_value_options
124
+ return unless user_is_allowed('pages', 'edit')
125
+ bt = BlockType.find(params[:id])
126
+ options = []
127
+ if bt.options_function
128
+ options = bt.render_options
129
+ elsif bt.options
130
+ options = bt.options.strip.split("\n").collect { |line| { 'value' => line, 'text' => line }}
131
+ end
132
+ render :json => options
133
+ end
134
+
135
+ # GET /admin/block-types/options
136
+ def admin_options
137
+ return unless user_is_allowed('pages', 'edit')
138
+ options = BlockType.where("parent_id is null").reorder(:name).all.collect do |bt|
139
+ { 'value' => bt.id, 'text' => bt.description }
140
+ end
141
+ render :json => options
142
+ end
143
+
144
+ # GET /admin/block-types/tree-options
145
+ def admin_tree_options
146
+ return unless user_is_allowed('pages', 'edit')
147
+ options = []
148
+ BlockType.where("parent_id is null or parent_id = 0").reorder(:name).all.each do |bt|
149
+ admin_tree_options_helper(options, bt, '')
150
+ end
151
+ render :json => options
152
+ end
153
+
154
+ def admin_tree_options_helper(options, bt, prefix)
155
+ options << { 'value' => bt.id, 'text' => "#{prefix}#{bt.description}" }
156
+ bt.children.each do |bt2|
157
+ admin_tree_options_helper(options, bt2, " - #{prefix}")
158
+ end
159
+ end
160
+
161
+ end
162
+ end
@@ -0,0 +1,293 @@
1
+
2
+ module Caboose
3
+ class BlocksController < ApplicationController
4
+
5
+ #===========================================================================
6
+ # Admin actions
7
+ #===========================================================================
8
+
9
+ # GET /admin/pages/:page_id/blocks
10
+ def admin_index
11
+ return if !user_is_allowed('pages', 'view')
12
+ blocks = Block.where(:page_id => params[:page_id]).reorder(:sort_order)
13
+ render :json => blocks
14
+ end
15
+
16
+ # GET /admin/pages/:page_id/blocks/:id/new
17
+ # GET /admin/pages/:page_id/blocks/new
18
+ def admin_new
19
+ return unless user_is_allowed('pages', 'add')
20
+ @page = Page.find(params[:page_id])
21
+ @block = params[:id] ? Block.find(params[:id]) : Block.new(:page_id => params[:page_id])
22
+ render :layout => 'caboose/modal'
23
+ end
24
+
25
+ # GET /admin/pages/:page_id/blocks/:id
26
+ def admin_show
27
+ return unless user_is_allowed('pages', 'edit')
28
+ block = Block.find(params[:id])
29
+ render :json => block
30
+ end
31
+
32
+ # GET /admin/pages/:page_id/blocks/tree
33
+ # GET /admin/pages/:page_id/blocks/:id/tree
34
+ def admin_tree
35
+ return unless user_is_allowed('pages', 'edit')
36
+
37
+ blocks = []
38
+ if params[:id]
39
+ b = Block.find(params[:id])
40
+ blocks << { 'id' => b.id, 'children' => admin_tree_helper(b) }
41
+ else
42
+ Block.where("parent_id is null and page_id = ?", params[:page_id]).reorder(:sort_order).all.each do |b|
43
+ blocks << { 'id' => b.id, 'allow_child_blocks' => b.block_type.allow_child_blocks, 'children' => admin_tree_helper(b) }
44
+ end
45
+ end
46
+ render :json => blocks
47
+ end
48
+
49
+ def admin_tree_helper(b)
50
+ arr = []
51
+ b.children.each do |b2|
52
+ arr << { 'id' => b2.id, 'allow_child_blocks' => b2.block_type.allow_child_blocks, 'children' => admin_tree_helper(b2) }
53
+ end
54
+ return arr
55
+ end
56
+
57
+ # GET /admin/pages/:page_id/blocks/:id/render
58
+ def admin_render
59
+ return unless user_is_allowed('pages', 'edit')
60
+ b = Block.find(params[:id])
61
+ bt = b.block_type
62
+ if bt.nil?
63
+ bt = BlockType.where(:name => 'richtext').first
64
+ b.block_type_id = bt.id
65
+ b.save
66
+ end
67
+ #b.create_children
68
+ html = b.render(b, {
69
+ :empty_text => params[:empty_text],
70
+ :editing => true
71
+ })
72
+ render :json => html
73
+ end
74
+
75
+ # GET /admin/pages/:page_id/blocks/render
76
+ def admin_render_all
77
+ return unless user_is_allowed('pages', 'edit')
78
+ p = Page.find(params[:page_id])
79
+ blocks = Block.where("page_id = ? and parent_id is null", p.id).reorder(:sort_order).collect do |b|
80
+ #bt = b.block_type
81
+ #if bt.nil?
82
+ # bt = BlockType.where(:name => 'richtext').first
83
+ # b.block_type_id = bt.id
84
+ # b.save
85
+ #end
86
+ #b.create_children
87
+ {
88
+ :id => b.id,
89
+ :block_type_id => b.block_type.id,
90
+ :sort_order => b.sort_order,
91
+ :html => b.render(b, {
92
+ :empty_text => params[:empty_text],
93
+ :editing => true
94
+ })
95
+ }
96
+ end
97
+ render :json => blocks
98
+ end
99
+
100
+ # GET /admin/pages/:page_id/blocks/render-second-level
101
+ def admin_render_second_level
102
+ return unless user_is_allowed('pages', 'edit')
103
+ p = Page.find(params[:page_id])
104
+ blocks = p.block.children.collect do |b|
105
+ {
106
+ :id => b.id,
107
+ :block_type_id => b.block_type.id,
108
+ :sort_order => b.sort_order,
109
+ :html => b.render(b, {
110
+ :empty_text => params[:empty_text],
111
+ :editing => true
112
+ })
113
+ }
114
+ end
115
+ render :json => blocks
116
+ end
117
+
118
+ # GET /admin/pages/:page_id/blocks/:id/edit
119
+ def admin_edit
120
+ return unless user_is_allowed('pages', 'edit')
121
+ @page = Page.find(params[:page_id])
122
+ @block = Block.find(params[:id])
123
+ @block.create_children
124
+ @modal = true
125
+
126
+ #render "caboose/blocks/admin_edit_#{@block.block_type}", :layout => 'caboose/modal'
127
+ render :layout => 'caboose/modal'
128
+ end
129
+
130
+ # POST /admin/pages/:page_id/blocks
131
+ # POST /admin/pages/:page_id/blocks/:id
132
+ def admin_create
133
+ return unless user_is_allowed('pages', 'add')
134
+
135
+ resp = Caboose::StdClass.new({
136
+ 'error' => nil,
137
+ 'redirect' => nil
138
+ })
139
+
140
+ b = Block.new
141
+ b.page_id = params[:page_id].to_i
142
+ b.parent_id = params[:id] ? params[:id] : nil
143
+ b.block_type_id = params[:block_type_id]
144
+
145
+ if !params[:index].nil?
146
+ b.sort_order = params[:index].to_i
147
+ elsif params[:after_id]
148
+ b2 = Block.find(params[:after_id].to_i)
149
+ b.sort_order = b2.sort_order + 1
150
+ elsif params[:id]
151
+ b.sort_order = Block.where(:parent_id => params[:id]).count
152
+ end
153
+
154
+ i = b.sort_order + 1
155
+ Block.where("page_id = ? and sort_order >= ?", b.page_id, b.sort_order).reorder(:sort_order).each do |b2|
156
+ b2.sort_order = i
157
+ b2.save
158
+ i = i + 1
159
+ end
160
+
161
+ # Save the block
162
+ b.save
163
+
164
+ # Ensure that all the children are created for the block
165
+ b.create_children
166
+
167
+ # Send back the response
168
+ #resp.block = b
169
+ resp.redirect = "/admin/pages/#{b.page_id}/blocks/#{b.id}/edit"
170
+ render :json => resp
171
+ end
172
+
173
+ # PUT /admin/pages/:page_id/blocks/:id
174
+ def admin_update
175
+ return unless user_is_allowed('pages', 'edit')
176
+
177
+ resp = StdClass.new({'attributes' => {}})
178
+ b = Block.find(params[:id])
179
+
180
+ save = true
181
+ params.each do |k,v|
182
+ case k
183
+ when 'page_id' then b.page_id = v
184
+ when 'parent_id' then b.parent_id = v
185
+ when 'block_type_id' then b.block_type_id = v
186
+ when 'sort_order' then b.sort_order = v
187
+ when 'name' then b.name = v
188
+ when 'value' then b.value = v
189
+ end
190
+ end
191
+
192
+ resp.success = save && b.save
193
+ b.create_children
194
+ render :json => resp
195
+ end
196
+
197
+ # POST /admin/pages/:page_id/blocks/:id/image
198
+ def admin_update_image
199
+ return unless user_is_allowed('pages', 'edit')
200
+
201
+ resp = StdClass.new({'attributes' => {}})
202
+ b = Block.find(params[:id])
203
+ b.image = params[:value]
204
+ b.save
205
+ resp.success = true
206
+ resp.attributes = { 'value' => { 'value' => b.image.url(:tiny) }}
207
+
208
+ render :json => resp
209
+ end
210
+
211
+ # POST /admin/pages/:page_id/blocks/:id/file
212
+ def admin_update_file
213
+ return unless user_is_allowed('pages', 'edit')
214
+
215
+ resp = StdClass.new({'attributes' => {}})
216
+ b = Field.find(params[:id])
217
+ b.file = params[:value]
218
+ b.save
219
+ resp.success = true
220
+ resp.attributes = { 'value' => { 'value' => b.file.url }}
221
+
222
+ render :json => resp
223
+ end
224
+
225
+ # DELETE /admin/pages/:page_id/blocks/:id
226
+ def admin_delete
227
+ return unless user_is_allowed('pages', 'delete')
228
+
229
+ resp = StdClass.new
230
+ b = Block.find(params[:id])
231
+ parent_id = b.parent_id
232
+ if b.parent_id
233
+ resp.redirect = "/admin/pages/#{b.page_id}/blocks/#{b.parent_id}/edit"
234
+ else
235
+ resp.close = true
236
+ end
237
+ b.destroy
238
+
239
+ if parent_id
240
+ i = 0
241
+ Block.where(:parent_id => parent_id).reorder(:sort_order).all.each do |b2|
242
+ b2.sort_order = i
243
+ b2.save
244
+ i = i + 1
245
+ end
246
+ end
247
+
248
+ render :json => resp
249
+ end
250
+
251
+ # PUT /admin/pages/:page_id/blocks/:id/move-up
252
+ def admin_move_up
253
+ return unless user_is_allowed('pages', 'delete')
254
+
255
+ resp = StdClass.new
256
+ b = Block.find(params[:id])
257
+ if b.sort_order == 0
258
+ resp.error = "The block is already at the top."
259
+ else
260
+ b2 = Block.where("parent_id = ? and sort_order = ?", b.parent_id, b.sort_order - 1).first
261
+ b2.sort_order = b.sort_order
262
+ b2.save
263
+ b.sort_order = b.sort_order - 1
264
+ b.save
265
+ resp.success = "The block has been moved up successfully."
266
+ end
267
+
268
+ render :json => resp
269
+ end
270
+
271
+ # PUT /admin/pages/:page_id/blocks/:id/move-down
272
+ def admin_move_down
273
+ return unless user_is_allowed('pages', 'delete')
274
+
275
+ resp = StdClass.new
276
+ b = Block.find(params[:id])
277
+ b2 = Block.where("parent_id = ? and sort_order = ?", b.parent_id, b.sort_order + 1).first
278
+ if b2.nil?
279
+ resp.error = "The block is already at the bottom."
280
+ else
281
+ b2.sort_order = b.sort_order
282
+ b2.save
283
+ b.sort_order = b.sort_order + 1
284
+ b.save
285
+ resp.success = "The block has been moved down successfully."
286
+ end
287
+
288
+ render :json => resp
289
+ end
290
+
291
+ end
292
+
293
+ end