caboose-cms 0.4.41 → 0.4.42
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_page_edit_content.js +49 -27
- data/app/controllers/caboose/blocks_controller.rb +46 -15
- data/app/controllers/caboose/pages_controller.rb +2 -4
- data/app/models/caboose/block.rb +9 -1
- data/app/models/caboose/block_type.rb +5 -0
- data/app/models/caboose/block_type_source.rb +1 -1
- data/app/models/caboose/rich_text_block_parser.rb +195 -0
- data/app/views/caboose/blocks/_heading.html.erb +2 -1
- data/app/views/caboose/blocks/_layout_left_sidebar_content.html.erb +4 -5
- data/app/views/caboose/blocks/admin_edit.html.erb +1 -4
- data/app/views/caboose/blocks/admin_edit_heading.html +52 -0
- data/app/views/caboose/blocks/admin_new.html.erb +2 -0
- data/app/views/caboose/pages/admin_edit_content.html.erb +20 -1
- data/lib/caboose/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZWNmYTkwYTBkOTc0NTY2MzI2MzIzODI1MmU3NDAyNWY3ZDcwZjRhYg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MjFhOTA0OGNiOTUwMTIyNGZkZjBiOWUwMzAwYWNhZDBiZGM4OGVjMg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZDYxNjcyODcwM2YxMGUyM2IzOTFlODI4NjU5NzM0Y2EwY2Q3NmM3NGM5NDIx
|
10
|
+
ZDlhYWI2MWFkZWZlYmQ0ZTg2NjY1MDBhMjk1YTQ5ZjA2NDg5MjI3MDk3ODRm
|
11
|
+
ZGVjMmI4NDhhMTU0NzE5OTFhNzI1NDkwYzRiMzVlZjFjZjY2Mzc=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
M2NkY2FiNjlmNjc3YTk0YTE2MWFiYjAzZGUzZDE2MTQ0MGFkMTFjZmE2NDE2
|
14
|
+
NDMzMmQyMGQ3Y2M4OTY3OTNkNGRiMjMzNmFhZWVlZDE2ZDc0ZDQ4MTNjN2Ux
|
15
|
+
NzVmN2VjYzUyYmMzYThjYjQxYTM4NWMwZjJkMDE2ZmVmMDgyYzM=
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
|
2
2
|
var PageContentController = function(page_id) { this.init(page_id); };
|
3
3
|
|
4
4
|
PageContentController.prototype = {
|
@@ -10,9 +10,8 @@ PageContentController.prototype = {
|
|
10
10
|
{
|
11
11
|
this.page_id = page_id;
|
12
12
|
var that = this;
|
13
|
-
that.set_clickable();
|
14
|
-
|
15
|
-
// that.sortable_blocks();
|
13
|
+
that.set_clickable();
|
14
|
+
that.sortable_blocks();
|
16
15
|
// that.draggable_blocks();
|
17
16
|
//});
|
18
17
|
},
|
@@ -20,7 +19,7 @@ PageContentController.prototype = {
|
|
20
19
|
sortable_blocks: function()
|
21
20
|
{
|
22
21
|
var that = this;
|
23
|
-
$('
|
22
|
+
$('.sortable').sortable({
|
24
23
|
//hoverClass: "ui-state-active",
|
25
24
|
placeholder: 'sortable-placeholder',
|
26
25
|
forcePlaceholderSize: true,
|
@@ -40,11 +39,19 @@ PageContentController.prototype = {
|
|
40
39
|
that.new_block_type_id = false;
|
41
40
|
}
|
42
41
|
else
|
43
|
-
{
|
42
|
+
{
|
43
|
+
var ids = [];
|
44
|
+
$.each($(e.target).children(), function(i, el) {
|
45
|
+
var id = $(el).attr('id');
|
46
|
+
if (id.substr(0, 6) == 'block_') ids.push(id.substr(6));
|
47
|
+
});
|
48
|
+
|
44
49
|
$.ajax({
|
45
50
|
url: '/admin/pages/' + that.page_id + '/block-order',
|
46
51
|
type: 'put',
|
47
|
-
data:
|
52
|
+
data: {
|
53
|
+
block_ids: ids,
|
54
|
+
},
|
48
55
|
success: function(resp) {}
|
49
56
|
});
|
50
57
|
}
|
@@ -78,12 +85,12 @@ PageContentController.prototype = {
|
|
78
85
|
if (!confirm)
|
79
86
|
{
|
80
87
|
var p = $('<p/>')
|
81
|
-
.addClass('
|
88
|
+
.addClass('caboose_note')
|
82
89
|
.append("Are you sure you want to delete the block? ")
|
83
|
-
.append($('<input/>').attr('type', 'button').val('Yes').click(function() { that.delete_block(block_id, true); })).append(" ")
|
84
|
-
.append($('<input/>').attr('type', 'button').val('No').click(function() { that.
|
85
|
-
$('#
|
86
|
-
$('#
|
90
|
+
.append($('<input/>').attr('type', 'button').val('Yes').click(function(e) { e.preventDefault(); e.stopPropagation(); that.delete_block(block_id, true); })).append(" ")
|
91
|
+
.append($('<input/>').attr('type', 'button').val('No').click(function(e) { e.preventDefault(); e.stopPropagation(); that.render_blocks(); }));
|
92
|
+
$('#block_' + block_id).attr('onclick','').unbind('click');
|
93
|
+
$('#block_' + block_id).empty().append(p);
|
87
94
|
return;
|
88
95
|
}
|
89
96
|
$.ajax({
|
@@ -105,7 +112,7 @@ PageContentController.prototype = {
|
|
105
112
|
url: '/admin/pages/' + this.page_id + '/blocks/render-second-level',
|
106
113
|
success: function(blocks) {
|
107
114
|
$(blocks).each(function(i, b) {
|
108
|
-
$('#block_' + b.id).replaceWith(b.html);
|
115
|
+
$('#block_' + b.id).replaceWith(b.html);
|
109
116
|
});
|
110
117
|
that.set_clickable();
|
111
118
|
}
|
@@ -119,36 +126,51 @@ PageContentController.prototype = {
|
|
119
126
|
url: '/admin/pages/' + this.page_id + '/blocks/tree',
|
120
127
|
success: function(blocks) {
|
121
128
|
$(blocks).each(function(i,b) {
|
122
|
-
that.set_clickable_helper(b);
|
123
|
-
});
|
129
|
+
that.set_clickable_helper(b, false, false);
|
130
|
+
});
|
124
131
|
}
|
125
132
|
});
|
126
133
|
},
|
127
134
|
|
128
|
-
set_clickable_helper: function(b)
|
135
|
+
set_clickable_helper: function(b, parent_id, parent_allows_child_blocks)
|
129
136
|
{
|
130
|
-
var that = this;
|
137
|
+
var that = this;
|
138
|
+
|
139
|
+
$('#block_' + b.id)
|
140
|
+
.prepend($('<a/>').attr('id', 'block_' + b.id + '_sort_handle' ).addClass('sort_handle' ).append($('<span/>').addClass('ui-icon ui-icon-arrow-2-n-s')).click(function(e) { e.preventDefault(); e.stopPropagation(); }))
|
141
|
+
.prepend($('<a/>').attr('id', 'block_' + b.id + '_delete_handle').addClass('delete_handle').append($('<span/>').addClass('ui-icon ui-icon-close' )).click(function(e) { e.preventDefault(); e.stopPropagation(); that.delete_block(b.id); }));
|
142
|
+
|
143
|
+
if (parent_allows_child_blocks && (!b.name || b.name.length == 0))
|
144
|
+
{
|
145
|
+
$('#block_' + b.id).prepend($('<div/>')
|
146
|
+
.addClass('new_block_link')
|
147
|
+
.append($('<div/>').addClass('line'))
|
148
|
+
.append($('<a/>')
|
149
|
+
.attr('href', '#')
|
150
|
+
.html("New Block")
|
151
|
+
.click(function(e) {
|
152
|
+
e.preventDefault(); e.stopPropagation();
|
153
|
+
caboose_modal_url('/admin/pages/' + that.page_id + '/blocks/' + parent_id + '/new?before_id=' + b.id);
|
154
|
+
})
|
155
|
+
)
|
156
|
+
.mouseover(function(e) { $(this).addClass('new_block_link_over'); e.stopPropagation(); })
|
157
|
+
.mouseout(function(e) { $(this).removeClass('new_block_link_over'); e.stopPropagation(); })
|
158
|
+
);
|
159
|
+
}
|
160
|
+
|
131
161
|
$('#block_' + b.id).attr('onclick','').unbind('click');
|
132
162
|
$('#block_' + b.id).click(function(e) {
|
133
163
|
e.stopPropagation();
|
134
164
|
that.edit_block(b.id);
|
135
165
|
});
|
136
|
-
|
137
|
-
{
|
138
|
-
$('#new_block_' + b.id).replaceWith($('<input/>')
|
139
|
-
.attr('type', 'button')
|
140
|
-
.val('New Block')
|
141
|
-
.click(function(e) { e.stopPropagation(); that.new_block(b.id);
|
142
|
-
})
|
143
|
-
);
|
144
|
-
}
|
166
|
+
|
145
167
|
var show_mouseover = true;
|
146
168
|
if (b.children && b.children.length > 0)
|
147
169
|
{
|
148
170
|
$.each(b.children, function(i, b2) {
|
149
171
|
if (b2.block_type_id = 34)
|
150
172
|
show_mouseover = false;
|
151
|
-
that.set_clickable_helper(b2);
|
173
|
+
that.set_clickable_helper(b2, b.id, b.allow_child_blocks);
|
152
174
|
});
|
153
175
|
}
|
154
176
|
if (show_mouseover)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'nokogiri'
|
1
2
|
|
2
3
|
module Caboose
|
3
4
|
class BlocksController < ApplicationController
|
@@ -18,7 +19,9 @@ module Caboose
|
|
18
19
|
def admin_new
|
19
20
|
return unless user_is_allowed('pages', 'add')
|
20
21
|
@page = Page.find(params[:page_id])
|
21
|
-
@block = params[:id] ? Block.find(params[:id]) : Block.new(:page_id => params[:page_id])
|
22
|
+
@block = params[:id] ? Block.find(params[:id]) : Block.new(:page_id => params[:page_id])
|
23
|
+
@after_id = params[:after_id] ? params[:after_id] : nil
|
24
|
+
@before_id = params[:before_id] ? params[:before_id] : nil
|
22
25
|
render :layout => 'caboose/modal'
|
23
26
|
end
|
24
27
|
|
@@ -138,9 +141,12 @@ module Caboose
|
|
138
141
|
@document_domain = request.host
|
139
142
|
@document_domain.gsub('http://', '')
|
140
143
|
@document_domain.gsub('https://', '')
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
+
|
145
|
+
begin
|
146
|
+
render "caboose/blocks/admin_edit_#{@block.block_type.full_name}", :layout => 'caboose/modal'
|
147
|
+
rescue
|
148
|
+
render :layout => 'caboose/modal'
|
149
|
+
end
|
144
150
|
end
|
145
151
|
|
146
152
|
# POST /admin/pages/:page_id/blocks
|
@@ -160,19 +166,39 @@ module Caboose
|
|
160
166
|
|
161
167
|
if !params[:index].nil?
|
162
168
|
b.sort_order = params[:index].to_i
|
169
|
+
|
170
|
+
i = 1
|
171
|
+
b.parent.children.where('sort_order >= ?', b.sort_order).reorder(:sort_order).all.each do |b3|
|
172
|
+
b3.sort_order = b.sort_order + i
|
173
|
+
b3.save
|
174
|
+
i = i + 1
|
175
|
+
end
|
176
|
+
|
177
|
+
elsif params[:before_id]
|
178
|
+
b2 = Block.find(params[:before_id].to_i)
|
179
|
+
b.sort_order = b2.sort_order
|
180
|
+
|
181
|
+
i = 1
|
182
|
+
b2.parent.children.where('sort_order >= ?', b.sort_order).reorder(:sort_order).all.each do |b3|
|
183
|
+
b3.sort_order = b.sort_order + i
|
184
|
+
b3.save
|
185
|
+
i = i + 1
|
186
|
+
end
|
187
|
+
|
163
188
|
elsif params[:after_id]
|
164
189
|
b2 = Block.find(params[:after_id].to_i)
|
165
190
|
b.sort_order = b2.sort_order + 1
|
191
|
+
|
192
|
+
i = 1
|
193
|
+
b2.parent.children.where('sort_order >= ?', b.sort_order).reorder(:sort_order).all.each do |b3|
|
194
|
+
b3.sort_order = b.sort_order + i
|
195
|
+
b3.save
|
196
|
+
i = i + 1
|
197
|
+
end
|
198
|
+
|
166
199
|
elsif params[:id]
|
167
|
-
b.sort_order = Block.where(:parent_id => params[:id]).count
|
168
|
-
end
|
169
|
-
|
170
|
-
i = b.sort_order + 1
|
171
|
-
Block.where("page_id = ? and sort_order >= ?", b.page_id, b.sort_order).reorder(:sort_order).each do |b2|
|
172
|
-
b2.sort_order = i
|
173
|
-
b2.save
|
174
|
-
i = i + 1
|
175
|
-
end
|
200
|
+
b.sort_order = Block.where(:parent_id => params[:id]).count
|
201
|
+
end
|
176
202
|
|
177
203
|
# Save the block
|
178
204
|
b.save
|
@@ -196,12 +222,17 @@ module Caboose
|
|
196
222
|
save = true
|
197
223
|
params.each do |k,v|
|
198
224
|
case k
|
199
|
-
when 'page_id' then b.page_id = v
|
225
|
+
#when 'page_id' then b.page_id = v
|
200
226
|
when 'parent_id' then b.parent_id = v
|
201
227
|
when 'block_type_id' then b.block_type_id = v
|
202
228
|
when 'sort_order' then b.sort_order = v
|
203
229
|
when 'name' then b.name = v
|
204
|
-
when 'value' then
|
230
|
+
when 'value' then
|
231
|
+
if b.block_type.field_type == 'richtext'
|
232
|
+
b = RichTextBlockParser.parse(b, v, request.host_with_port)
|
233
|
+
else
|
234
|
+
b.value = v
|
235
|
+
end
|
205
236
|
end
|
206
237
|
end
|
207
238
|
|
@@ -171,12 +171,10 @@ module Caboose
|
|
171
171
|
# PUT /admin/pages/:id/block-order
|
172
172
|
def admin_update_block_order
|
173
173
|
return unless user_is_allowed('pages', 'edit')
|
174
|
-
block_ids = params[:block_ids]
|
174
|
+
block_ids = params[:block_ids]
|
175
175
|
i = 0
|
176
176
|
block_ids.each do |block_id|
|
177
|
-
|
178
|
-
b.sort_order = i
|
179
|
-
b.save
|
177
|
+
Block.find(block_id).update_attribute(:sort_order, i)
|
180
178
|
i = i + 1
|
181
179
|
end
|
182
180
|
render :json => true
|
data/app/models/caboose/block.rb
CHANGED
@@ -181,7 +181,15 @@ class Caboose::Block < ActiveRecord::Base
|
|
181
181
|
|
182
182
|
def child_block_link
|
183
183
|
return "<div class='new_block' id='new_block_#{self.id}'>New Block</div>"
|
184
|
-
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def new_block_before_link
|
187
|
+
return "<div class='new_block_before' id='new_block_before_#{self.id}'>New Block</div>"
|
188
|
+
end
|
189
|
+
|
190
|
+
def new_block_after_link
|
191
|
+
return "<div class='new_block_after' id='new_block_after_#{self.id}'>New Block</div>"
|
192
|
+
end
|
185
193
|
|
186
194
|
def js_hash
|
187
195
|
kids = self.children.collect { |b| b.js_hash }
|
@@ -25,6 +25,11 @@ class Caboose::BlockType < ActiveRecord::Base
|
|
25
25
|
:share, # Whether or not to share the block type in the existing block store.
|
26
26
|
:downloaded # Whether the full block type has been download or just the name and description.
|
27
27
|
|
28
|
+
def full_name
|
29
|
+
return name if parent_id.nil?
|
30
|
+
return "#{parent.full_name}_#{name}"
|
31
|
+
end
|
32
|
+
|
28
33
|
def render_options(empty_text = nil)
|
29
34
|
return eval(self.options_function)
|
30
35
|
end
|
@@ -14,7 +14,7 @@ class Caboose::BlockTypeSource < ActiveRecord::Base
|
|
14
14
|
# Just get the names and descriptions of all block types from the source
|
15
15
|
def refresh_summaries
|
16
16
|
resp = nil
|
17
|
-
begin
|
17
|
+
begin
|
18
18
|
resp = HTTParty.get("#{self.url}/caboose/block-types?token=#{self.token}")
|
19
19
|
rescue HTTParty::Error => e
|
20
20
|
Caboose.log(e.message)
|
@@ -0,0 +1,195 @@
|
|
1
|
+
|
2
|
+
module Caboose
|
3
|
+
class RichTextBlockParser
|
4
|
+
|
5
|
+
def self.parse(block, html, domain)
|
6
|
+
|
7
|
+
html = html.strip
|
8
|
+
page = Nokogiri::HTML("<div>#{html}</div>")
|
9
|
+
if page.css('div').children.count == 1
|
10
|
+
block.value = html
|
11
|
+
block.save
|
12
|
+
return block
|
13
|
+
end
|
14
|
+
|
15
|
+
nodes = []
|
16
|
+
page.css('div').children.each do |node|
|
17
|
+
case node.name.downcase
|
18
|
+
when 'h1' then nodes << node
|
19
|
+
when 'h2' then nodes << node
|
20
|
+
when 'h3' then nodes << node
|
21
|
+
when 'h4' then nodes << node
|
22
|
+
when 'h5' then nodes << node
|
23
|
+
when 'h6' then nodes << node
|
24
|
+
when 'p' then
|
25
|
+
str = node.inner_html.strip
|
26
|
+
nodes << node if str.length > 0 && str != " " && str != " "
|
27
|
+
when 'ul' then nodes << node
|
28
|
+
when 'div' then nodes << node
|
29
|
+
when 'a' then nodes << node
|
30
|
+
when 'img' then nodes << node
|
31
|
+
when 'table' then nodes << node
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Increment the sort order of any blocks after the current one
|
36
|
+
sort_order = block.sort_order + nodes.count
|
37
|
+
block.parent.children.where('sort_order > ?', block.sort_order).reorder(:sort_order).all.each do |b2|
|
38
|
+
b2.sort_order = sort_order
|
39
|
+
b2.save
|
40
|
+
sort_order = sort_order + 1
|
41
|
+
end
|
42
|
+
|
43
|
+
# Now add all the new blocks
|
44
|
+
sort_order = block.sort_order
|
45
|
+
new_first_block_id = false
|
46
|
+
paragraphs = []
|
47
|
+
nodes.each do |node|
|
48
|
+
b = Block.create(
|
49
|
+
:page_id => block.page_id,
|
50
|
+
:parent_id => block.parent_id,
|
51
|
+
:sort_order => sort_order
|
52
|
+
)
|
53
|
+
if sort_order == block.sort_order
|
54
|
+
new_first_block_id = b.id
|
55
|
+
end
|
56
|
+
|
57
|
+
case node.name.downcase
|
58
|
+
when 'h1'
|
59
|
+
b.block_type_id = BlockType.where(:name => 'heading').first.id
|
60
|
+
b.save
|
61
|
+
b.create_children
|
62
|
+
b.child('size').update_attribute(:value, 1)
|
63
|
+
b.child('text').update_attribute(:value, node.inner_html)
|
64
|
+
when 'h2'
|
65
|
+
b.block_type_id = BlockType.where(:name => 'heading').first.id
|
66
|
+
b.save
|
67
|
+
b.create_children
|
68
|
+
b.child('size').update_attribute(:value, 2)
|
69
|
+
b.child('text').update_attribute(:value, node.inner_html)
|
70
|
+
when 'h3'
|
71
|
+
b.block_type_id = BlockType.where(:name => 'heading').first.id
|
72
|
+
b.save
|
73
|
+
b.create_children
|
74
|
+
b.child('size').update_attribute(:value, 3)
|
75
|
+
b.child('text').update_attribute(:value, node.inner_html)
|
76
|
+
when 'h4'
|
77
|
+
b.block_type_id = BlockType.where(:name => 'heading').first.id
|
78
|
+
b.save
|
79
|
+
b.create_children
|
80
|
+
b.child('size').update_attribute(:value, 4)
|
81
|
+
b.child('text').update_attribute(:value, node.inner_html)
|
82
|
+
when 'h5'
|
83
|
+
b.block_type_id = BlockType.where(:name => 'heading').first.id
|
84
|
+
b.save
|
85
|
+
b.create_children
|
86
|
+
b.child('size').update_attribute(:value, 5)
|
87
|
+
b.child('text').update_attribute(:value, node.inner_html)
|
88
|
+
when 'h6'
|
89
|
+
b.block_type_id = BlockType.where(:name => 'heading').first.id
|
90
|
+
b.save
|
91
|
+
b.create_children
|
92
|
+
b.child('size').update_attribute(:value, 6)
|
93
|
+
b.child('text').update_attribute(:value, node.inner_html)
|
94
|
+
when 'p'
|
95
|
+
b.block_type_id = BlockType.where(:name => 'richtext').first.id
|
96
|
+
b.value = node.to_s
|
97
|
+
b.save
|
98
|
+
paragraphs << b
|
99
|
+
when 'ul'
|
100
|
+
b.block_type_id = BlockType.where(:name => 'richtext').first.id
|
101
|
+
b.value = node.to_s
|
102
|
+
b.save
|
103
|
+
when 'div'
|
104
|
+
b.block_type_id = BlockType.where(:name => 'richtext').first.id
|
105
|
+
b.value = node.to_s
|
106
|
+
b.save
|
107
|
+
when 'a'
|
108
|
+
b.block_type_id = BlockType.where(:name => 'richtext').first.id
|
109
|
+
b.value = "<p>#{node.to_s}</p>"
|
110
|
+
b.save
|
111
|
+
when 'img'
|
112
|
+
b.block_type_id = BlockType.where(:name => 'richtext').first.id
|
113
|
+
b.value = node.to_s
|
114
|
+
b.save
|
115
|
+
when 'table'
|
116
|
+
b.block_type_id = BlockType.where(:name => 'richtext').first.id
|
117
|
+
b.value = node.to_s
|
118
|
+
b.save
|
119
|
+
end
|
120
|
+
sort_order = sort_order + 1
|
121
|
+
end
|
122
|
+
|
123
|
+
paragraphs.each do |p|
|
124
|
+
self.parse_paragraph(p, domain)
|
125
|
+
end
|
126
|
+
|
127
|
+
# Now delete the original block
|
128
|
+
block.destroy
|
129
|
+
block = Block.find(new_first_block_id)
|
130
|
+
return block
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.parse_paragraph(block, domain)
|
135
|
+
|
136
|
+
page = Nokogiri::HTML(block.value)
|
137
|
+
return if page.css('img').count == 0
|
138
|
+
|
139
|
+
image_count = page.css('img').count
|
140
|
+
sort_order = block.sort_order
|
141
|
+
|
142
|
+
# Increment the sort order of any blocks after and including the current one
|
143
|
+
i = 0
|
144
|
+
block.parent.children.where('sort_order >= ?', block.sort_order).reorder(:sort_order).all.each do |b2|
|
145
|
+
b2.sort_order = sort_order + image_count + i
|
146
|
+
b2.save
|
147
|
+
i = i + 1
|
148
|
+
end
|
149
|
+
|
150
|
+
# Create blocks for each image
|
151
|
+
i = 0
|
152
|
+
image_block_type_id = BlockType.where("name = ? and parent_id is null", 'image').first.id
|
153
|
+
page.css('img').each do |node|
|
154
|
+
b = Block.create(
|
155
|
+
:page_id => block.page_id,
|
156
|
+
:parent_id => block.parent_id,
|
157
|
+
:block_type_id => image_block_type_id,
|
158
|
+
:sort_order => sort_order + i
|
159
|
+
)
|
160
|
+
b.create_children
|
161
|
+
|
162
|
+
# Set the alignment
|
163
|
+
if node['align'] && node['align'].length > 0
|
164
|
+
align = node['align']
|
165
|
+
align[0] = align[0].capitalize
|
166
|
+
b.child('align').update_attribute(:value, align)
|
167
|
+
end
|
168
|
+
|
169
|
+
# Download the image
|
170
|
+
src = node['src']
|
171
|
+
src = "http://#{domain}#{src}" if src.starts_with?('/')
|
172
|
+
img = b.child('image_src')
|
173
|
+
img.image = URI.parse(src)
|
174
|
+
img.save
|
175
|
+
|
176
|
+
#b.child('image_style' ).update_attribute(:value, )
|
177
|
+
#b.child('link' ).update_attribute(:value, )
|
178
|
+
#b.child('width' ).update_attribute(:value, )
|
179
|
+
#b.child('height' ).update_attribute(:value, )
|
180
|
+
#b.child('margin_top' ).update_attribute(:value, )
|
181
|
+
#b.child('margin_bottom' ).update_attribute(:value, )
|
182
|
+
#b.child('margin_right' ).update_attribute(:value, )
|
183
|
+
#b.child('margin_left' ).update_attribute(:value, )
|
184
|
+
|
185
|
+
i = i + 1
|
186
|
+
end
|
187
|
+
|
188
|
+
# Now remove any images from the paragraph
|
189
|
+
page.search('.//img').remove
|
190
|
+
block.value = page.to_s
|
191
|
+
block.save
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
@@ -4,4 +4,5 @@ text = block.child('text').value
|
|
4
4
|
size = 1 if size.nil?
|
5
5
|
text = (empty_text ? empty_text : "") if text.nil? || text == ""
|
6
6
|
|
7
|
-
%><h<%= size %>><%= raw text %></h<%= size
|
7
|
+
if editing %><div id='block_<%= block.id %>'><h<%= size %>><%= raw text %></h<%= size %>></div><%
|
8
|
+
else %><h<%= size %> id='block_<%= block.id %>'><%= raw text %></h<%= size %>><% end %>
|
@@ -1,8 +1,7 @@
|
|
1
1
|
<div class="content_wrapper" id='block_<%= block.id %>'>
|
2
|
-
<div class="content_body">
|
3
|
-
<% if
|
4
|
-
|
5
|
-
<% end %>
|
6
|
-
<% if editing %><%= raw block.child_block_link %><% end %>
|
2
|
+
<div class="content_body">
|
3
|
+
<% if editing %><div class='sortable'><% end %>
|
4
|
+
<% block.children.each do |b| %><%= raw block.render(b, local_assigns) %><% end %>
|
5
|
+
<% if editing %></div><% end %>
|
7
6
|
</div>
|
8
7
|
</div>
|
@@ -98,10 +98,7 @@ $(document).ready(function() {
|
|
98
98
|
</script>
|
99
99
|
<% if @block.block_type.field_type == 'richtext' %>
|
100
100
|
<script src="//tinymce.cachefly.net/4.0/tinymce.min.js"></script>
|
101
|
-
<%= tinymce :caboose,
|
102
|
-
:width => '800px',
|
103
|
-
:height => '300px'
|
104
|
-
%>
|
101
|
+
<%= tinymce :caboose, :width => '800px', :height => '300px' %>
|
105
102
|
<% end %>
|
106
103
|
|
107
104
|
<% end %>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<%
|
2
|
+
crumbs = []
|
3
|
+
b = @block
|
4
|
+
while b
|
5
|
+
href = b.id == @block.id ? "#" : "/admin/pages/#{b.page_id}/blocks/#{b.id}/edit"
|
6
|
+
onclick = b.id == @block.id ? " onclick=\"$('#block_#{@block.id}_block_type_id_container').slideToggle(100, function() { modal.autosize(); });\"" : ''
|
7
|
+
text = b.name ? "#{b.block_type.description} (#{b.name})" : b.block_type.description
|
8
|
+
crumbs << "<a href=\"#{href}\"#{onclick}>#{text}</a>"
|
9
|
+
b = b.parent
|
10
|
+
end
|
11
|
+
%>
|
12
|
+
<h2 style='margin-top: 0; padding-top: 0;'><%= raw crumbs.reverse.join(' > ') %></h2>
|
13
|
+
<p id='block_type_container'><div id='block_<%= @block.id %>_block_type_id'></div></p>
|
14
|
+
<p><div id='block_<%= b.child('style').id %>_value'></div></p>
|
15
|
+
<p><div id='block_<%= b.child('size').id %>_value'></div></p>
|
16
|
+
<p><div id='block_<%= b.child('text').id %>_value'></div></p>
|
17
|
+
|
18
|
+
<div id='message'></div>
|
19
|
+
<p>
|
20
|
+
<input type='button' value='Close' onclick="modal.close();" />
|
21
|
+
<input type='button' value='Delete Block' onclick="controller.delete_block();" />
|
22
|
+
<input type='button' value='Move Up' onclick="controller.move_up();" />
|
23
|
+
<input type='button' value='Move Down' onclick="controller.move_down();" />
|
24
|
+
</p>
|
25
|
+
|
26
|
+
<% content_for :caboose_css do %>
|
27
|
+
<style type='text/css'>
|
28
|
+
.block { border: #ccc 1px dotted; }
|
29
|
+
#block_<%= @block.id %>_block_type_id_container { }
|
30
|
+
</style>
|
31
|
+
<% end %>
|
32
|
+
<% content_for :caboose_js do %>
|
33
|
+
<%= javascript_include_tag "caboose/model/all" %>
|
34
|
+
<%= javascript_include_tag "caboose/admin_block_edit" %>
|
35
|
+
<script type='text/javascript'>
|
36
|
+
|
37
|
+
var modal = false;
|
38
|
+
$(window).load(function() {
|
39
|
+
modal = new CabooseModal(800);
|
40
|
+
});
|
41
|
+
|
42
|
+
var controller = false;
|
43
|
+
$(document).ready(function() {
|
44
|
+
controller = new BlockController({
|
45
|
+
block: <%= raw Caboose.json(@block.js_hash) %>,
|
46
|
+
authenticity_token: '<%= form_authenticity_token %>',
|
47
|
+
modal: modal
|
48
|
+
});
|
49
|
+
});
|
50
|
+
|
51
|
+
</script>
|
52
|
+
<% end %>
|
@@ -16,6 +16,8 @@ b = @block
|
|
16
16
|
<h1>New Block</h1>
|
17
17
|
<form action='/admin/pages/<%= b.page_id %>/blocks/<%= b.id %>' method='post' id='new_block_form' onsubmit="add_child_block(); return false;">
|
18
18
|
<input type='hidden' name='authenticity_token' value='<%= form_authenticity_token %>' />
|
19
|
+
<% if @before_id %><input type='hidden' name='before_id' value='<%= @before_id %>' /><% end %>
|
20
|
+
<% if @after_id %><input type='hidden' name='after_id' value='<%= @after_id %>' /><% end %>
|
19
21
|
<p><select name='block_type_id'>
|
20
22
|
<option value=''>-- Select a block type --</option>
|
21
23
|
<% Caboose::BlockType.where("parent_id is null").reorder(:name).all.each do |bt| %>
|
@@ -1,5 +1,6 @@
|
|
1
1
|
|
2
2
|
<% content_for :caboose_css do %>
|
3
|
+
<%= stylesheet_link_tag 'jquery.ui.all' %>
|
3
4
|
<style type='text/css'>
|
4
5
|
#tiny_header {
|
5
6
|
display: block;
|
@@ -19,11 +20,29 @@
|
|
19
20
|
color: #fff;
|
20
21
|
padding: 16px 10px;
|
21
22
|
}
|
22
|
-
.block_over { background: #
|
23
|
+
.block_over { background: #e3e3e3; }
|
24
|
+
.sort_handle { display: none; }
|
25
|
+
.delete_handle { display: none; }
|
26
|
+
.block_over .sort_handle { display: block; position: relative; }
|
27
|
+
.block_over .delete_handle { display: block; position: relative; }
|
28
|
+
.block_over .sort_handle span { position: absolute; top: 0; right: 18px; width: 18px; height: 18px; background-color: #fff; border: #ccc 1px solid; }
|
29
|
+
.block_over .delete_handle span { position: absolute; top: 0; right: 0px; width: 18px; height: 18px; background-color: #fff; border: #ccc 1px solid; }
|
30
|
+
|
31
|
+
.new_block_link { position: relative; width: 100%; }
|
32
|
+
.new_block_link .line { position: absolute; top: -11px; width: 100%; height: 2px; background: transparent; }
|
33
|
+
.new_block_link a { position: absolute; top: -20px; left: 45%; background: transparent; color: transparent; display: block; padding: 4px 8px; }
|
34
|
+
|
35
|
+
.new_block_link_over { position: relative; width: 100%; }
|
36
|
+
.new_block_link_over .line { position: absolute; top: -11px; width: 100%; height: 2px; background: #ccc; }
|
37
|
+
.new_block_link_over a { position: absolute; top: -22px; left: 45%; color: #fff; background: #666; display: block; padding: 2px 4px; text-decoration: none; font-size: 12px; }
|
38
|
+
|
39
|
+
.caboose_note { padding: 10px 20px; background: #990000; color: #fff; font-size: 16px; }
|
40
|
+
|
23
41
|
</style>
|
24
42
|
<% end %>
|
25
43
|
|
26
44
|
<% content_for :caboose_js do %>
|
45
|
+
<%= javascript_include_tag 'jquery.ui.all' %>
|
27
46
|
<%= javascript_include_tag 'caboose/admin_page_edit_content' %>
|
28
47
|
<script type='text/javascript'>
|
29
48
|
|
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.4.
|
4
|
+
version: 0.4.42
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Barry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -293,6 +293,7 @@ files:
|
|
293
293
|
- app/models/caboose/post.rb
|
294
294
|
- app/models/caboose/post_category.rb
|
295
295
|
- app/models/caboose/post_category_membership.rb
|
296
|
+
- app/models/caboose/rich_text_block_parser.rb
|
296
297
|
- app/models/caboose/role.rb
|
297
298
|
- app/models/caboose/role_membership.rb
|
298
299
|
- app/models/caboose/role_permission.rb
|
@@ -348,6 +349,7 @@ files:
|
|
348
349
|
- app/views/caboose/blocks/admin_edit_h4.html.erb
|
349
350
|
- app/views/caboose/blocks/admin_edit_h5.html.erb
|
350
351
|
- app/views/caboose/blocks/admin_edit_h6.html.erb
|
352
|
+
- app/views/caboose/blocks/admin_edit_heading.html
|
351
353
|
- app/views/caboose/blocks/admin_edit_richtext.html.erb
|
352
354
|
- app/views/caboose/blocks/admin_new.html.erb
|
353
355
|
- app/views/caboose/blocks/admin_render_second_level.json.erb
|