caboose-cms 0.9.172 → 0.9.173
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 +4 -4
- data/app/assets/javascripts/caboose/block_modal_controllers/block_dd_modal_controller.js +4 -4
- data/app/assets/javascripts/caboose/block_modal_controllers/media_modal_controller.js +39 -39
- data/app/assets/javascripts/caboose/model/bound_image.js +6 -7
- data/app/assets/stylesheets/caboose/admin_block_edit_image.css.scss +8 -3
- data/app/assets/stylesheets/caboose/admin_main.css.scss +5 -0
- data/app/assets/stylesheets/caboose/message_boxes.css.scss +4 -2
- data/app/assets/stylesheets/caboose/model_binder.css +5 -0
- data/app/controllers/caboose/pages_controller.rb +31 -15
- data/app/controllers/caboose/sites_controller.rb +44 -35
- data/app/controllers/caboose/themes_controller.rb +6 -0
- data/app/models/caboose/core_plugin.rb +2 -2
- data/app/models/caboose/page.rb +11 -4
- data/app/models/caboose/schema.rb +39 -29
- data/app/models/caboose/site.rb +30 -1
- data/app/models/caboose/theme.rb +26 -6
- data/app/models/caboose/theme_file.rb +6 -0
- data/app/models/caboose/theme_file_membership.rb +8 -0
- data/app/views/caboose/blocks/_image.html.erb +15 -7
- data/app/views/caboose/login/index.html.erb +1 -1
- data/app/views/caboose/pages/admin_new.html.erb +40 -5
- data/app/views/caboose/sites/_admin_header.html.erb +1 -1
- data/app/views/caboose/sites/admin_edit.html.erb +5 -1
- data/app/views/caboose/themes/admin_edit.html.erb +11 -7
- data/lib/caboose.rb +4 -0
- data/lib/caboose/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b280a399c0fe0c9481f1047fb86e5c3d71b51fd1
|
4
|
+
data.tar.gz: 15b6a9ffa8951c7711fe3b512ac637c5ad02daf9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e66eea6f8d026e9fa62396ba72b9be702f3269e1357b189b40c6f77bbb3c49d553755fdf11a3435dd73fa261e32020ca8b87cd6391e98a9f6c3a2086620b3901
|
7
|
+
data.tar.gz: 2d9620d712cf82a6e7e202718c01eccd9011fa1265075b6e618707864068c12e8f43fca4a5809fe71c0f6c265ace4377598d702796fa50134fbd14200a744fbd
|
@@ -285,7 +285,7 @@ var BlockModalController = ModalController.extend({
|
|
285
285
|
url: that.block_url(block) + '/remove-media',
|
286
286
|
type: 'put',
|
287
287
|
success: function(html) {
|
288
|
-
$('#the_modal img#block_' + block.id).attr('src','
|
288
|
+
$('#the_modal .img-holder#block_' + block.id).find("img").attr('src','https://cabooseit.s3.amazonaws.com/assets/select_image.png');
|
289
289
|
$('#the_modal div#block_' + block.id + ' p').html('Empty file.');
|
290
290
|
$('#the_modal #block_' + block.id).parent().find('.caboose-btn').remove();
|
291
291
|
that.parent_controller.render_blocks();
|
@@ -312,14 +312,14 @@ var BlockModalController = ModalController.extend({
|
|
312
312
|
that.parent_controller.edit_block(b.id);
|
313
313
|
});
|
314
314
|
|
315
|
-
if ( b.block_type && b.block_type.field_type == 'image' && b.rendered_value.indexOf('
|
315
|
+
if ( b.block_type && b.block_type.field_type == 'image' && b.rendered_value.indexOf('select_image.png') < 0 ) {
|
316
316
|
btn = $('<a href="#" class="caboose-btn">Remove</a>');
|
317
|
-
btn.css('position','
|
317
|
+
btn.css('position','absolute').css('left','100%').css('left','calc(100% + 10px)').css('bottom','0').css('font-size','13px');
|
318
318
|
btn.on('click', function(e) {
|
319
319
|
e.preventDefault();
|
320
320
|
that.remove_media(b);
|
321
321
|
});
|
322
|
-
$('#the_modal #block_' + b.id).
|
322
|
+
$('#the_modal #block_' + b.id).closest(".img-wrap").append(btn);
|
323
323
|
}
|
324
324
|
|
325
325
|
if ( b.block_type && b.block_type.field_type == 'file' && b.rendered_value.indexOf('Click to select a file') < 0 ) {
|
@@ -236,31 +236,31 @@ var MediaModalController = BlockModalController.extend({
|
|
236
236
|
var that = this;
|
237
237
|
var m = that.media_with_id(media_id);
|
238
238
|
|
239
|
-
var image_urls = $('<div/>').attr('id', 'image_urls').css('margin-bottom', '20px');
|
240
|
-
if (m.image_urls)
|
241
|
-
{
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
}
|
239
|
+
// var image_urls = $('<div/>').attr('id', 'image_urls').css('margin-bottom', '20px');
|
240
|
+
// if (m.image_urls)
|
241
|
+
// {
|
242
|
+
// image_urls.append($('<h2/>').append('Image URLs'));
|
243
|
+
// for (var size in m.image_urls)
|
244
|
+
// {
|
245
|
+
// var s = size.replace('_url', '');
|
246
|
+
// s = s[0].toUpperCase() + s.slice(1);
|
247
|
+
// var url = m.image_urls[size];
|
248
|
+
// image_urls.append($('<div/>')
|
249
|
+
// .append($('<span/>').addClass('size').append(s))
|
250
|
+
// .append($('<input/>').attr('type', 'text').attr('id', 'size_' + s).addClass('url').val(url))
|
251
|
+
// .append($('<button/>').addClass('clippy').data('clipboard-target', '#size_' + s).append('Copy'))
|
252
|
+
// );
|
253
|
+
// }
|
254
|
+
// }
|
255
255
|
|
256
256
|
$('#top_controls').empty();
|
257
|
-
var img_tag = m.media_type == 'image' ? ($('<img/>').attr('id', 'detail_image').attr('src', m.image_urls ? m.image_urls.thumb_url : '
|
257
|
+
var img_tag = m.media_type == 'image' ? ($('<img/>').attr('id', 'detail_image').attr('src', m.image_urls ? m.image_urls.thumb_url : 'https://cabooseit.s3.amazonaws.com/assets/select_image.png')) : ( $('<p/>').text(m.original_name) );
|
258
258
|
$('#the_modal #media').empty()
|
259
|
-
.append(img_tag)
|
260
|
-
.append($('<p/>').append($('<div/>').attr('id', 'media_' + media_id + '_media_category_id' )))
|
261
|
-
.append($('<p/>').append($('<div/>').attr('id', 'media_' + media_id + '_name' )))
|
262
|
-
.append($('<p/>').append($('<div/>').attr('id', 'media_' + media_id + '_description' )))
|
263
|
-
.append(image_urls);
|
259
|
+
.append( $("<div />").addClass("img-wrap").append(img_tag) );
|
260
|
+
// .append($('<p/>').append($('<div/>').attr('id', 'media_' + media_id + '_media_category_id' )))
|
261
|
+
// .append($('<p/>').append($('<div/>').attr('id', 'media_' + media_id + '_name' )))
|
262
|
+
// .append($('<p/>').append($('<div/>').attr('id', 'media_' + media_id + '_description' )))
|
263
|
+
// .append(image_urls);
|
264
264
|
var select_text = m.media_type == 'image' ? 'Select this Image' : 'Select this File';
|
265
265
|
$('#modal_controls').empty()
|
266
266
|
.append($('<p/>').css('clear', 'both')
|
@@ -273,24 +273,24 @@ var MediaModalController = BlockModalController.extend({
|
|
273
273
|
.append($('<input/>').attr('type', 'button').addClass('caboose-btn').val('Close' ).click(function(e) { that.parent_controller.render_blocks(); that.close(); }))
|
274
274
|
);
|
275
275
|
|
276
|
-
var m = new ModelBinder({
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
});
|
287
|
-
$('#media_' + media_id + '_media_category_id' + '_container').css('width', '400px');
|
288
|
-
$('#media_' + media_id + '_name' + '_container').css('width', '400px');
|
289
|
-
$('#media_' + media_id + '_description' + '_container').css('width', '400px');
|
276
|
+
// var m = new ModelBinder({
|
277
|
+
// name: 'Media',
|
278
|
+
// id: m.id,
|
279
|
+
// update_url: '/admin/media/' + m.id,
|
280
|
+
// authenticity_token: that.authenticity_token,
|
281
|
+
// attributes: [
|
282
|
+
// { name: 'media_category_id' , nice_name: 'Category' , type: 'select' , value: m.media_category_id , fixed_placeholder: true, width: 400, after_update: function() { m.media_category_id = this.value; }, on_load: function() { that.autosize(); }, options_url: '/admin/media-categories/options' },
|
283
|
+
// { name: 'name' , nice_name: 'Name' , type: 'text' , value: m.name , fixed_placeholder: true, width: 400, after_update: function() { m.name = this.value; }, on_load: function() { that.autosize(); }},
|
284
|
+
// { name: 'description' , nice_name: 'Description' , type: 'text' , value: m.description , fixed_placeholder: true, width: 400, after_update: function() { m.description = this.value; }, on_load: function() { that.autosize(); }},
|
285
|
+
// ]
|
286
|
+
// });
|
287
|
+
// $('#media_' + media_id + '_media_category_id' + '_container').css('width', '400px');
|
288
|
+
// $('#media_' + media_id + '_name' + '_container').css('width', '400px');
|
289
|
+
// $('#media_' + media_id + '_description' + '_container').css('width', '400px');
|
290
290
|
|
291
|
-
$('#image_urls span.size' ).css('width', '70px').css('display', 'inline-block');
|
292
|
-
$('#image_urls input.url' ).css('width', '270px').css('border', '#ccc 1px solid');
|
293
|
-
$('#image_urls button' ).css('width', '60px');
|
291
|
+
// $('#image_urls span.size' ).css('width', '70px').css('display', 'inline-block');
|
292
|
+
// $('#image_urls input.url' ).css('width', '270px').css('border', '#ccc 1px solid');
|
293
|
+
// $('#image_urls button' ).css('width', '60px');
|
294
294
|
|
295
295
|
//c = new Clipboard('.clippy');
|
296
296
|
//c.on('success', function(e) {
|
@@ -18,21 +18,20 @@ BoundImage = BoundControl.extend({
|
|
18
18
|
|
19
19
|
if (!this.attribute.update_url)
|
20
20
|
this.attribute.update_url = this.model.update_url;
|
21
|
+
|
22
|
+
var awidth = this.attribute.width ? this.attribute.width : this.width;
|
21
23
|
|
22
24
|
var this2 = this;
|
23
25
|
$('#'+this.el).wrap($('<div/>')
|
24
26
|
.attr('id', this.el + '_container')
|
25
|
-
.addClass('mb_container')
|
27
|
+
.addClass('mb_container model-image')
|
26
28
|
.css('position', 'relative')
|
27
29
|
);
|
28
30
|
$('#'+this.el+'_container').empty();
|
29
31
|
|
30
|
-
$('#'+this.el+'_container').append($('<img/>')
|
31
|
-
.attr('src', this.attribute.value)
|
32
|
-
|
33
|
-
.css('float', 'left')
|
34
|
-
.css('margin-right', 10)
|
35
|
-
);
|
32
|
+
$('#'+this.el+'_container').append( $("<div/>").addClass('img-holder').css('float','left').css('width',awidth).css('margin-right',10).append($('<img/>')
|
33
|
+
.attr('src', this.attribute.value).css('display','block').css('max-width','100%')
|
34
|
+
));
|
36
35
|
$('#'+this.el+'_container')
|
37
36
|
.append($('<form target="' + this.el + '_iframe"></form>')
|
38
37
|
.attr('id', this.el + '_form')
|
@@ -1,8 +1,13 @@
|
|
1
|
+
#media .img-wrap {
|
2
|
+
background-image:url('/assets/caboose/grid.png');
|
3
|
+
background-size: 15px;
|
4
|
+
display: inline-block;
|
5
|
+
}
|
1
6
|
|
2
7
|
#detail_image {
|
3
|
-
|
4
|
-
|
5
|
-
width:
|
8
|
+
display: block;
|
9
|
+
max-height: 300px;
|
10
|
+
max-width: 100%;
|
6
11
|
}
|
7
12
|
|
8
13
|
// #left_content {
|
@@ -579,6 +579,11 @@ Page Bar Generator
|
|
579
579
|
max-width: 912px;
|
580
580
|
margin: 0 auto;
|
581
581
|
padding: 0 20px;
|
582
|
+
.copy-options {
|
583
|
+
border-top: 1px solid #d6d6d6;
|
584
|
+
padding-top: 20px;
|
585
|
+
margin-top: 10px;
|
586
|
+
}
|
582
587
|
.category {
|
583
588
|
border-top: 1px solid #d6d6d6;
|
584
589
|
padding-top: 20px;
|
@@ -16,9 +16,7 @@ Message boxes
|
|
16
16
|
.note {
|
17
17
|
padding: 15px;
|
18
18
|
background: #fff3ac;
|
19
|
-
//color: #fff;
|
20
19
|
font-size: 15px;
|
21
|
-
//text-align: center;
|
22
20
|
h2 { margin: 0 0 10px 0; padding: 0; }
|
23
21
|
a {
|
24
22
|
color: #fff;
|
@@ -28,9 +26,11 @@ Message boxes
|
|
28
26
|
}
|
29
27
|
&.error {
|
30
28
|
background: #bf4448;
|
29
|
+
color: #fff;
|
31
30
|
}
|
32
31
|
&.success {
|
33
32
|
background: #26ae88;
|
33
|
+
color: #fff;
|
34
34
|
}
|
35
35
|
&.loading {
|
36
36
|
background-image: url('https://cabooseit.s3.amazonaws.com/assets/shared/loading_blue.gif');
|
@@ -38,6 +38,8 @@ Message boxes
|
|
38
38
|
background-position: 0 center;
|
39
39
|
background-repeat: no-repeat;
|
40
40
|
padding-left: 40px;
|
41
|
+
background-color: #1a5aac;
|
42
|
+
color: white;
|
41
43
|
}
|
42
44
|
}
|
43
45
|
|
@@ -17,6 +17,11 @@ require caboose/spectrum
|
|
17
17
|
color: #000;
|
18
18
|
}
|
19
19
|
|
20
|
+
.mb_container.model-image .img-holder {
|
21
|
+
background-image: url('/assets/caboose/grid.png');
|
22
|
+
background-size: 15px;
|
23
|
+
}
|
24
|
+
|
20
25
|
.mb_container input[type=text],
|
21
26
|
.mb_container select,
|
22
27
|
.mb_container .mb_fake option,
|
@@ -437,7 +437,7 @@ module Caboose
|
|
437
437
|
elsif site_id.nil? then resp.error = "Invalid site"
|
438
438
|
elsif parent_id.nil? then resp.error = "Invalid parent"
|
439
439
|
else
|
440
|
-
resp.new_id = p.delay(:priority => 20).duplicate(site_id, parent_id, duplicate_children, block_type_id, child_block_type_id)
|
440
|
+
resp.new_id = Rails.env.production? ? p.delay(:priority => 20).duplicate(site_id, parent_id, duplicate_children, block_type_id, child_block_type_id) : p.duplicate(site_id, parent_id, duplicate_children, block_type_id, child_block_type_id)
|
441
441
|
resp.success = true
|
442
442
|
end
|
443
443
|
|
@@ -512,65 +512,81 @@ module Caboose
|
|
512
512
|
return
|
513
513
|
end
|
514
514
|
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
page = Caboose::Page.new
|
519
|
-
|
515
|
+
# Blank page
|
516
|
+
if params[:template_id].blank? && params[:copy_from_id].blank?
|
517
|
+
page = Caboose::Page.new
|
520
518
|
if parent.nil?
|
521
519
|
d = Domain.where(:domain => request.host_with_port).first.site_id
|
522
520
|
page.site_id = d.site_id
|
523
521
|
else
|
524
522
|
page.site_id = parent.site_id
|
525
523
|
end
|
526
|
-
|
527
524
|
page.title = title
|
528
525
|
page.parent_id = parent_id
|
529
526
|
page.hide = true
|
530
527
|
page.content_format = Caboose::Page::CONTENT_FORMAT_HTML
|
531
528
|
page.save
|
532
|
-
|
533
529
|
i = 0
|
534
530
|
begin
|
535
531
|
page.slug = Page.slug(page.title + (i > 0 ? " #{i}" : ""))
|
536
532
|
page.uri = parent.parent_id == -1 ? page.slug : "#{parent.uri}/#{page.slug}"
|
537
533
|
i = i+1
|
538
534
|
end while (Page.where(:uri => page.uri, :site_id => page.site_id).count > 0 && i < 10)
|
539
|
-
|
540
535
|
page.save
|
541
|
-
|
542
536
|
# Create the top level block for the page
|
543
537
|
bt = BlockType.find(params[:layout_id])
|
544
538
|
Block.create(:page_id => page.id, :block_type_id => bt.id, :name => bt.name)
|
545
|
-
|
546
539
|
# Set the new page's permissions
|
547
540
|
viewers = Caboose::PagePermission.where({ :page_id => parent.id, :action => 'view' }).pluck(:role_id)
|
548
541
|
editors = Caboose::PagePermission.where({ :page_id => parent.id, :action => 'edit' }).pluck(:role_id)
|
549
542
|
Caboose::Page.update_authorized_for_action(page.id, 'view', viewers)
|
550
543
|
Caboose::Page.update_authorized_for_action(page.id, 'edit', editors)
|
551
544
|
resp.redirect = "/admin/pages/#{page.id}/content"
|
545
|
+
|
546
|
+
# Copy from an existing page
|
547
|
+
elsif !params[:copy_from_id].blank?
|
548
|
+
source = Caboose::Page.find(params[:copy_from_id])
|
549
|
+
if source
|
550
|
+
Caboose.log("copying from source page: #{source.id}")
|
551
|
+
new_page = source.duplicate(@site.id, parent_id, false, layout_id, nil)
|
552
|
+
new_page.title = params[:title]
|
553
|
+
new_page.hide = true
|
554
|
+
i = 0
|
555
|
+
begin
|
556
|
+
new_page.slug = Page.slug(new_page.title + (i > 0 ? " #{i}" : ""))
|
557
|
+
new_page.uri = parent.parent_id == -1 ? new_page.slug : "#{parent.uri}/#{new_page.slug}"
|
558
|
+
i = i+1
|
559
|
+
end while (Page.where(:uri => new_page.uri, :site_id => @site.id).count > 0 && i < 10)
|
560
|
+
new_page.save
|
561
|
+
# Set the new page's permissions
|
562
|
+
viewers = Caboose::PagePermission.where({ :page_id => parent.id, :action => 'view' }).pluck(:role_id)
|
563
|
+
editors = Caboose::PagePermission.where({ :page_id => parent.id, :action => 'edit' }).pluck(:role_id)
|
564
|
+
Caboose::Page.update_authorized_for_action(new_page.id, 'view', viewers)
|
565
|
+
Caboose::Page.update_authorized_for_action(new_page.id, 'edit', editors)
|
566
|
+
resp.redirect = "/admin/pages/#{new_page.id}/content"
|
567
|
+
else
|
568
|
+
resp.redirect = "/admin/pages/new"
|
569
|
+
end
|
570
|
+
|
571
|
+
# Use a page template
|
552
572
|
else
|
553
573
|
template = Caboose::PageTemplate.find(params[:template_id])
|
554
574
|
if template && template.page
|
555
575
|
new_page = template.page.duplicate(@site.id, parent_id, false, layout_id, nil)
|
556
576
|
new_page.title = params[:title]
|
557
577
|
new_page.hide = true
|
558
|
-
|
559
578
|
i = 0
|
560
579
|
begin
|
561
580
|
new_page.slug = Page.slug(new_page.title + (i > 0 ? " #{i}" : ""))
|
562
581
|
new_page.uri = parent.parent_id == -1 ? new_page.slug : "#{parent.uri}/#{new_page.slug}"
|
563
582
|
i = i+1
|
564
583
|
end while (Page.where(:uri => new_page.uri, :site_id => @site.id).count > 0 && i < 10)
|
565
|
-
|
566
584
|
new_page.save
|
567
|
-
|
568
585
|
# Set the new page's permissions
|
569
586
|
viewers = Caboose::PagePermission.where({ :page_id => parent.id, :action => 'view' }).pluck(:role_id)
|
570
587
|
editors = Caboose::PagePermission.where({ :page_id => parent.id, :action => 'edit' }).pluck(:role_id)
|
571
588
|
Caboose::Page.update_authorized_for_action(new_page.id, 'view', viewers)
|
572
589
|
Caboose::Page.update_authorized_for_action(new_page.id, 'edit', editors)
|
573
|
-
|
574
590
|
resp.redirect = "/admin/pages/#{new_page.id}/content"
|
575
591
|
else
|
576
592
|
resp.redirect = "/admin/pages/new"
|
@@ -30,7 +30,6 @@ module Caboose
|
|
30
30
|
@error = "You are not allowed to manage sites."
|
31
31
|
render :file => 'caboose/extras/error' and return
|
32
32
|
end
|
33
|
-
|
34
33
|
@pager = PageBarGenerator.new(params, {
|
35
34
|
'name_like' => '',
|
36
35
|
},{
|
@@ -76,52 +75,48 @@ module Caboose
|
|
76
75
|
# @route GET /admin/sites/new
|
77
76
|
def admin_new
|
78
77
|
return if !user_is_allowed('sites', 'add')
|
79
|
-
if !@site.is_master
|
80
|
-
@error = "You are not allowed to
|
78
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
79
|
+
@error = "You are not allowed to edit this site."
|
81
80
|
render :file => 'caboose/extras/error' and return
|
82
81
|
end
|
83
|
-
|
84
82
|
@site = Site.new
|
85
83
|
end
|
86
|
-
|
87
|
-
|
88
84
|
|
89
85
|
# @route GET /admin/sites/:id/block-types
|
90
86
|
def admin_edit_block_types
|
91
87
|
return if !user_is_allowed('sites', 'edit')
|
92
|
-
if !@site.is_master
|
93
|
-
@error = "You are not allowed to
|
88
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
89
|
+
@error = "You are not allowed to edit this site."
|
94
90
|
render :file => 'caboose/extras/error' and return
|
95
91
|
end
|
96
|
-
|
97
92
|
@site = Site.find(params[:id])
|
98
93
|
end
|
99
94
|
|
100
95
|
# @route GET /admin/sites/:id/css
|
101
96
|
def admin_edit_css
|
102
97
|
return if !user_is_allowed('sites', 'edit')
|
103
|
-
if !@site.is_master
|
104
|
-
@error = "You are not allowed to
|
98
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
99
|
+
@error = "You are not allowed to edit this site."
|
105
100
|
render :file => 'caboose/extras/error' and return
|
106
|
-
end
|
101
|
+
end
|
107
102
|
@site = Site.find(params[:id])
|
108
103
|
end
|
109
104
|
|
110
105
|
# @route GET /admin/sites/:id/js
|
111
106
|
def admin_edit_js
|
112
107
|
return if !user_is_allowed('sites', 'edit')
|
113
|
-
if !@site.is_master
|
114
|
-
@error = "You are not allowed to
|
108
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
109
|
+
@error = "You are not allowed to edit this site."
|
115
110
|
render :file => 'caboose/extras/error' and return
|
116
|
-
end
|
111
|
+
end
|
117
112
|
@site = Site.find(params[:id])
|
118
113
|
end
|
119
114
|
|
120
115
|
# @route GET /admin/sites/:id/delete
|
121
116
|
def admin_delete_form
|
122
117
|
return if !user_is_allowed('sites', 'edit')
|
123
|
-
if !@site.is_master
|
124
|
-
@error = "You are not allowed to
|
118
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
119
|
+
@error = "You are not allowed to edit this site."
|
125
120
|
render :file => 'caboose/extras/error' and return
|
126
121
|
end
|
127
122
|
@site = Site.find(params[:id])
|
@@ -130,14 +125,11 @@ module Caboose
|
|
130
125
|
# @route GET /admin/sites/:id
|
131
126
|
def admin_edit
|
132
127
|
return if !user_is_allowed('sites', 'edit')
|
133
|
-
if !@site.is_master
|
134
|
-
@error = "You are not allowed to
|
128
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
129
|
+
@error = "You are not allowed to edit this site."
|
135
130
|
render :file => 'caboose/extras/error' and return
|
136
131
|
end
|
137
|
-
|
138
132
|
@site = Site.find(params[:id])
|
139
|
-
@site.init_users_and_roles
|
140
|
-
|
141
133
|
end
|
142
134
|
|
143
135
|
# @route POST /admin/sites
|
@@ -173,11 +165,11 @@ module Caboose
|
|
173
165
|
# @route PUT /admin/sites/:id
|
174
166
|
def admin_update
|
175
167
|
return if !user_is_allowed('sites', 'edit')
|
176
|
-
|
177
|
-
|
168
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
169
|
+
render :json => { :error => "You are not allowed to manage sites." } and return
|
170
|
+
end
|
178
171
|
resp = StdClass.new
|
179
172
|
site = Site.find(params[:id])
|
180
|
-
|
181
173
|
save = true
|
182
174
|
params.each do |name,value|
|
183
175
|
case name
|
@@ -196,7 +188,6 @@ module Caboose
|
|
196
188
|
when 'assets_url' then site.assets_url = value
|
197
189
|
end
|
198
190
|
end
|
199
|
-
|
200
191
|
resp.success = save && site.save
|
201
192
|
render :json => resp
|
202
193
|
end
|
@@ -204,15 +195,38 @@ module Caboose
|
|
204
195
|
# @route POST /admin/sites/:id/logo
|
205
196
|
def admin_update_logo
|
206
197
|
return if !user_is_allowed('sites', 'edit')
|
207
|
-
|
208
|
-
|
198
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
199
|
+
render :json => { :error => "You are not allowed to manage sites." } and return
|
200
|
+
end
|
209
201
|
site = Site.find(params[:id])
|
210
202
|
site.logo = params[:logo]
|
211
203
|
site.save
|
212
|
-
|
213
204
|
resp = StdClass.new
|
214
205
|
resp.success = true
|
215
|
-
resp.attributes = { :
|
206
|
+
resp.attributes = { :logo => { :value => site.logo.url(:thumb) }}
|
207
|
+
if Caboose::use_cloudinary
|
208
|
+
site.update_cloudinary_logo if Rails.env.development?
|
209
|
+
site.delay(:queue => 'general', :priority => 12).update_cloudinary_logo if Rails.env.production?
|
210
|
+
end
|
211
|
+
render :json => resp
|
212
|
+
end
|
213
|
+
|
214
|
+
# @route POST /admin/sites/:id/favicon
|
215
|
+
def admin_update_favicon
|
216
|
+
return if !user_is_allowed('sites', 'edit')
|
217
|
+
if (@site.id.to_s != params[:id] && !@site.is_master)
|
218
|
+
render :json => { :error => "You are not allowed to manage sites." } and return
|
219
|
+
end
|
220
|
+
site = Site.find(params[:id])
|
221
|
+
site.favicon = params[:favicon]
|
222
|
+
site.save
|
223
|
+
resp = StdClass.new
|
224
|
+
resp.success = true
|
225
|
+
resp.attributes = { :favicon => { :value => site.favicon.url(:tiny) }}
|
226
|
+
if Caboose::use_cloudinary
|
227
|
+
site.update_cloudinary_favicon if Rails.env.development?
|
228
|
+
site.delay(:queue => 'general', :priority => 12).update_cloudinary_favicon if Rails.env.production?
|
229
|
+
end
|
216
230
|
render :json => resp
|
217
231
|
end
|
218
232
|
|
@@ -220,10 +234,8 @@ module Caboose
|
|
220
234
|
def admin_delete
|
221
235
|
return if !user_is_allowed('sites', 'delete')
|
222
236
|
render :json => { :error => "You are not allowed to manage sites." } and return if !@site.is_master
|
223
|
-
|
224
237
|
site = Site.find(params[:id])
|
225
238
|
site.destroy
|
226
|
-
|
227
239
|
resp = StdClass.new({
|
228
240
|
'redirect' => '/admin/sites'
|
229
241
|
})
|
@@ -234,7 +246,6 @@ module Caboose
|
|
234
246
|
def admin_add_member
|
235
247
|
return if !user_is_allowed('sites', 'edit')
|
236
248
|
render :json => { :error => "You are not allowed to manage sites." } and return if !@site.is_master
|
237
|
-
|
238
249
|
sm = SiteMembership.where(:site_id => params[:id], :user_id => params[:user_id]).first
|
239
250
|
sm = SiteMembership.create(:site_id => params[:id], :user_id => params[:user_id]) if sm.nil?
|
240
251
|
sm.role = params[:role]
|
@@ -246,7 +257,6 @@ module Caboose
|
|
246
257
|
def admin_remove_member
|
247
258
|
return if !user_is_allowed('sites', 'edit')
|
248
259
|
render :json => { :error => "You are not allowed to manage sites." } and return if !@site.is_master
|
249
|
-
|
250
260
|
SiteMembership.where(:site_id => params[:id], :user_id => params[:user_id]).destroy_all
|
251
261
|
render :json => true
|
252
262
|
end
|
@@ -257,7 +267,6 @@ module Caboose
|
|
257
267
|
# @route GET /admin/sites/:id/:field-options
|
258
268
|
def options
|
259
269
|
return if !user_is_allowed('sites', 'view')
|
260
|
-
|
261
270
|
case params[:field]
|
262
271
|
when nil
|
263
272
|
options = logged_in_user.is_super_admin? ? Site.reorder('name').all.collect { |s| { 'value' => s.id, 'text' => s.name }} : []
|
@@ -75,6 +75,12 @@ module Caboose
|
|
75
75
|
when 'sidebar_width' then theme.sidebar_width = value
|
76
76
|
when 'sidebar_bg_color' then theme.sidebar_bg_color = value
|
77
77
|
|
78
|
+
when 'banner_font_size' then theme.banner_font_size = value
|
79
|
+
when 'footer_hover_color' then theme.footer_hover_color = value
|
80
|
+
when 'actual_footer_height' then theme.actual_footer_height = value
|
81
|
+
when 'actual_banner_height' then theme.actual_banner_height = value
|
82
|
+
when 'dropdown_nav_padding' then theme.dropdown_nav_padding = value
|
83
|
+
|
78
84
|
end
|
79
85
|
end
|
80
86
|
resp.success = save && theme.save
|
@@ -14,8 +14,8 @@ class Caboose::CorePlugin < Caboose::CaboosePlugin
|
|
14
14
|
item['children'] << { 'icon' => 'box', 'id' => 'inbox' , 'text' => 'Inbox' , 'href' => '/admin/inbox' , 'modal' => false } if user.is_allowed('contacts' , 'view') && has_inbox && Contact.where(:site_id => site.id).count > 0
|
15
15
|
nav << item if item['children'].count > 0
|
16
16
|
|
17
|
-
item = { 'id' => 'core', 'text' => 'Settings', 'children' => [] }
|
18
|
-
|
17
|
+
item = { 'id' => 'core', 'text' => 'Settings', 'children' => [] }
|
18
|
+
item['children'] << { 'id' => 'settings' , 'icon' => 'settings', 'text' => 'Site Settings' , 'href' => "/admin/sites/#{site.id}" , 'modal' => false } if user.is_super_admin?
|
19
19
|
item['children'] << { 'id' => 'blocktypes' , 'text' => 'Block Types' , 'href' => '/admin/block-types' , 'modal' => false } if user.is_allowed('blocktypes' , 'view') && site.is_master == true
|
20
20
|
item['children'] << { 'icon' => 'star', 'id' => 'fonts' , 'text' => 'Fonts' , 'href' => '/admin/fonts' , 'modal' => false } if user.is_allowed('fonts' , 'view') && site.use_fonts == true
|
21
21
|
item['children'] << { 'id' => 'redirects' , 'text' => 'Permanent Redirects' , 'href' => '/admin/redirects' , 'modal' => false } if user.is_allowed('redirects' , 'view')
|
data/app/models/caboose/page.rb
CHANGED
@@ -460,9 +460,7 @@ class Caboose::Page < ActiveRecord::Base
|
|
460
460
|
|
461
461
|
p.title = "Copy of " + self.title
|
462
462
|
p.menu_title = self.menu_title
|
463
|
-
p.
|
464
|
-
p.alias = self.alias
|
465
|
-
p.uri = self.uri
|
463
|
+
p.alias = self.alias
|
466
464
|
p.redirect_url = self.redirect_url
|
467
465
|
p.hide = self.hide
|
468
466
|
p.content_format = self.content_format
|
@@ -478,7 +476,16 @@ class Caboose::Page < ActiveRecord::Base
|
|
478
476
|
p.meta_robots = self.meta_robots
|
479
477
|
p.canonical_url = self.canonical_url
|
480
478
|
p.fb_description = self.fb_description
|
481
|
-
p.gp_description = self.gp_description
|
479
|
+
p.gp_description = self.gp_description
|
480
|
+
|
481
|
+
i = 0
|
482
|
+
begin
|
483
|
+
par = Caboose::Page.where(:id => parent_id).first
|
484
|
+
p.slug = Caboose::Page.slug(p.title + (i > 0 ? " #{i}" : ""))
|
485
|
+
p.uri = par.parent_id == -1 ? p.slug : "#{par.uri}/#{p.slug}"
|
486
|
+
i = i+1
|
487
|
+
end while (Caboose::Page.where(:uri => p.uri, :site_id => site_id).count > 0 && i < 10)
|
488
|
+
|
482
489
|
p.save
|
483
490
|
|
484
491
|
self.page_tags.each{ |tag| Caboose::PageTag.create(:page_id => p.id, :tag => tag.tag) }
|
@@ -807,11 +807,10 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
807
807
|
[ :theme_color , :string ],
|
808
808
|
[ :assets_url , :string ],
|
809
809
|
[ :rets_office_id, :string ],
|
810
|
-
[ :theme_id, :integer ]
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
#[ :custom_js_files , :text ]
|
810
|
+
[ :theme_id, :integer ],
|
811
|
+
[ :favicon, :attachment ],
|
812
|
+
[ :cl_logo_version , :string ],
|
813
|
+
[ :cl_favicon_version , :string ]
|
815
814
|
],
|
816
815
|
Caboose::SiteMembership => [
|
817
816
|
[ :site_id , :integer ],
|
@@ -924,7 +923,6 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
924
923
|
[ :status , :string ]
|
925
924
|
],
|
926
925
|
Caboose::Theme => [
|
927
|
-
# [ :site_id , :integer ],
|
928
926
|
[ :color_main , :string ],
|
929
927
|
[ :color_alt , :string ],
|
930
928
|
[ :color_light, :string ],
|
@@ -960,29 +958,41 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
960
958
|
[ :input_font_size, :string ],
|
961
959
|
[ :input_padding, :string ],
|
962
960
|
[ :digest, :text ],
|
963
|
-
[ :body_line_height, :
|
964
|
-
[ :body_font_color, :
|
965
|
-
[ :button_padding, :
|
966
|
-
[ :button_line_height, :
|
967
|
-
[ :footer_padding, :
|
968
|
-
[ :footer_font_size, :
|
969
|
-
[ :header_font_size, :
|
970
|
-
[ :note_padding, :
|
971
|
-
[ :header_nav_spacing, :
|
972
|
-
[ :logo_width, :
|
973
|
-
[ :logo_height, :
|
974
|
-
[ :logo_top_padding, :
|
975
|
-
[ :heading_line_height, :
|
976
|
-
[ :mobile_menu_nav_padding, :
|
977
|
-
[ :mobile_menu_font_size, :
|
978
|
-
[ :banner_padding, :
|
979
|
-
[ :banner_overlay_color, :
|
980
|
-
[ :banner_overlay_opacity, :
|
981
|
-
[ :default_header_style, :
|
982
|
-
[ :default_header_position, :
|
983
|
-
[ :sidebar_width, :
|
984
|
-
[ :sidebar_bg_color, :
|
985
|
-
[ :default_banner_image, :attachment ]
|
961
|
+
[ :body_line_height, :string ],
|
962
|
+
[ :body_font_color, :string ],
|
963
|
+
[ :button_padding, :string ],
|
964
|
+
[ :button_line_height, :string ],
|
965
|
+
[ :footer_padding, :string ],
|
966
|
+
[ :footer_font_size, :string ],
|
967
|
+
[ :header_font_size, :string ],
|
968
|
+
[ :note_padding, :string ],
|
969
|
+
[ :header_nav_spacing, :string ],
|
970
|
+
[ :logo_width, :string ],
|
971
|
+
[ :logo_height, :string ],
|
972
|
+
[ :logo_top_padding, :string ],
|
973
|
+
[ :heading_line_height, :string ],
|
974
|
+
[ :mobile_menu_nav_padding, :string ],
|
975
|
+
[ :mobile_menu_font_size, :string ],
|
976
|
+
[ :banner_padding, :string ],
|
977
|
+
[ :banner_overlay_color, :string ],
|
978
|
+
[ :banner_overlay_opacity, :string ],
|
979
|
+
[ :default_header_style, :string ],
|
980
|
+
[ :default_header_position, :string ],
|
981
|
+
[ :sidebar_width, :string ],
|
982
|
+
[ :sidebar_bg_color, :string ],
|
983
|
+
[ :default_banner_image, :attachment ],
|
984
|
+
[ :banner_font_size, :string ],
|
985
|
+
[ :footer_hover_color, :string ],
|
986
|
+
[ :actual_footer_height, :string ],
|
987
|
+
[ :actual_banner_height, :string ],
|
988
|
+
[ :dropdown_nav_padding, :string ]
|
989
|
+
],
|
990
|
+
Caboose::ThemeFile => [
|
991
|
+
[ :filename, :string ]
|
992
|
+
],
|
993
|
+
Caboose::ThemeFileMembership => [
|
994
|
+
[ :theme_file_id , :integer ],
|
995
|
+
[ :theme_id , :integer ]
|
986
996
|
],
|
987
997
|
Caboose::User => [
|
988
998
|
[ :site_id , :integer ],
|
data/app/models/caboose/site.rb
CHANGED
@@ -10,6 +10,7 @@ class Caboose::Site < ActiveRecord::Base
|
|
10
10
|
has_many :fonts, :class_name => 'Caboose::Font', :dependent => :delete_all
|
11
11
|
has_many :post_categories, :class_name => 'Caboose::PostCategory'
|
12
12
|
has_one :store_config
|
13
|
+
|
13
14
|
has_attached_file :logo,
|
14
15
|
:path => ':caboose_prefixsite_logos/:id_:style.:extension',
|
15
16
|
:default_url => 'http://placehold.it/300x300',
|
@@ -19,6 +20,16 @@ class Caboose::Site < ActiveRecord::Base
|
|
19
20
|
:large => '600x800>'
|
20
21
|
}
|
21
22
|
do_not_validate_attachment_file_type :logo
|
23
|
+
|
24
|
+
has_attached_file :favicon,
|
25
|
+
:path => ':caboose_prefixfavicons/:id_:style.:extension',
|
26
|
+
:default_url => 'https://assets.caboosecms.com/site_logos/ninefavicon.png',
|
27
|
+
:styles => {
|
28
|
+
:tiny => '100x100>',
|
29
|
+
:thumb => '300x300>'
|
30
|
+
}
|
31
|
+
do_not_validate_attachment_file_type :favicon
|
32
|
+
|
22
33
|
attr_accessible :id ,
|
23
34
|
:name ,
|
24
35
|
:description ,
|
@@ -39,7 +50,9 @@ class Caboose::Site < ActiveRecord::Base
|
|
39
50
|
:robots_txt ,
|
40
51
|
:theme_color ,
|
41
52
|
:assets_url ,
|
42
|
-
:theme_id
|
53
|
+
:theme_id ,
|
54
|
+
:cl_logo_version ,
|
55
|
+
:cl_favicon_version
|
43
56
|
|
44
57
|
before_save :validate_presence_of_store_config
|
45
58
|
|
@@ -47,6 +60,22 @@ class Caboose::Site < ActiveRecord::Base
|
|
47
60
|
Caboose::Theme.where(:id => self.theme_id).first
|
48
61
|
end
|
49
62
|
|
63
|
+
def update_cloudinary_logo
|
64
|
+
if Caboose::use_cloudinary
|
65
|
+
result = Cloudinary::Uploader.upload("https:#{self.logo.url(:large)}" , :public_id => "caboose/site_logos/#{self.id}_large", :overwrite => true)
|
66
|
+
self.cl_logo_version = result['version'] if result && result['version']
|
67
|
+
self.save
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def update_cloudinary_favicon
|
72
|
+
if Caboose::use_cloudinary
|
73
|
+
result = Cloudinary::Uploader.upload("https:#{self.favicon.url(:thumb)}" , :public_id => "caboose/favicons/#{self.id}_thumb", :overwrite => true)
|
74
|
+
self.cl_favicon_version = result['version'] if result && result['version']
|
75
|
+
self.save
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
50
79
|
def build_new_site
|
51
80
|
# if defined?(SuiteBuilder) == 'constant' && SuiteBuilder.class == Class
|
52
81
|
helper = Caboose::SiteBuilder.new(self.name)
|
data/app/models/caboose/theme.rb
CHANGED
@@ -2,6 +2,9 @@ class Caboose::Theme < ActiveRecord::Base
|
|
2
2
|
|
3
3
|
self.table_name = "themes"
|
4
4
|
|
5
|
+
has_many :theme_file_memberships
|
6
|
+
has_many :theme_files, :through => :theme_file_memberships
|
7
|
+
|
5
8
|
has_attached_file :default_banner_image,
|
6
9
|
:path => 'banner_images/:id_:style.:extension',
|
7
10
|
:default_url => 'https://res.cloudinary.com/caboose/image/upload/c_scale,f_auto,q_auto:good,w_1800/v1539265856/default_banner.jpg',
|
@@ -70,6 +73,12 @@ class Caboose::Theme < ActiveRecord::Base
|
|
70
73
|
:sidebar_width,
|
71
74
|
:sidebar_bg_color,
|
72
75
|
|
76
|
+
:banner_font_size,
|
77
|
+
:footer_hover_color,
|
78
|
+
:actual_footer_height,
|
79
|
+
:actual_banner_height,
|
80
|
+
:dropdown_nav_padding,
|
81
|
+
|
73
82
|
:digest
|
74
83
|
|
75
84
|
def compile(for_site_id = 0)
|
@@ -82,7 +91,7 @@ class Caboose::Theme < ActiveRecord::Base
|
|
82
91
|
tmp_asset_name = "theme_#{self.id}_site_#{for_site_id}"
|
83
92
|
FileUtils.mkdir_p(tmp_themes_path) unless File.directory?(tmp_themes_path)
|
84
93
|
File.open(File.join(tmp_themes_path, "#{tmp_asset_name}.scss"), 'w') { |f| f.write(body) }
|
85
|
-
|
94
|
+
begin
|
86
95
|
env = if Rails.application.assets.is_a?(Sprockets::Index)
|
87
96
|
Rails.application.assets.instance_variable_get('@environment')
|
88
97
|
else
|
@@ -107,9 +116,12 @@ class Caboose::Theme < ActiveRecord::Base
|
|
107
116
|
File.open(File.join(Rails.root, 'public', theme.asset_path(asset.digest, for_site_id)), 'w') { |f| f.write(compressed_body) }
|
108
117
|
end
|
109
118
|
self.update_digest(asset.digest)
|
110
|
-
|
111
|
-
|
112
|
-
|
119
|
+
rescue Sass::SyntaxError => error
|
120
|
+
if Rails.env.development?
|
121
|
+
raise error
|
122
|
+
end
|
123
|
+
theme.revert
|
124
|
+
end
|
113
125
|
end
|
114
126
|
|
115
127
|
def revert
|
@@ -133,8 +145,16 @@ class Caboose::Theme < ActiveRecord::Base
|
|
133
145
|
end
|
134
146
|
|
135
147
|
def asset_url(site_id = 0)
|
136
|
-
|
137
|
-
|
148
|
+
if Rails.env.production?
|
149
|
+
return "https://#{ActionController::Base.asset_host}/#{asset_path(self.digest,site_id)}"
|
150
|
+
else
|
151
|
+
path = File.join(Rails.root, 'public', "#{asset_path(self.digest,site_id)}")
|
152
|
+
if File.file?(path)
|
153
|
+
return "#{ActionController::Base.asset_host}/#{asset_path(self.digest,site_id)}"
|
154
|
+
else
|
155
|
+
return "https://#{Caboose::cdn_domain}/#{asset_path(self.digest,site_id)}"
|
156
|
+
end
|
157
|
+
end
|
138
158
|
end
|
139
159
|
|
140
160
|
def js_url
|
@@ -5,10 +5,18 @@ if block.media
|
|
5
5
|
elsif block.image
|
6
6
|
url = block.image.url(:tiny)
|
7
7
|
end
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
%>
|
8
|
+
if editing && url.include?('placehold') %>
|
9
|
+
<div class="img-wrap" style="position:relative;display:inline-block;">
|
10
|
+
<div class="img-holder" style="background-image:url(https://cabooseit.s3.amazonaws.com/assets/caboose/grid.png);background-size:15px;display:inline-block;position:relative;" id='block_<%= block.id %>'>
|
11
|
+
<img src='https://cabooseit.s3.amazonaws.com/assets/select_image.png' width="150" style="max-width:100%;display:block;" />
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<% elsif editing %>
|
15
|
+
<div class="img-wrap" style="position:relative;display:inline-block;">
|
16
|
+
<div class="img-holder" style="background-image:url(https://cabooseit.s3.amazonaws.com/assets/caboose/grid.png);background-size:15px;display:inline-block;position:relative;" id='block_<%= block.id %>'>
|
17
|
+
<img src='<%== url %>' width="200" style="max-width:100%;display:block;" />
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
<% else %>
|
21
|
+
<img src='<%== url %>' width="200" id='block_<%= block.id %>' />
|
22
|
+
<% end %>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<form action="/login" method="post" id="login-form">
|
2
2
|
<div class="header">
|
3
|
-
<% if @site.logo %>
|
3
|
+
<% if @site.logo && !@site.logo.url.include?('placehold') %>
|
4
4
|
<img src='<%= @site.logo.url(:thumb) %>' alt="<%= @site.description %>" />
|
5
5
|
<% else %>
|
6
6
|
<img src="/assets/caboose/caboose_logo.png" alt="Caboose">
|
@@ -1,3 +1,8 @@
|
|
1
|
+
<%
|
2
|
+
temp = Caboose::PageTemplate.where('screenshot_file_name is not null').first
|
3
|
+
tempimg = temp ? temp.screenshot.url(:small) : '//cabooseit.s3.amazonaws.com/assets/shared/template.png'
|
4
|
+
%>
|
5
|
+
|
1
6
|
<h1>New Page</h1>
|
2
7
|
|
3
8
|
<div class="new-page-form-wrapper">
|
@@ -28,11 +33,11 @@
|
|
28
33
|
<option <% if bt.description == 'Subpage' || bt.description == 'Standard' %>selected<% end %> value="<%= bt.id %>"><%= bt.description %></option>
|
29
34
|
<% end %>
|
30
35
|
</select>
|
31
|
-
<p class="meta">The page layout defines the overall page structure, such as header, footer, and sidebar
|
36
|
+
<p class="meta">The page layout defines the overall page structure, such as header, footer, and sidebar.</p>
|
32
37
|
</div>
|
33
38
|
</section>
|
34
39
|
<%# temporarily only super admins can do templates %>
|
35
|
-
|
40
|
+
|
36
41
|
<section class="page-templates-wrapper">
|
37
42
|
<h4>Page Template</h4>
|
38
43
|
<div class="field">
|
@@ -42,19 +47,28 @@
|
|
42
47
|
<div class="category">
|
43
48
|
<div class="cat-templates">
|
44
49
|
<a href="#" id="template-blank" class="template selected opt">
|
45
|
-
<img src="
|
50
|
+
<img src="https://cabooseit.s3.amazonaws.com/assets/blank_template.png" width="200" alt="Blank" />
|
46
51
|
<div class="text">
|
47
52
|
<span class="title">Blank</span>
|
48
53
|
<span class="desc">A completely blank page.</span>
|
49
54
|
</div>
|
50
55
|
</a>
|
56
|
+
<% if @logged_in_user && @logged_in_user.is_super_admin? %>
|
51
57
|
<a href="#" id="template-choose" class="template opt">
|
52
|
-
<img src="
|
58
|
+
<img src="<%= tempimg %>" width="200" alt="Blank" />
|
53
59
|
<div class="text">
|
54
60
|
<span class="title">Use a Template</span>
|
55
61
|
<span class="desc">Choose a page template.</span>
|
56
62
|
</div>
|
57
63
|
</a>
|
64
|
+
<% end %>
|
65
|
+
<a href="#" id="template-copy" class="template opt">
|
66
|
+
<img src="https://cabooseit.s3.amazonaws.com/assets/copy_page.png" width="200" alt="Blank" />
|
67
|
+
<div class="text">
|
68
|
+
<span class="title">Existing page</span>
|
69
|
+
<span class="desc">Copy an existing page.</span>
|
70
|
+
</div>
|
71
|
+
</a>
|
58
72
|
</div>
|
59
73
|
</div>
|
60
74
|
<% @categories.each do |cat| %>
|
@@ -75,14 +89,25 @@
|
|
75
89
|
</div>
|
76
90
|
</div>
|
77
91
|
<% end %>
|
92
|
+
<div class="copy-options" style="display:none;">
|
93
|
+
<div class="field">
|
94
|
+
<label for="copy_from_id">Choose a page to copy</label>
|
95
|
+
<select name="copy_from_id" id="copy_from_id">
|
96
|
+
<% @sitemap.each do |sm| %>
|
97
|
+
<option value="<%= sm['value'] %>"><%= sm['text'] %></option>
|
98
|
+
<% end %>
|
99
|
+
</select>
|
100
|
+
</div>
|
101
|
+
</div>
|
78
102
|
</section>
|
79
|
-
|
103
|
+
|
80
104
|
<div id="page-message"></div>
|
81
105
|
<section class="buttons clearfix">
|
82
106
|
<a href="/admin/pages" class="caboose-btn-white">Cancel</a>
|
83
107
|
<a href="#" id="create_page" class="caboose-btn">Create Page</a>
|
84
108
|
</section>
|
85
109
|
<input type="hidden" id="use_template" name="use_template" value="no" />
|
110
|
+
<input type="hidden" id="use_copy" name="use_copy" value="no" />
|
86
111
|
<input type="hidden" id="template_id" name="template_id" value="" />
|
87
112
|
</form>
|
88
113
|
</div>
|
@@ -107,11 +132,21 @@
|
|
107
132
|
$(this).addClass("selected");
|
108
133
|
if ( $(this).attr("id") == "template-choose") {
|
109
134
|
$(".category.more").slideDown();
|
135
|
+
$(".copy-options").slideUp();
|
110
136
|
$("#use_template").attr("value","yes");
|
137
|
+
$("#use_copy").attr("value","no");
|
111
138
|
}
|
112
139
|
else if ( $(this).attr("id") == "template-blank") {
|
113
140
|
$(".category.more").slideUp();
|
141
|
+
$(".copy-options").slideUp();
|
142
|
+
$("#use_template").attr("value","no");
|
143
|
+
$("#use_copy").attr("value","no");
|
144
|
+
}
|
145
|
+
else if ( $(this).attr("id") == "template-copy") {
|
146
|
+
$(".category.more").slideUp();
|
147
|
+
$(".copy-options").slideDown();
|
114
148
|
$("#use_template").attr("value","no");
|
149
|
+
$("#use_copy").attr("value","yes");
|
115
150
|
}
|
116
151
|
});
|
117
152
|
$(".template.tem").click(function(e) {
|
@@ -28,7 +28,7 @@ tabs = {
|
|
28
28
|
'Block Types' => "/admin/sites/#{@site.id}/block-types",
|
29
29
|
'Custom CSS' => "/admin/sites/#{@site.id}/css",
|
30
30
|
'Custom JS' => "/admin/sites/#{@site.id}/js",
|
31
|
-
'Retargeting' => "/admin/sites/#{@site.id}/retargeting",
|
31
|
+
# 'Retargeting' => "/admin/sites/#{@site.id}/retargeting",
|
32
32
|
'Delete Site' => "/admin/sites/#{@site.id}/delete"
|
33
33
|
}
|
34
34
|
|
@@ -17,9 +17,12 @@ user_ids = [] if user_ids.nil?
|
|
17
17
|
<p><div id='site_<%= @site.id %>_use_fonts' ></div></p>
|
18
18
|
<p><div id='site_<%= @site.id %>_use_dragdrop' ></div></p>
|
19
19
|
<p><div id='site_<%= @site.id %>_allow_self_registration' ></div></p>
|
20
|
+
<% if @site.theme.nil? %>
|
20
21
|
<p><div id='site_<%= @site.id %>_theme_color' ></div></p>
|
22
|
+
<% end %>
|
21
23
|
<p><div id='site_<%= @site.id %>_assets_url' ></div></p>
|
22
24
|
<p><div id='site_<%= @site.id %>_default_layout_id' ></div></p>
|
25
|
+
<p><div id='site_<%= @site.id %>_favicon' ></div></p>
|
23
26
|
|
24
27
|
<h2>Domains</h2>
|
25
28
|
<p><a href='#' onclick="add_domain(<%= @site.id %>);">New Domain</a></p>
|
@@ -93,7 +96,8 @@ $(document).ready(function() {
|
|
93
96
|
update_url: '/admin/sites/<%= @site.id %>',
|
94
97
|
authenticity_token: '<%= form_authenticity_token %>',
|
95
98
|
attributes: [
|
96
|
-
{ name: 'logo' , nice_name: 'Logo' , type: 'image' , value: <%= raw Caboose.json(@site.logo ? @site.logo.url(:thumb) : '') %>, width:
|
99
|
+
{ name: 'logo' , nice_name: 'Logo' , type: 'image' , value: <%= raw Caboose.json(@site.logo ? @site.logo.url(:thumb) : '') %>, width: 300, update_url: '/admin/sites/<%= @site.id %>/logo' },
|
100
|
+
{ name: 'favicon' , nice_name: 'Favicon' , type: 'image' , value: <%= raw Caboose.json(@site.favicon ? @site.favicon.url(:tiny) : '') %>, width: 80, update_url: '/admin/sites/<%= @site.id %>/favicon' },
|
97
101
|
{ name: 'description' , nice_name: 'Description' , type: 'text' , value: <%= raw Caboose.json(@site.description) %>, width: 600 },
|
98
102
|
{ name: 'theme_color' , nice_name: 'Theme Color' , type: 'text' , value: <%= raw Caboose.json(@site.theme_color) %>, width: 600 },
|
99
103
|
{ name: 'assets_url' , nice_name: 'Assets URL' , type: 'text' , value: <%= raw Caboose.json(@site.assets_url) %>, width: 600 },
|
@@ -36,6 +36,7 @@ position = header.child('position') if header
|
|
36
36
|
<div id="theme_<%= @theme.id %>_header_bg_color"></div>
|
37
37
|
<div id="theme_<%= @theme.id %>_header_font_color"></div>
|
38
38
|
<div id="theme_<%= @theme.id %>_dropdown_color"></div>
|
39
|
+
<div id="theme_<%= @theme.id %>_dropdown_nav_padding"></div>
|
39
40
|
<div id="theme_<%= @theme.id %>_mobile_menu_icon_color"></div>
|
40
41
|
<div id="theme_<%= @theme.id %>_mobile_menu_icon_top"></div>
|
41
42
|
<div id="theme_<%= @theme.id %>_header_font_size"></div>
|
@@ -50,9 +51,11 @@ position = header.child('position') if header
|
|
50
51
|
<h5>Footer</h5>
|
51
52
|
<div id="theme_<%= @theme.id %>_footer_height"></div>
|
52
53
|
<div id="theme_<%= @theme.id %>_footer_bg_color"></div>
|
54
|
+
<div id="theme_<%= @theme.id %>_footer_hover_color"></div>
|
53
55
|
<div id="theme_<%= @theme.id %>_footer_font_color"></div>
|
54
56
|
<div id="theme_<%= @theme.id %>_footer_padding"></div>
|
55
57
|
<div id="theme_<%= @theme.id %>_footer_font_size"></div>
|
58
|
+
<div id="theme_<%= @theme.id %>_actual_footer_height"></div>
|
56
59
|
</section>
|
57
60
|
</div>
|
58
61
|
<div class="unit1of2 right">
|
@@ -85,8 +88,10 @@ position = header.child('position') if header
|
|
85
88
|
<section>
|
86
89
|
<h5>Subpage Banner</h5>
|
87
90
|
<div id="theme_<%= @theme.id %>_banner_padding"></div>
|
91
|
+
<div id="theme_<%= @theme.id %>_banner_font_size"></div>
|
88
92
|
<div id="theme_<%= @theme.id %>_banner_overlay_color"></div>
|
89
93
|
<div id="theme_<%= @theme.id %>_banner_overlay_opacity"></div>
|
94
|
+
<div id="theme_<%= @theme.id %>_actual_banner_height"></div>
|
90
95
|
<div id="theme_<%= @theme.id %>_default_banner_image"></div>
|
91
96
|
</section>
|
92
97
|
<section>
|
@@ -134,12 +139,6 @@ position = header.child('position') if header
|
|
134
139
|
section > div {
|
135
140
|
margin-bottom: 10px;
|
136
141
|
}
|
137
|
-
#message .note {
|
138
|
-
font-size: 16px !important;
|
139
|
-
}
|
140
|
-
#message p.note.loading {
|
141
|
-
background-color: #b7b7ff !important;
|
142
|
-
}
|
143
142
|
</style>
|
144
143
|
<% end %>
|
145
144
|
|
@@ -233,7 +232,12 @@ $(document).ready(function() {
|
|
233
232
|
<% end %>
|
234
233
|
{ name: 'sidebar_width', nice_name: "<%= 'width'.titleize %>", type: 'text', value: <%== Caboose.json(@theme.sidebar_width) %>, width: 400 },
|
235
234
|
{ name: 'sidebar_bg_color', nice_name: "<%= 'background_color'.titleize %>", type: 'text', value: <%== Caboose.json(@theme.sidebar_bg_color) %>, width: 400 },
|
236
|
-
{ name: 'default_banner_image' , nice_name: 'Default Banner Image' , type: 'image' , value: <%= raw Caboose.json(@theme.default_banner_image ? @theme.default_banner_image.url(:huge) : 'https://res.cloudinary.com/caboose/image/upload/c_scale,f_auto,q_auto:good,w_300/v1539265856/default_banner.jpg') %>, width: 800, update_url: '/admin/themes/<%= @theme.id %>/default-banner-image' }
|
235
|
+
{ name: 'default_banner_image' , nice_name: 'Default Banner Image' , type: 'image' , value: <%= raw Caboose.json(@theme.default_banner_image ? @theme.default_banner_image.url(:huge) : 'https://res.cloudinary.com/caboose/image/upload/c_scale,f_auto,q_auto:good,w_300/v1539265856/default_banner.jpg') %>, width: 800, update_url: '/admin/themes/<%= @theme.id %>/default-banner-image' },
|
236
|
+
{ name: 'banner_font_size', nice_name: "<%= 'banner_font_size'.titleize %>", type: 'text', value: <%== Caboose.json(@theme.banner_font_size) %>, width: 400 },
|
237
|
+
{ name: 'footer_hover_color', nice_name: "<%= 'footer_hover_color'.titleize %>", type: 'text', value: <%== Caboose.json(@theme.footer_hover_color) %>, width: 400 },
|
238
|
+
{ name: 'actual_footer_height', nice_name: "<%= 'actual_footer_height'.titleize %>", type: 'text', value: <%== Caboose.json(@theme.actual_footer_height) %>, width: 400 },
|
239
|
+
{ name: 'actual_banner_height', nice_name: "<%= 'actual_banner_height'.titleize %>", type: 'text', value: <%== Caboose.json(@theme.actual_banner_height) %>, width: 400 },
|
240
|
+
{ name: 'dropdown_nav_padding', nice_name: "<%= 'dropdown_nav_padding'.titleize %>", type: 'text', value: <%== Caboose.json(@theme.dropdown_nav_padding) %>, width: 400 }
|
237
241
|
]
|
238
242
|
});
|
239
243
|
});
|
data/lib/caboose.rb
CHANGED
@@ -43,6 +43,10 @@ module Caboose
|
|
43
43
|
# Whether or not to use AB Testing
|
44
44
|
mattr_accessor :use_ab_testing
|
45
45
|
@@use_ab_testing = true
|
46
|
+
|
47
|
+
# Whether or not to use Cloudinary for site logo and favicon
|
48
|
+
mattr_accessor :use_cloudinary
|
49
|
+
@@use_cloudinary = false
|
46
50
|
|
47
51
|
# Website name
|
48
52
|
mattr_accessor :website_name
|
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.9.
|
4
|
+
version: 0.9.173
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Barry
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pg
|
@@ -879,6 +879,8 @@ files:
|
|
879
879
|
- app/models/caboose/tax_calculator.rb
|
880
880
|
- app/models/caboose/tax_line.rb
|
881
881
|
- app/models/caboose/theme.rb
|
882
|
+
- app/models/caboose/theme_file.rb
|
883
|
+
- app/models/caboose/theme_file_membership.rb
|
882
884
|
- app/models/caboose/user.rb
|
883
885
|
- app/models/caboose/utilities/schema.rb
|
884
886
|
- app/models/caboose/variant.rb
|