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.
- checksums.yaml +8 -8
- data/app/assets/javascripts/caboose/admin_block_edit.js +267 -0
- data/app/assets/javascripts/caboose/admin_page_edit_content.js +71 -45
- data/app/assets/javascripts/caboose/admin_page_edit_content_bak.js +164 -0
- data/app/assets/javascripts/caboose/admin_page_new_blocks.js +4 -4
- data/app/assets/stylesheets/caboose/admin_page_edit_content.css +37 -16
- data/app/controllers/caboose/block_types_controller.rb +162 -0
- data/app/controllers/caboose/blocks_controller.rb +293 -0
- data/app/controllers/caboose/edit_controller.rb +33 -0
- data/app/controllers/caboose/pages_controller.rb +4 -3
- data/app/controllers/caboose/posts_controller.rb +1 -1
- data/app/models/caboose/block.rb +222 -0
- data/app/models/caboose/block_type.rb +28 -0
- data/app/models/caboose/core_plugin.rb +6 -6
- data/app/models/caboose/page.rb +8 -4
- data/app/models/caboose/schema.rb +90 -59
- data/app/models/caboose/utilities/schema.rb +3 -3
- data/app/views/caboose/block_types/admin_edit.html.erb +111 -0
- data/app/views/caboose/{page_block_types → block_types}/admin_index.html.erb +2 -2
- data/app/views/caboose/{page_block_types → block_types}/admin_new.html.erb +9 -6
- data/app/views/caboose/blocks/_block.html.erb +8 -0
- data/app/views/caboose/blocks/_heading.html.erb +7 -0
- data/app/views/caboose/blocks/_html.html.erb +7 -0
- data/app/views/caboose/blocks/_image.html.erb +0 -0
- data/app/views/caboose/blocks/_layout_default.html.erb +33 -0
- data/app/views/caboose/blocks/_layout_default_content.html.erb +16 -0
- data/app/views/caboose/blocks/_layout_default_footer.html.erb +20 -0
- data/app/views/caboose/blocks/_layout_default_header.html.erb +32 -0
- data/app/views/caboose/blocks/_richtext.html.erb +7 -0
- data/app/views/caboose/{page_blocks/_richtext.html.erb → blocks/_text.html.erb} +1 -2
- data/app/views/caboose/blocks/admin_edit.html.erb +106 -0
- data/app/views/caboose/{page_blocks → blocks}/admin_edit_custom.html.erb +0 -0
- data/app/views/caboose/{page_blocks → blocks}/admin_edit_h1.html.erb +0 -0
- data/app/views/caboose/{page_blocks → blocks}/admin_edit_h2.html.erb +0 -0
- data/app/views/caboose/{page_blocks → blocks}/admin_edit_h3.html.erb +0 -0
- data/app/views/caboose/{page_blocks → blocks}/admin_edit_h4.html.erb +0 -0
- data/app/views/caboose/{page_blocks → blocks}/admin_edit_h5.html.erb +0 -0
- data/app/views/caboose/{page_blocks → blocks}/admin_edit_h6.html.erb +0 -0
- data/app/views/caboose/{page_blocks → blocks}/admin_edit_richtext.html.erb +0 -0
- data/app/views/caboose/blocks/admin_new.html.erb +55 -0
- data/app/views/caboose/pages/_admin_header.html.erb +1 -1
- data/app/views/caboose/pages/_content.html.erb +1 -1
- data/app/views/caboose/pages/_new_block_header.html.erb +13 -0
- data/app/views/caboose/pages/admin_edit_content.html.erb +24 -20
- data/app/views/caboose/pages/show.html.erb +13 -30
- data/app/views/layouts/caboose/application.html.erb +26 -14
- data/config/routes.rb +38 -30
- data/lib/caboose/engine.rb +2 -2
- data/lib/caboose/version.rb +1 -1
- metadata +33 -35
- data/app/controllers/caboose/page_block_field_values_controller.rb +0 -55
- data/app/controllers/caboose/page_block_fields_controller.rb +0 -123
- data/app/controllers/caboose/page_block_types_controller.rb +0 -100
- data/app/controllers/caboose/page_blocks_controller.rb +0 -165
- data/app/models/caboose/page_block.rb +0 -49
- data/app/models/caboose/page_block_field.rb +0 -21
- data/app/models/caboose/page_block_field_value.rb +0 -39
- data/app/models/caboose/page_block_renderers/h1.rb +0 -5
- data/app/models/caboose/page_block_renderers/h2.rb +0 -5
- data/app/models/caboose/page_block_renderers/h3.rb +0 -5
- data/app/models/caboose/page_block_renderers/h4.rb +0 -5
- data/app/models/caboose/page_block_renderers/h5.rb +0 -5
- data/app/models/caboose/page_block_renderers/h6.rb +0 -5
- data/app/models/caboose/page_block_renderers/p.rb +0 -5
- data/app/models/caboose/page_block_renderers/richtext.rb +0 -5
- data/app/models/caboose/page_block_type.rb +0 -12
- data/app/views/caboose/page_block_fields/admin_edit.html.erb +0 -77
- data/app/views/caboose/page_block_fields/admin_new.html.erb +0 -30
- data/app/views/caboose/page_block_types/admin_edit.html.erb +0 -82
- data/app/views/caboose/page_blocks/_heading.html.erb +0 -7
- data/app/views/caboose/page_blocks/_partial.html.erb +0 -11
- 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
|
-
//$('#
|
|
19
|
-
//$('#
|
|
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
|
-
$('#
|
|
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("
|
|
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 .
|
|
2
|
+
#content .block h1 {
|
|
3
3
|
background: transparent;
|
|
4
4
|
border-bottom: none;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
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
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
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
|
-
.
|
|
27
|
+
.block.over {
|
|
28
28
|
background: #fef49c;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
.
|
|
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
|
-
#
|
|
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
|