caboose-cms 0.9.172 → 0.9.173
Sign up to get free protection for your applications and to get access to all the features.
- 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
|