caboose-cms 0.3.6 → 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/app/assets/javascripts/caboose/admin.js +1 -0
- data/app/assets/javascripts/caboose/admin_page_edit_content.js +107 -95
- data/app/assets/javascripts/caboose/admin_page_new_blocks.js +31 -0
- data/app/assets/javascripts/caboose/model/bound_richtext.js +37 -76
- data/app/assets/javascripts/caboose/model/bound_text.js +4 -1
- data/app/assets/javascripts/caboose/model/model_binder.js +7 -0
- data/app/assets/javascripts/tinymce/plugins/caboose/plugin.js +2 -7
- data/app/assets/stylesheets/caboose/admin.css +1 -0
- data/app/assets/stylesheets/caboose/admin_page_edit_content.css +44 -0
- data/app/controllers/caboose/page_blocks_controller.rb +34 -17
- data/app/controllers/caboose/pages_controller.rb +36 -8
- data/app/models/caboose/page_block.rb +10 -37
- data/app/views/caboose/login/index.html.erb +5 -0
- data/app/views/caboose/page_blocks/admin_edit.html.erb +0 -2
- data/app/views/caboose/page_blocks/admin_edit_h1.html.erb +4 -6
- data/app/views/caboose/page_blocks/admin_edit_h2.html.erb +4 -6
- data/app/views/caboose/page_blocks/admin_edit_h3.html.erb +33 -0
- data/app/views/caboose/page_blocks/admin_edit_h4.html.erb +33 -0
- data/app/views/caboose/page_blocks/admin_edit_h5.html.erb +33 -0
- data/app/views/caboose/page_blocks/admin_edit_h6.html.erb +33 -0
- data/app/views/caboose/page_blocks/admin_edit_richtext.html.erb +4 -6
- data/app/views/caboose/pages/_admin_header.html.erb +23 -9
- data/app/views/caboose/pages/admin_edit_content.html.erb +19 -12
- data/config/routes.rb +4 -0
- data/lib/caboose/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGVhMmM0MTg3ZGJkNjZmMzU0MjY5ZmFjMDJhOTYwZmMwMjk0Yzg1Nw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OTg4NDkxNjBiMzY5ZDgwMmEzN2VlMGU0ZjdlZjFhNDJkNTk5ODE2ZA==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZDRmZTdkZjY2MTU2OWY1ZDMwZjFjYjgxMWI2ODNiMWQ1MjIwNWYxODM2YzBi
|
10
|
+
Y2VhZGFjOGNhYTI3ZDY3YzE4Mjc0ODc1ZGQ0YjNmYjljYzkwMGJjODRjOTQx
|
11
|
+
ODg1MTc3OGU2MDI4YWEwZjdiYjQ1ZDU0YTQ3OWZiMmNiMjVlMjM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NWVkMmQyNmE4MTU3ZDhkMWFiYzFlMWVlYzJlNjg1MDUyZjcyMDg4YTAxZjRl
|
14
|
+
NDZhNWI0OWMyYjhmZDVkZGI2MDA0YmVlZTg0NTQ5YWZjZWFhY2UzODU3OTFk
|
15
|
+
NDljZjU2ZTJkNDUzYTAwZGE5ZjU5NzNkYmJmNGExMmVmMTQ2NGE=
|
@@ -1,123 +1,135 @@
|
|
1
1
|
|
2
|
-
var
|
3
|
-
this.page_id = page_id;
|
4
|
-
this.auth_token = auth_token;
|
5
|
-
this.render_blocks();
|
6
|
-
};
|
2
|
+
var PageContentController = function(page_id) { this.init(page_id); };
|
7
3
|
|
8
|
-
|
4
|
+
PageContentController.prototype = {
|
9
5
|
|
10
|
-
page_id: false,
|
11
|
-
|
6
|
+
page_id: false,
|
7
|
+
new_block_type: false,
|
12
8
|
|
13
|
-
|
9
|
+
init: function(page_id)
|
14
10
|
{
|
11
|
+
this.page_id = page_id;
|
15
12
|
var that = this;
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
}
|
21
|
-
});
|
13
|
+
this.render_blocks(function() {
|
14
|
+
that.sortable_blocks();
|
15
|
+
that.draggable_blocks();
|
16
|
+
});
|
22
17
|
},
|
23
18
|
|
24
|
-
|
25
|
-
{
|
19
|
+
sortable_blocks: function()
|
20
|
+
{
|
26
21
|
var that = this;
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
if (
|
22
|
+
$('#pageblocks').sortable({
|
23
|
+
placeholder: 'sortable-placeholder',
|
24
|
+
handle: '.sort_handle',
|
25
|
+
receive: function(e, ui) {
|
26
|
+
that.new_block_type = ui.item.attr('id').replace('new_block_', '');
|
27
|
+
},
|
28
|
+
update: function(e, ui) {
|
29
|
+
if (that.new_block_type)
|
30
|
+
{
|
31
|
+
$.ajax({
|
32
|
+
url: '/admin/pages/' + that.page_id + '/blocks',
|
33
|
+
type: 'post',
|
34
|
+
data: { block_type: that.new_block_type, index: ui.item.index() },
|
35
|
+
success: function(resp) { that.render_blocks(function() { that.edit_block(resp.block.id); }); }
|
36
|
+
});
|
37
|
+
that.new_block_type = false;
|
38
|
+
}
|
39
|
+
else
|
40
|
+
{
|
41
|
+
$.ajax({
|
42
|
+
url: '/admin/pages/' + that.page_id + '/block-order',
|
43
|
+
type: 'put',
|
44
|
+
data: $('#pageblocks').sortable('serialize', { key: "block_ids[]" }),
|
45
|
+
success: function(resp) {}
|
46
|
+
});
|
47
|
+
}
|
35
48
|
}
|
36
49
|
});
|
37
50
|
},
|
38
51
|
|
52
|
+
draggable_blocks: function()
|
53
|
+
{
|
54
|
+
$('#new_blocks li').draggable({
|
55
|
+
dropOnEmpty: true,
|
56
|
+
connectToSortable: "#pageblocks",
|
57
|
+
helper: "clone",
|
58
|
+
revert: "invalid"
|
59
|
+
});
|
60
|
+
},
|
61
|
+
|
39
62
|
edit_block: function(block_id)
|
40
63
|
{
|
41
|
-
|
42
|
-
|
64
|
+
caboose_modal_url('/admin/pages/' + this.page_id + '/blocks/' + block_id + '/edit');
|
65
|
+
},
|
66
|
+
|
67
|
+
delete_block: function(block_id, confirm)
|
68
|
+
{
|
69
|
+
var that = this;
|
70
|
+
if (!confirm)
|
43
71
|
{
|
44
|
-
|
72
|
+
var p = $('<p/>')
|
73
|
+
.addClass('note warning')
|
74
|
+
.append("Are you sure you want to delete the block? ")
|
75
|
+
.append($('<input/>').attr('type', 'button').val('Yes').click(function() { that.delete_block(block_id, true); })).append(" ")
|
76
|
+
.append($('<input/>').attr('type', 'button').val('No').click(function() { that.render_block(block_id); }));
|
77
|
+
$('#pageblock_' + block_id).attr('onclick','').unbind('click');
|
78
|
+
$('#pageblock_' + block_id).empty().append(p);
|
45
79
|
return;
|
46
80
|
}
|
47
|
-
|
48
|
-
this.current_block_id = block_id;
|
49
|
-
$('#pageblock_' + block_id).attr('onclick','').unbind('click');
|
50
81
|
$.ajax({
|
51
82
|
url: '/admin/pages/' + this.page_id + '/blocks/' + block_id,
|
52
|
-
|
53
|
-
|
54
|
-
that
|
55
|
-
}
|
56
|
-
});
|
83
|
+
type: 'delete',
|
84
|
+
success: function(resp) {
|
85
|
+
that.render_blocks();
|
86
|
+
}
|
87
|
+
});
|
57
88
|
},
|
89
|
+
|
90
|
+
/*****************************************************************************
|
91
|
+
Block Rendering
|
92
|
+
*****************************************************************************/
|
58
93
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
edit_h4_block: function(block) { return this.edit_text_block(block); },
|
63
|
-
edit_h5_block: function(block) { return this.edit_text_block(block); },
|
64
|
-
edit_h6_block: function(block) { return this.edit_text_block(block); },
|
65
|
-
|
66
|
-
edit_text_block: function(block) {
|
94
|
+
render_blocks: function(after)
|
95
|
+
{
|
96
|
+
$('#pageblocks').empty();
|
67
97
|
var that = this;
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
}
|
83
|
-
});
|
98
|
+
$.ajax({
|
99
|
+
url: '/admin/pages/' + this.page_id + '/blocks/render?empty_text=[Empty, click to edit]',
|
100
|
+
success: function(blocks) {
|
101
|
+
$(blocks).each(function(i,b) {
|
102
|
+
$('#pageblocks')
|
103
|
+
.append($('<li/>')
|
104
|
+
.attr('id', 'pageblock_container_' + b.id)
|
105
|
+
.append($('<a/>').attr('id', 'pageblock_' + b.id + '_sort_handle' ).addClass('sort_handle' ).append($('<span/>').addClass('ui-icon ui-icon-arrow-2-n-s')))
|
106
|
+
.append($('<a/>').attr('id', 'pageblock_' + 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); }))
|
107
|
+
.append($('<div/>').attr('id', 'pageblock_' + b.id).addClass('page_block'))
|
108
|
+
);
|
109
|
+
});
|
110
|
+
$(blocks).each(function(i,b) { that.render_block_html(b.id, b.html); });
|
111
|
+
if (after) after();
|
112
|
+
}
|
113
|
+
});
|
84
114
|
},
|
85
115
|
|
86
|
-
|
116
|
+
render_block: function(block_id, after)
|
117
|
+
{
|
87
118
|
var that = this;
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
nice_name: 'Content',
|
96
|
-
type: 'richtext',
|
97
|
-
value: block.value,
|
98
|
-
width: 800,
|
99
|
-
height: 300,
|
100
|
-
fixed_placeholder: false,
|
101
|
-
after_update: function() {
|
102
|
-
//that.after_block_update(that);
|
103
|
-
that.render_block(that.current_block_id);
|
104
|
-
ModelBinder.remove_from_all_model_binders('PageBlock', that.current_block_id);
|
105
|
-
that.current_block_id = false;
|
106
|
-
},
|
107
|
-
after_cancel: function() { that.after_block_cancel(that); }
|
108
|
-
}],
|
109
|
-
});
|
119
|
+
$.ajax({
|
120
|
+
url: '/admin/pages/' + this.page_id + '/blocks/' + block_id + '/render?empty_text=[Empty, click to edit]',
|
121
|
+
success: function(html) {
|
122
|
+
that.render_block_html(block_id, html);
|
123
|
+
if (after) after();
|
124
|
+
}
|
125
|
+
});
|
110
126
|
},
|
111
127
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
ModelBinder.remove_from_all_model_binders('PageBlock', pce.current_block_id);
|
121
|
-
pce.current_block_id = false;
|
122
|
-
}
|
123
|
-
}
|
128
|
+
render_block_html: function(block_id, html)
|
129
|
+
{
|
130
|
+
var that = this;
|
131
|
+
$('#pageblock_' + block_id).empty().html(html);
|
132
|
+
$('#pageblock_' + block_id).attr('onclick','').unbind('click');
|
133
|
+
$('#pageblock_' + block_id).click(function(e) { that.edit_block(block_id); });
|
134
|
+
}
|
135
|
+
};
|
@@ -0,0 +1,31 @@
|
|
1
|
+
|
2
|
+
var PageContentEditor = function(page_id, auth_token) {
|
3
|
+
this.page_id = page_id;
|
4
|
+
this.auth_token = auth_token;
|
5
|
+
this.add_controls();
|
6
|
+
this.render_blocks();
|
7
|
+
};
|
8
|
+
|
9
|
+
PageContentEditor.prototype = {
|
10
|
+
|
11
|
+
page_id: false,
|
12
|
+
current_block_id: false,
|
13
|
+
block_types: { h1: 'Heading 1', h2: 'Heading 2', h3: 'Heading 3', h4: 'Heading 4', h5: 'Heading 5', h6: 'Heading 6', richtext: 'Rich Text'},
|
14
|
+
|
15
|
+
add_controls: function(id)
|
16
|
+
{
|
17
|
+
var that = this;
|
18
|
+
//$('#pageblock_controls').empty();
|
19
|
+
//$('#pageblock_controls')
|
20
|
+
// .append($('<h2/>').attr('id', 'edit_blocks_header').html('Edit Blocks'))
|
21
|
+
// .append($('<div/>').addClass('content').append($('<p/>').html('Select a block to edit.')));
|
22
|
+
$('#pageblocks').selectable({
|
23
|
+
filter: "li",
|
24
|
+
cancel: ".handle",
|
25
|
+
selected: function(e, ui) {
|
26
|
+
var block_id = ui.selected.id.replace("pageblock_container_", "");
|
27
|
+
that.edit_block(block_id);
|
28
|
+
}
|
29
|
+
});
|
30
|
+
},
|
31
|
+
};
|
@@ -24,22 +24,19 @@ BoundRichText = BoundControl.extend({
|
|
24
24
|
$('#'+this.el).attr('placeholder', 'empty').css('padding-top', '+=' + h).css('height', '-=' + h);
|
25
25
|
|
26
26
|
var this2 = this;
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
else
|
37
|
-
$('#'+this2.el).removeClass('dirty');
|
38
|
-
});
|
27
|
+
//$('#'+this.el).on('keyup', function(e) {
|
28
|
+
// if (e.keyCode == 27) this2.cancel(); // Escape
|
29
|
+
// //if (e.keyCode == 13) this2.save(); // Enter
|
30
|
+
//
|
31
|
+
// if ($('#'+this2.el).val() != this2.attribute.value_clean)
|
32
|
+
// $('#'+this2.el).addClass('dirty');
|
33
|
+
// else
|
34
|
+
// $('#'+this2.el).removeClass('dirty');
|
35
|
+
//});
|
39
36
|
|
40
|
-
setTimeout(function() {
|
37
|
+
setTimeout(function() {
|
41
38
|
tinymce.execCommand("mceAddEditor", false, this2.el);
|
42
|
-
var ed = tinymce.EditorManager.createEditor(this2.el);
|
39
|
+
var ed = tinymce.EditorManager.createEditor(this2.el);
|
43
40
|
|
44
41
|
//var ed = tinymce.EditorManager.get(this2.el);
|
45
42
|
//if (!ed)
|
@@ -47,60 +44,31 @@ BoundRichText = BoundControl.extend({
|
|
47
44
|
// tinymce.execCommand("mceAddEditor", false, this2.el);
|
48
45
|
// ed = tinymce.EditorManager.createEditor(this2.el);
|
49
46
|
//}
|
50
|
-
|
51
|
-
ed.on('
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
47
|
+
|
48
|
+
//ed.on('blur', function(e) { this2.save(); });
|
49
|
+
//ed.on('keyup', function(e) {
|
50
|
+
// tinymce.triggerSave();
|
51
|
+
// if (e.keyCode == 27) this2.cancel(); // Escape
|
52
|
+
// if ($('#'+this2.el).val() != this2.attribute.value_clean)
|
53
|
+
// ed.getBody().style.backgroundColor = "#fff799";
|
54
|
+
// else
|
55
|
+
// ed.getBody().style.backgroundColor = "#fff";
|
56
|
+
//});
|
59
57
|
}, 100);
|
60
58
|
},
|
61
59
|
|
62
|
-
show_controls: function() {
|
63
|
-
if ($('#'+this.el+'_controls').length)
|
64
|
-
return;
|
65
|
-
var w = $('#'+this.el).outerWidth();
|
66
|
-
var this2 = this;
|
67
|
-
$('#'+this.el+'_container').prepend($('<div/>')
|
68
|
-
.attr('id', this.el + '_controls')
|
69
|
-
.addClass('bound_textarea_controls')
|
70
|
-
.css('position', 'absolute')
|
71
|
-
.css('top', 0)
|
72
|
-
.css('left', w - 148)
|
73
|
-
.css('width', 148)
|
74
|
-
.css('overflow', 'hidden')
|
75
|
-
.append($('<div/>')
|
76
|
-
.css('width', 148)
|
77
|
-
.css('margin-left', 148)
|
78
|
-
.append($('<a/>').html('Save' ).addClass('save' ).css('width', 60).attr('href', '#').click(function(event) { event.preventDefault(); this2.save(); }))
|
79
|
-
.append($('<a/>').html('Discard').addClass('discard').css('width', 80).attr('href', '#').click(function(event) { event.preventDefault(); this2.cancel(); }))
|
80
|
-
)
|
81
|
-
);
|
82
|
-
$('#'+this.el+'_controls div').animate({ 'margin-left': 0 }, 300);
|
83
|
-
},
|
84
|
-
|
85
|
-
hide_controls: function() {
|
86
|
-
if (!$('#'+this.el+'_controls').length)
|
87
|
-
return;
|
88
|
-
var this2 = this;
|
89
|
-
$('#'+this.el+'_controls div').animate({ 'margin-left': 100 }, 300, function() {
|
90
|
-
$('#'+this2.el+'_controls').remove();
|
91
|
-
});
|
92
|
-
},
|
93
|
-
|
94
60
|
save: function() {
|
95
|
-
|
96
|
-
|
97
|
-
|
61
|
+
var ed = tinymce.activeEditor;
|
62
|
+
el = ed.getElement();
|
63
|
+
$(el).val(ed.getContent());
|
64
|
+
|
65
|
+
//ed.remove();
|
66
|
+
//tinymce.triggerSave();
|
67
|
+
|
98
68
|
this.attribute.value = $('#'+this.el).val();
|
99
69
|
if (this.attribute.value == this.attribute.value_clean)
|
100
70
|
return;
|
101
|
-
|
102
|
-
this.hide_controls();
|
103
|
-
this.show_loader();
|
71
|
+
|
104
72
|
var this2 = this;
|
105
73
|
this.model.save(this.attribute, function(resp) {
|
106
74
|
if (resp.error)
|
@@ -110,11 +78,12 @@ BoundRichText = BoundControl.extend({
|
|
110
78
|
}
|
111
79
|
else
|
112
80
|
{
|
81
|
+
tinymce.activeEditor.remove();
|
113
82
|
this2.show_check(500);
|
114
83
|
$('#'+this2.el).val(this2.attribute.value);
|
115
84
|
$('#'+this2.el).removeClass('dirty');
|
116
|
-
var ed = tinymce.EditorManager.get(this2.el);
|
117
|
-
ed.getBody().style.backgroundColor = "#fff";
|
85
|
+
//var ed = tinymce.EditorManager.get(this2.el);
|
86
|
+
//ed.getBody().style.backgroundColor = "#fff";
|
118
87
|
|
119
88
|
if (this2.binder.success)
|
120
89
|
this2.binder.success(this2);
|
@@ -122,24 +91,16 @@ BoundRichText = BoundControl.extend({
|
|
122
91
|
});
|
123
92
|
},
|
124
93
|
|
125
|
-
cancel: function() {
|
126
|
-
if (this.attribute.before_cancel) this.attribute.before_cancel();
|
127
|
-
if ($('#'+this.el).val() != this.attribute.value_clean)
|
128
|
-
{
|
129
|
-
if (confirm('This box has unsaved changes. Hit OK to save changes, Cancel to discard.'))
|
130
|
-
{
|
131
|
-
this.attribute.value = $('#'+this.el).val();
|
132
|
-
this.attribute.value_clean = $('#'+this.el).val();
|
133
|
-
this.save();
|
134
|
-
}
|
135
|
-
}
|
94
|
+
cancel: function() {
|
95
|
+
if (this.attribute.before_cancel) this.attribute.before_cancel();
|
136
96
|
this.attribute.value = this.attribute.value_clean;
|
137
97
|
$('#'+this.el).val(this.attribute.value);
|
138
98
|
$('#'+this.el).removeClass('dirty');
|
139
99
|
|
140
100
|
if ($('#'+this.el+'_check').length)
|
141
|
-
this.hide_check();
|
142
|
-
|
101
|
+
this.hide_check();
|
102
|
+
|
103
|
+
tinymce.activeEditor.remove();
|
143
104
|
if (this.attribute.after_cancel) this.attribute.after_cancel();
|
144
105
|
},
|
145
106
|
|
@@ -79,13 +79,16 @@ BoundText = BoundControl.extend({
|
|
79
79
|
});
|
80
80
|
},
|
81
81
|
|
82
|
-
cancel: function() {
|
82
|
+
cancel: function() {
|
83
|
+
if (this.attribute.before_cancel) this.attribute.before_cancel();
|
83
84
|
this.attribute.value = this.attribute.value_clean;
|
84
85
|
$('#'+this.el).val(this.attribute.value);
|
85
86
|
$('#'+this.el).removeClass('dirty');
|
86
87
|
|
87
88
|
if ($('#'+this.el+'_check').length)
|
88
89
|
this.hide_check();
|
90
|
+
|
91
|
+
if (this.attribute.after_cancel) this.attribute.after_cancel();
|
89
92
|
},
|
90
93
|
|
91
94
|
error: function(str) {
|
@@ -5,21 +5,16 @@ tinymce.PluginManager.add('caboose', function(editor, url) {
|
|
5
5
|
text: 'Save',
|
6
6
|
icon: false,
|
7
7
|
onclick: function() {
|
8
|
-
tinymce.activeEditor.plugins.autosave.storeDraft();
|
9
|
-
|
10
8
|
var control = ModelBinder.tinymce_current_control();
|
11
9
|
if (!control) return;
|
12
|
-
control.save();
|
13
|
-
control.cancel();
|
10
|
+
control.save();
|
14
11
|
}
|
15
12
|
});
|
16
13
|
|
17
14
|
editor.addButton('caboose_cancel', {
|
18
15
|
text: 'Cancel',
|
19
16
|
icon: false,
|
20
|
-
onclick: function() {
|
21
|
-
tinymce.activeEditor.plugins.autosave.storeDraft();
|
22
|
-
|
17
|
+
onclick: function() {
|
23
18
|
var control = ModelBinder.tinymce_current_control();
|
24
19
|
if (!control) return;
|
25
20
|
control.cancel();
|
@@ -1 +1,45 @@
|
|
1
1
|
|
2
|
+
#content .page_block h1 {
|
3
|
+
background: transparent;
|
4
|
+
border-bottom: none;
|
5
|
+
}
|
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
|
+
|
13
|
+
#pageblocks li .sort_handle { display: none; }
|
14
|
+
#pageblocks li .delete_handle { display: none; }
|
15
|
+
#pageblocks li:hover .sort_handle { position: absolute; top: 0; right: 22px; display: block; width: 20px; height: 20px; background-color: #ccc; }
|
16
|
+
#pageblocks li:hover .delete_handle { position: absolute; top: 0; right: 0px; display: block; width: 20px; height: 20px; background-color: #ccc; }
|
17
|
+
#pageblocks li:hover .sort_handle span { margin: 2px 1px; }
|
18
|
+
#pageblocks li:hover .delete_handle span { margin: 2px 1px; }
|
19
|
+
|
20
|
+
.sortable_placeholder {
|
21
|
+
background: #ccc;
|
22
|
+
height: 100px;
|
23
|
+
width: 100%;
|
24
|
+
}
|
25
|
+
|
26
|
+
.page_block.over {
|
27
|
+
background: #fef49c;
|
28
|
+
}
|
29
|
+
|
30
|
+
.page_block {
|
31
|
+
z-index: 19;
|
32
|
+
border: transparent 1px solid;
|
33
|
+
margin: 0 0 2px 20px;
|
34
|
+
}
|
35
|
+
|
36
|
+
#page_block_new {
|
37
|
+
border: #ccc 1px solid;
|
38
|
+
padding: 10px;
|
39
|
+
background: #fef49c;
|
40
|
+
}
|
41
|
+
|
42
|
+
#new_blocks_container1 { position: absolute; top: 30px; left: 300px; width: 700px; }
|
43
|
+
#new_blocks_container2 { position: relative; }
|
44
|
+
#new_blocks { position: absolute; top: 16px; left: 380px; list-style: none; margin: 0; padding: 0; }
|
45
|
+
#new_blocks li { list-style: none; margin: 2px; padding: 4px; float: left; background: #eee; border: #ccc 1px solid; }
|
@@ -35,12 +35,27 @@ module Caboose
|
|
35
35
|
render :text => block.render(params[:empty_text])
|
36
36
|
end
|
37
37
|
|
38
|
+
# GET /admin/pages/:page_id/blocks/render
|
39
|
+
def admin_render_all
|
40
|
+
return unless user_is_allowed('pages', 'edit')
|
41
|
+
p = Page.find(params[:page_id])
|
42
|
+
blocks = p.blocks.collect { |b| {
|
43
|
+
:id => b.id,
|
44
|
+
:block_type => b.block_type,
|
45
|
+
:sort_order => b.sort_order,
|
46
|
+
:name => b.name,
|
47
|
+
:value => b.value,
|
48
|
+
:html => b.render(params[:empty_text])
|
49
|
+
}}
|
50
|
+
render :json => blocks
|
51
|
+
end
|
52
|
+
|
38
53
|
# GET /admin/pages/:page_id/blocks/:id/edit
|
39
54
|
def admin_edit
|
40
55
|
return unless user_is_allowed('pages', 'edit')
|
41
56
|
@page = Page.find(params[:page_id])
|
42
57
|
@block = PageBlock.find(params[:id])
|
43
|
-
render "caboose/page_blocks/admin_edit_#{@block.block_type}", :layout => 'caboose/
|
58
|
+
render "caboose/page_blocks/admin_edit_#{@block.block_type}", :layout => 'caboose/modal'
|
44
59
|
end
|
45
60
|
|
46
61
|
# POST /admin/pages/:page_id/blocks
|
@@ -53,29 +68,31 @@ module Caboose
|
|
53
68
|
})
|
54
69
|
|
55
70
|
b = PageBlock.new
|
56
|
-
b.page_id = params[:page_id]
|
71
|
+
b.page_id = params[:page_id].to_i
|
57
72
|
b.block_type = params[:block_type]
|
58
|
-
b.
|
59
|
-
b.
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
PageBlock.where("sort_order >= ?", b.sort_order).reorder(:sort_order).each do |b2|
|
67
|
-
b2.sort_order = i
|
68
|
-
b2.save
|
69
|
-
i = i + 1
|
70
|
-
end
|
73
|
+
b.name = params[:name] if params[:name]
|
74
|
+
b.value = params[:value] if params[:value]
|
75
|
+
|
76
|
+
if !params[:index].nil?
|
77
|
+
b.sort_order = params[:index].to_i
|
78
|
+
elsif params[:after_id]
|
79
|
+
b2 = PageBlock.find(params[:after_id].to_i)
|
80
|
+
b.sort_order = b2.sort_order + 1
|
71
81
|
end
|
72
82
|
|
83
|
+
i = b.sort_order + 1
|
84
|
+
PageBlock.where("page_id = ? and sort_order >= ?", b.page_id, b.sort_order).reorder(:sort_order).each do |b2|
|
85
|
+
b2.sort_order = i
|
86
|
+
b2.save
|
87
|
+
i = i + 1
|
88
|
+
end
|
89
|
+
|
73
90
|
# Save the block
|
74
91
|
b.save
|
75
92
|
|
76
93
|
# Send back the response
|
77
|
-
resp.
|
78
|
-
render json
|
94
|
+
resp.block = b
|
95
|
+
render :json => resp
|
79
96
|
end
|
80
97
|
|
81
98
|
# PUT /admin/pages/:page_id/blocks/:id
|
@@ -113,35 +113,63 @@ module Caboose
|
|
113
113
|
render :layout => 'caboose/admin'
|
114
114
|
end
|
115
115
|
|
116
|
-
# GET /admin/pages/
|
116
|
+
# GET /admin/pages/:id/edit
|
117
117
|
def admin_edit_general
|
118
118
|
return unless user_is_allowed('pages', 'edit')
|
119
119
|
@page = Page.find(params[:id])
|
120
120
|
render :layout => 'caboose/admin'
|
121
121
|
end
|
122
122
|
|
123
|
-
# GET /admin/pages/
|
123
|
+
# GET /admin/pages/:id/content
|
124
124
|
def admin_edit_content
|
125
125
|
return unless user_is_allowed('pages', 'edit')
|
126
126
|
@page = Page.find(params[:id])
|
127
127
|
render :layout => 'caboose/admin'
|
128
128
|
end
|
129
129
|
|
130
|
-
# GET /admin/pages/
|
130
|
+
# GET /admin/pages/:id/block-order
|
131
|
+
def admin_edit_block_order
|
132
|
+
return unless user_is_allowed('pages', 'edit')
|
133
|
+
@page = Page.find(params[:id])
|
134
|
+
render :layout => 'caboose/admin'
|
135
|
+
end
|
136
|
+
|
137
|
+
# PUT /admin/pages/:id/block-order
|
138
|
+
def admin_update_block_order
|
139
|
+
return unless user_is_allowed('pages', 'edit')
|
140
|
+
block_ids = params[:block_ids]
|
141
|
+
i = 0
|
142
|
+
block_ids.each do |block_id|
|
143
|
+
b = PageBlock.find(block_id)
|
144
|
+
b.sort_order = i
|
145
|
+
b.save
|
146
|
+
i = i + 1
|
147
|
+
end
|
148
|
+
render :json => true
|
149
|
+
end
|
150
|
+
|
151
|
+
# GET /admin/pages/:id/new-blocks
|
152
|
+
def admin_new_blocks
|
153
|
+
return unless user_is_allowed('pages', 'edit')
|
154
|
+
@page = Page.find(params[:id])
|
155
|
+
render :layout => 'caboose/admin'
|
156
|
+
end
|
157
|
+
|
158
|
+
# GET /admin/pages/:id/css
|
131
159
|
def admin_edit_css
|
132
160
|
return unless user_is_allowed('pages', 'edit')
|
133
161
|
@page = Page.find(params[:id])
|
134
162
|
render :layout => 'caboose/admin'
|
135
163
|
end
|
136
164
|
|
137
|
-
# GET /admin/pages/
|
165
|
+
# GET /admin/pages/:id/js
|
138
166
|
def admin_edit_js
|
139
167
|
return unless user_is_allowed('pages', 'edit')
|
140
168
|
@page = Page.find(params[:id])
|
141
169
|
render :layout => 'caboose/admin'
|
142
170
|
end
|
143
171
|
|
144
|
-
# GET /admin/pages/
|
172
|
+
# GET /admin/pages/:id/seo
|
145
173
|
def admin_edit_seo
|
146
174
|
return unless user_is_allowed('pages', 'edit')
|
147
175
|
@page = Page.find(params[:id])
|
@@ -200,7 +228,7 @@ module Caboose
|
|
200
228
|
render json: resp
|
201
229
|
end
|
202
230
|
|
203
|
-
# PUT /admin/pages
|
231
|
+
# PUT /admin/pages/:id
|
204
232
|
def admin_update
|
205
233
|
return unless user_is_allowed('pages', 'edit')
|
206
234
|
|
@@ -311,7 +339,7 @@ module Caboose
|
|
311
339
|
render json: resp
|
312
340
|
end
|
313
341
|
|
314
|
-
# GET /admin/pages/
|
342
|
+
# GET /admin/pages/:page_id/delete
|
315
343
|
def admin_delete_form
|
316
344
|
return unless user_is_allowed('pages', 'delete')
|
317
345
|
@page = Page.find(params[:id])
|
@@ -330,7 +358,7 @@ module Caboose
|
|
330
358
|
render json: resp
|
331
359
|
end
|
332
360
|
|
333
|
-
# GET /admin/pages/
|
361
|
+
# GET /admin/pages/:page_id/sitemap
|
334
362
|
def admin_sitemap
|
335
363
|
return unless user_is_allowed('pages', 'delete')
|
336
364
|
@page = Page.find(params[:id])
|
@@ -6,45 +6,18 @@ class Caboose::PageBlock < ActiveRecord::Base
|
|
6
6
|
attr_accessible :id, :page_id, :block_type, :sort_order, :name, :value
|
7
7
|
|
8
8
|
def render(empty_text = nil)
|
9
|
-
str = self.send("render_#{self.block_type.downcase}")
|
10
|
-
return empty_text if empty_text && (str.nil? || str.length == 0)
|
9
|
+
str = self.send("render_#{self.block_type.downcase}", empty_text)
|
10
|
+
#return empty_text if empty_text && (str.nil? || str.length == 0)
|
11
11
|
return str
|
12
12
|
end
|
13
13
|
|
14
|
-
def render_richtext() return self.value
|
15
|
-
def render_p() return "<p>#{self.value}</p>"
|
16
|
-
def render_h1() return "<h1>#{self.value}</h1>"
|
17
|
-
def render_h2() return "<h2>#{self.value}</h2>"
|
18
|
-
def render_h3() return "<h3>#{self.value}</h3>"
|
19
|
-
def render_h4() return "<h4>#{self.value}</h4>"
|
20
|
-
def render_h5() return "<h5>#{self.value}</h5>"
|
21
|
-
def render_h6() return "<h6>#{self.value}</h6>"
|
14
|
+
def render_richtext(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<p>#{empty_text}</p>" : self.value end
|
15
|
+
def render_p(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<p>#{empty_text}</p>" : "<p>#{self.value}</p>" end
|
16
|
+
def render_h1(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h1>#{empty_text}</h1>" : "<h1>#{self.value}</h1>" end
|
17
|
+
def render_h2(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h2>#{empty_text}</h2>" : "<h2>#{self.value}</h2>" end
|
18
|
+
def render_h3(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h3>#{empty_text}</h3>" : "<h3>#{self.value}</h3>" end
|
19
|
+
def render_h4(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h4>#{empty_text}</h4>" : "<h4>#{self.value}</h4>" end
|
20
|
+
def render_h5(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h5>#{empty_text}</h5>" : "<h5>#{self.value}</h5>" end
|
21
|
+
def render_h6(empty_text = nil) return (self.value.nil? || self.value == "") && empty_text ? "<h6>#{empty_text}</h6>" : "<h6>#{self.value}</h6>" end
|
22
22
|
|
23
|
-
def render_posts
|
24
|
-
return ""
|
25
|
-
#obj = Caboose::StdClass(JSON.parse(self.value))
|
26
|
-
#defaults = {
|
27
|
-
# 'limit' => 10,
|
28
|
-
# 'no_posts_message' => "<p>There are no posts right now.</p>",
|
29
|
-
# 'invalid_category_message' => "<p>Invalid post category.</p>",
|
30
|
-
# 'body_character_limit' => 0
|
31
|
-
#}
|
32
|
-
#defaults.each { |k,v| obj[k] = v if obj[k].nil? }
|
33
|
-
#
|
34
|
-
#return obj.invalid_category_message if !Caboose::PostCategory.exists?(obj.category_id)
|
35
|
-
#cat = Caboose::PostCategory.find(obj.category_id)
|
36
|
-
#posts = obj.limit == 0 ? cat.posts.reorder('created_at DESC') : cat.posts.reorder('created_at DESC').limit(obj.limit)
|
37
|
-
#return obj.no_posts_message posts.nil? || posts.count == 0
|
38
|
-
#
|
39
|
-
#str = ""
|
40
|
-
#posts.each do |p|
|
41
|
-
# str = "<div class='post'>"
|
42
|
-
# str << "<h2>#{raw p.title}</h2>"
|
43
|
-
# str << "<div class='created_at'>#{p.created_at.strftime('%F %T')}</div>"
|
44
|
-
# str << "<div class='post_content'>"
|
45
|
-
# str << obj.body_character_limit > 0 ? Caboose.teaser_text(p.body, obj.body_character_limit) : p.body
|
46
|
-
# str << "</div>"
|
47
|
-
# str << "</div>"
|
48
|
-
#end
|
49
|
-
end
|
50
23
|
end
|
@@ -15,6 +15,11 @@
|
|
15
15
|
</p>
|
16
16
|
</form>
|
17
17
|
|
18
|
+
<% content_for :caboose_css do %>
|
19
|
+
<style type="text/css">
|
20
|
+
#modal_content input[type="checkbox"] { position: relative; }
|
21
|
+
</style>
|
22
|
+
<% end %>
|
18
23
|
<% content_for :caboose_js do %>
|
19
24
|
<script type='text/javascript'>
|
20
25
|
var modal = new CabooseModal(400);
|
@@ -1,12 +1,8 @@
|
|
1
1
|
|
2
|
-
<%= render :partial => 'caboose/pages/admin_header' %>
|
3
|
-
|
4
|
-
<p>Page block type: <%= @block.block_type %></p>
|
5
2
|
<div id='pageblock_<%= @block.id %>_value'></div>
|
6
|
-
<p><input type='button' value='Back to page' onclick="window.location='/admin/pages/<%= @page.id %>/content';" /></p>
|
7
3
|
|
8
|
-
<%= render :partial => 'caboose/pages/admin_footer' %>
|
9
4
|
<% content_for :caboose_js do %>
|
5
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
10
6
|
<script type='text/javascript'>
|
11
7
|
|
12
8
|
var modal = false;
|
@@ -26,7 +22,9 @@ $(document).ready(function() {
|
|
26
22
|
type: 'text',
|
27
23
|
value: <%= raw Caboose.json(@block.value) %>,
|
28
24
|
width: 800,
|
29
|
-
fixed_placeholder: false
|
25
|
+
fixed_placeholder: false,
|
26
|
+
after_update: function() { parent.controller.render_blocks(); modal.close(); },
|
27
|
+
after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
|
30
28
|
}]
|
31
29
|
});
|
32
30
|
});
|
@@ -1,12 +1,8 @@
|
|
1
1
|
|
2
|
-
<%= render :partial => 'caboose/pages/admin_header' %>
|
3
|
-
|
4
|
-
<p>Page block type: <%= @block.block_type %></p>
|
5
2
|
<div id='pageblock_<%= @block.id %>_value'></div>
|
6
|
-
<p><input type='button' value='Back to page' onclick="window.location='/admin/pages/<%= @page.id %>/content';" /></p>
|
7
3
|
|
8
|
-
<%= render :partial => 'caboose/pages/admin_footer' %>
|
9
4
|
<% content_for :caboose_js do %>
|
5
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
10
6
|
<script type='text/javascript'>
|
11
7
|
|
12
8
|
var modal = false;
|
@@ -26,7 +22,9 @@ $(document).ready(function() {
|
|
26
22
|
type: 'text',
|
27
23
|
value: <%= raw Caboose.json(@block.value) %>,
|
28
24
|
width: 800,
|
29
|
-
fixed_placeholder: false
|
25
|
+
fixed_placeholder: false,
|
26
|
+
after_update: function() { parent.controller.render_blocks(); modal.close(); },
|
27
|
+
after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
|
30
28
|
}]
|
31
29
|
});
|
32
30
|
});
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
<div id='pageblock_<%= @block.id %>_value'></div>
|
3
|
+
|
4
|
+
<% content_for :caboose_js do %>
|
5
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
6
|
+
<script type='text/javascript'>
|
7
|
+
|
8
|
+
var modal = false;
|
9
|
+
$(window).load(function() {
|
10
|
+
modal = new CabooseModal(800);
|
11
|
+
});
|
12
|
+
|
13
|
+
$(document).ready(function() {
|
14
|
+
m = new ModelBinder({
|
15
|
+
name: 'PageBlock',
|
16
|
+
id: <%= @block.id %>,
|
17
|
+
update_url: '/admin/pages/<%= @page.id %>/blocks/<%= @block.id %>',
|
18
|
+
authenticity_token: '<%= form_authenticity_token %>',
|
19
|
+
attributes: [{
|
20
|
+
name: 'value',
|
21
|
+
nice_name: 'Content',
|
22
|
+
type: 'text',
|
23
|
+
value: <%= raw Caboose.json(@block.value) %>,
|
24
|
+
width: 800,
|
25
|
+
fixed_placeholder: false,
|
26
|
+
after_update: function() { parent.controller.render_blocks(); modal.close(); },
|
27
|
+
after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
|
28
|
+
}]
|
29
|
+
});
|
30
|
+
});
|
31
|
+
|
32
|
+
</script>
|
33
|
+
<% end %>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
<div id='pageblock_<%= @block.id %>_value'></div>
|
3
|
+
|
4
|
+
<% content_for :caboose_js do %>
|
5
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
6
|
+
<script type='text/javascript'>
|
7
|
+
|
8
|
+
var modal = false;
|
9
|
+
$(window).load(function() {
|
10
|
+
modal = new CabooseModal(800);
|
11
|
+
});
|
12
|
+
|
13
|
+
$(document).ready(function() {
|
14
|
+
m = new ModelBinder({
|
15
|
+
name: 'PageBlock',
|
16
|
+
id: <%= @block.id %>,
|
17
|
+
update_url: '/admin/pages/<%= @page.id %>/blocks/<%= @block.id %>',
|
18
|
+
authenticity_token: '<%= form_authenticity_token %>',
|
19
|
+
attributes: [{
|
20
|
+
name: 'value',
|
21
|
+
nice_name: 'Content',
|
22
|
+
type: 'text',
|
23
|
+
value: <%= raw Caboose.json(@block.value) %>,
|
24
|
+
width: 800,
|
25
|
+
fixed_placeholder: false,
|
26
|
+
after_update: function() { parent.controller.render_blocks(); modal.close(); },
|
27
|
+
after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
|
28
|
+
}]
|
29
|
+
});
|
30
|
+
});
|
31
|
+
|
32
|
+
</script>
|
33
|
+
<% end %>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
<div id='pageblock_<%= @block.id %>_value'></div>
|
3
|
+
|
4
|
+
<% content_for :caboose_js do %>
|
5
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
6
|
+
<script type='text/javascript'>
|
7
|
+
|
8
|
+
var modal = false;
|
9
|
+
$(window).load(function() {
|
10
|
+
modal = new CabooseModal(800);
|
11
|
+
});
|
12
|
+
|
13
|
+
$(document).ready(function() {
|
14
|
+
m = new ModelBinder({
|
15
|
+
name: 'PageBlock',
|
16
|
+
id: <%= @block.id %>,
|
17
|
+
update_url: '/admin/pages/<%= @page.id %>/blocks/<%= @block.id %>',
|
18
|
+
authenticity_token: '<%= form_authenticity_token %>',
|
19
|
+
attributes: [{
|
20
|
+
name: 'value',
|
21
|
+
nice_name: 'Content',
|
22
|
+
type: 'text',
|
23
|
+
value: <%= raw Caboose.json(@block.value) %>,
|
24
|
+
width: 800,
|
25
|
+
fixed_placeholder: false,
|
26
|
+
after_update: function() { parent.controller.render_blocks(); modal.close(); },
|
27
|
+
after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
|
28
|
+
}]
|
29
|
+
});
|
30
|
+
});
|
31
|
+
|
32
|
+
</script>
|
33
|
+
<% end %>
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
<div id='pageblock_<%= @block.id %>_value'></div>
|
3
|
+
|
4
|
+
<% content_for :caboose_js do %>
|
5
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
6
|
+
<script type='text/javascript'>
|
7
|
+
|
8
|
+
var modal = false;
|
9
|
+
$(window).load(function() {
|
10
|
+
modal = new CabooseModal(800);
|
11
|
+
});
|
12
|
+
|
13
|
+
$(document).ready(function() {
|
14
|
+
m = new ModelBinder({
|
15
|
+
name: 'PageBlock',
|
16
|
+
id: <%= @block.id %>,
|
17
|
+
update_url: '/admin/pages/<%= @page.id %>/blocks/<%= @block.id %>',
|
18
|
+
authenticity_token: '<%= form_authenticity_token %>',
|
19
|
+
attributes: [{
|
20
|
+
name: 'value',
|
21
|
+
nice_name: 'Content',
|
22
|
+
type: 'text',
|
23
|
+
value: <%= raw Caboose.json(@block.value) %>,
|
24
|
+
width: 800,
|
25
|
+
fixed_placeholder: false,
|
26
|
+
after_update: function() { parent.controller.render_blocks(); modal.close(); },
|
27
|
+
after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
|
28
|
+
}]
|
29
|
+
});
|
30
|
+
});
|
31
|
+
|
32
|
+
</script>
|
33
|
+
<% end %>
|
@@ -1,12 +1,8 @@
|
|
1
1
|
|
2
|
-
<%= render :partial => 'caboose/pages/admin_header' %>
|
3
|
-
|
4
|
-
<p>Page block type: <%= @block.block_type %></p>
|
5
2
|
<div id='pageblock_<%= @block.id %>_value'></div>
|
6
|
-
<p><input type='button' value='Back to page' onclick="window.location='/admin/pages/<%= @page.id %>/content';" /></p>
|
7
3
|
|
8
|
-
<%= render :partial => 'caboose/pages/admin_footer' %>
|
9
4
|
<% content_for :caboose_js do %>
|
5
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
10
6
|
<script type='text/javascript'>
|
11
7
|
|
12
8
|
var modal = false;
|
@@ -26,7 +22,9 @@ $(document).ready(function() {
|
|
26
22
|
type: 'richtext',
|
27
23
|
value: <%= raw Caboose.json(@block.value) %>,
|
28
24
|
width: 800,
|
29
|
-
fixed_placeholder: false
|
25
|
+
fixed_placeholder: false,
|
26
|
+
after_update: function() { parent.controller.render_blocks(); modal.close(); },
|
27
|
+
after_cancel: function() { parent.controller.render_blocks(); modal.close(); }
|
30
28
|
}]
|
31
29
|
});
|
32
30
|
});
|
@@ -1,24 +1,38 @@
|
|
1
1
|
<% content_for :caboose_css do %>
|
2
2
|
<% end %>
|
3
3
|
<% content_for :caboose_js do %>
|
4
|
-
|
4
|
+
<%
|
5
|
+
#javascript_include_tag "caboose/model/all"
|
6
|
+
%>
|
7
|
+
<%= javascript_include_tag "caboose/model/class" %>
|
8
|
+
<%= javascript_include_tag "caboose/model/model" %>
|
9
|
+
<%= javascript_include_tag "caboose/model/attribute" %>
|
10
|
+
<%= javascript_include_tag "caboose/model/model_binder" %>
|
11
|
+
<%= javascript_include_tag "caboose/model/bound_control" %>
|
12
|
+
<%= javascript_include_tag "caboose/model/bound_checkbox" %>
|
13
|
+
<%= javascript_include_tag "caboose/model/bound_checkbox_multiple" %>
|
14
|
+
<%= javascript_include_tag "caboose/model/bound_image" %>
|
15
|
+
<%= javascript_include_tag "caboose/model/bound_select" %>
|
16
|
+
<%= javascript_include_tag "caboose/model/bound_text" %>
|
17
|
+
<%= javascript_include_tag "caboose/model/bound_textarea" %>
|
18
|
+
<%= javascript_include_tag "caboose/model/bound_richtext" %>
|
5
19
|
<% end %>
|
6
20
|
|
7
21
|
<h1>Edit Page</h1>
|
8
22
|
<ul id='tabs'>
|
9
23
|
<%
|
10
24
|
tabs = {
|
11
|
-
"/admin/pages/#{@page.id}/edit"
|
12
|
-
"/admin/pages/#{@page.id}/content"
|
13
|
-
"/admin/pages/#{@page.id}/css"
|
14
|
-
"/admin/pages/#{@page.id}/js"
|
15
|
-
"/admin/pages/#{@page.id}/seo"
|
16
|
-
"/admin/pages/#{@page.id}/sitemap"
|
17
|
-
"/admin/pages/#{@page.id}/delete"
|
25
|
+
'General' => "/admin/pages/#{@page.id}/edit",
|
26
|
+
'Content' => "/admin/pages/#{@page.id}/content",
|
27
|
+
'Custom CSS' => "/admin/pages/#{@page.id}/css",
|
28
|
+
'Custom JS' => "/admin/pages/#{@page.id}/js",
|
29
|
+
'SEO' => "/admin/pages/#{@page.id}/seo",
|
30
|
+
'Sitemap' => "/admin/pages/#{@page.id}/sitemap",
|
31
|
+
'Delete Page' => "/admin/pages/#{@page.id}/delete"
|
18
32
|
}
|
19
33
|
|
20
34
|
%>
|
21
|
-
<% tabs.each do |href
|
35
|
+
<% tabs.each do |text, href| %>
|
22
36
|
<li<%= raw request.fullpath == href ? " class='selected'" : '' %>><a href='<%= href %>'><%= raw text %></a></li>
|
23
37
|
<% end %>
|
24
38
|
<li class='back'><input type='button' value='< Back' onclick="window.location='/admin/pages';" /></li>
|
@@ -1,9 +1,22 @@
|
|
1
1
|
|
2
2
|
<%= render :partial => 'caboose/pages/admin_header' %>
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
|
4
|
+
<div id='new_blocks_container1'>
|
5
|
+
<div id='new_blocks_container2'>
|
6
|
+
<p class='note'>Drag a new block onto the page:</p>
|
7
|
+
<ul id='new_blocks'>
|
8
|
+
<li id='new_block_h1'>H1</li>
|
9
|
+
<li id='new_block_h2'>H2</li>
|
10
|
+
<li id='new_block_h3'>H3</li>
|
11
|
+
<li id='new_block_h4'>H4</li>
|
12
|
+
<li id='new_block_h5'>H5</li>
|
13
|
+
<li id='new_block_h6'>H6</li>
|
14
|
+
<li id='new_block_richtext'>Rich Text</li>
|
15
|
+
</ul>
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<ul id='pageblocks'></ul>
|
7
20
|
|
8
21
|
<%= render :partial => 'caboose/pages/admin_footer' %>
|
9
22
|
|
@@ -15,16 +28,10 @@
|
|
15
28
|
<%= javascript_include_tag 'caboose/admin_page_edit_content' %>
|
16
29
|
<script type='text/javascript'>
|
17
30
|
|
18
|
-
var
|
19
|
-
$(window).load(function() {
|
20
|
-
modal = new CabooseModal(800);
|
21
|
-
});
|
22
|
-
|
31
|
+
var controller = false;
|
23
32
|
$(document).ready(function() {
|
24
|
-
|
33
|
+
controller = new PageContentController(<%= @page.id %>);
|
25
34
|
});
|
26
35
|
|
27
36
|
</script>
|
28
|
-
<%= tinymce_assets %>
|
29
|
-
<%= tinymce :caboose, width: '800px', height:'300px' %>
|
30
37
|
<% end %>
|
data/config/routes.rb
CHANGED
@@ -61,6 +61,9 @@ Caboose::Engine.routes.draw do
|
|
61
61
|
get "admin/pages/:id/css" => "pages#admin_edit_css"
|
62
62
|
get "admin/pages/:id/js" => "pages#admin_edit_js"
|
63
63
|
get "admin/pages/:id/seo" => "pages#admin_edit_seo"
|
64
|
+
get "admin/pages/:id/block-order" => "pages#admin_edit_block_order"
|
65
|
+
put "admin/pages/:id/block-order" => "pages#admin_update_block_order"
|
66
|
+
get "admin/pages/:id/new-blocks" => "pages#admin_new_blocks"
|
64
67
|
get "admin/pages/:id/content" => "pages#admin_edit_content"
|
65
68
|
put "admin/pages/:id" => "pages#admin_update"
|
66
69
|
get "admin/pages" => "pages#admin_index"
|
@@ -68,6 +71,7 @@ Caboose::Engine.routes.draw do
|
|
68
71
|
delete "admin/pages/:id" => "pages#admin_delete"
|
69
72
|
|
70
73
|
get "admin/pages/:page_id/blocks/new" => "page_blocks#admin_new"
|
74
|
+
get "admin/pages/:page_id/blocks/render" => "page_blocks#admin_render_all"
|
71
75
|
get "admin/pages/:page_id/blocks/:id/render" => "page_blocks#admin_render"
|
72
76
|
get "admin/pages/:page_id/blocks/:id/edit" => "page_blocks#admin_edit"
|
73
77
|
get "admin/pages/:page_id/blocks/:id" => "page_blocks#admin_show"
|
data/lib/caboose/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caboose-cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Barry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- app/assets/images/caboose/search.png
|
129
129
|
- app/assets/javascripts/caboose/admin.js
|
130
130
|
- app/assets/javascripts/caboose/admin_page_edit_content.js
|
131
|
+
- app/assets/javascripts/caboose/admin_page_new_blocks.js
|
131
132
|
- app/assets/javascripts/caboose/application.js
|
132
133
|
- app/assets/javascripts/caboose/modal.js
|
133
134
|
- app/assets/javascripts/caboose/modal_integration.js
|
@@ -214,6 +215,10 @@ files:
|
|
214
215
|
- app/views/caboose/page_blocks/admin_edit.html.erb
|
215
216
|
- app/views/caboose/page_blocks/admin_edit_h1.html.erb
|
216
217
|
- app/views/caboose/page_blocks/admin_edit_h2.html.erb
|
218
|
+
- app/views/caboose/page_blocks/admin_edit_h3.html.erb
|
219
|
+
- app/views/caboose/page_blocks/admin_edit_h4.html.erb
|
220
|
+
- app/views/caboose/page_blocks/admin_edit_h5.html.erb
|
221
|
+
- app/views/caboose/page_blocks/admin_edit_h6.html.erb
|
217
222
|
- app/views/caboose/page_blocks/admin_edit_richtext.html.erb
|
218
223
|
- app/views/caboose/pages/_admin_footer.html.erb
|
219
224
|
- app/views/caboose/pages/_admin_header.html.erb
|