rails_admin_content_builder 1.0.6 → 1.1.0
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/.gitignore +2 -1
- data/.rubocop.yml +4 -0
- data/.travis.yml +1 -1
- data/Gemfile +1 -0
- data/app/assets/images/cb-snippet-gallery.jpg +0 -0
- data/app/assets/images/cb-snippet-gallery.psd +0 -0
- data/app/assets/javascripts/rails_admin/content_builder.js.erb +24 -160
- data/app/assets/javascripts/rails_admin/helpers/action_sortable.js +16 -0
- data/app/assets/javascripts/rails_admin/helpers/add_event_to_input.js +9 -0
- data/app/assets/javascripts/rails_admin/helpers/autocomplete.js.erb +28 -0
- data/app/assets/javascripts/rails_admin/helpers/file_select_and_upload.js +32 -0
- data/app/assets/javascripts/rails_admin/helpers/file_select_and_upload_gallery.js +44 -0
- data/app/assets/javascripts/rails_admin/helpers/generate_id.js +4 -0
- data/app/assets/javascripts/rails_admin/helpers/get_image_of_position.js +11 -0
- data/app/assets/javascripts/rails_admin/helpers/medium_editor.js +44 -0
- data/app/assets/javascripts/rails_admin/helpers/scrool_to.js +8 -0
- data/app/assets/javascripts/rails_admin/helpers/youtube_parse.js.erb +11 -0
- data/app/assets/stylesheets/rails_admin/content_builder.scss +50 -11
- data/app/models/application_record.rb +3 -0
- data/app/models/rails_admin_content_builder/content_builder.rb +1 -1
- data/app/models/rails_admin_content_builder/content_builder_category.rb +1 -1
- data/app/models/rails_admin_content_builder/content_builder_image.rb +1 -1
- data/app/views/rails_admin/main/content_builder.html.erb +7 -0
- data/config/initializers/assets.rb +1 -0
- data/lib/rails_admin_content_builder/version.rb +1 -1
- data/rails_admin_content_builder.gemspec +1 -1
- data/spec/controllers/rails_admin_content_builder/content_builder_controller_spec.rb +4 -4
- data/spec/dummy/config/environments/test.rb +5 -2
- data/vendor/assets/stylesheets/rails_admin_content_builder.scss +21 -0
- metadata +2891 -1244
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 776c8a0206f2d80bc094bcdd7134c2b7d1b8a5ac
|
4
|
+
data.tar.gz: f5a0ff75e09b027ea2e05de7772ceaaef45c878e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8bcba40b02306b6f0c2c2be22ef4dd2952360c4a65ef62adba260c67898d84baa39c775a2461f562d691db0e6fbd5e2eb3beb9fe51677b38fce77c265f935ae8
|
7
|
+
data.tar.gz: 08354717581d79535c2b4d865abd6819c9ce043a8e2bac29ccebed95c56efd7e85e730f4f74404cb31d78fde6e3340c69c546ed73f4a710567a8c955d0cde3aa
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
Binary file
|
Binary file
|
@@ -1,4 +1,5 @@
|
|
1
1
|
//= require medium-editor
|
2
|
+
//= require_tree ./helpers
|
2
3
|
|
3
4
|
// when rails admin ready
|
4
5
|
$(document).on('rails_admin.dom_ready', function() {
|
@@ -31,6 +32,10 @@ $(document).on('rails_admin.dom_ready', function() {
|
|
31
32
|
addEventToInputFile($(this).attr('id'));
|
32
33
|
});
|
33
34
|
|
35
|
+
$('.cb-content-gallery').each(function() {
|
36
|
+
addEventToInputFileGallery($(this).attr('id'));
|
37
|
+
});
|
38
|
+
|
34
39
|
$('.cb-container').sortable({
|
35
40
|
revert: true,
|
36
41
|
placeholder: 'ui-sortable-placeholder',
|
@@ -131,6 +136,7 @@ $(document).on('click', '.cb-snippet__btn', function(e) {
|
|
131
136
|
scrollTo(id);
|
132
137
|
break;
|
133
138
|
|
139
|
+
// Image center
|
134
140
|
case '3':
|
135
141
|
var element = '<div id="'+ id + '" class="cb-content">';
|
136
142
|
|
@@ -341,169 +347,27 @@ $(document).on('click', '.cb-snippet__btn', function(e) {
|
|
341
347
|
scrollTo(id);
|
342
348
|
activeSortable();
|
343
349
|
break;
|
344
|
-
};
|
345
350
|
|
346
|
-
|
347
|
-
|
351
|
+
case '11':
|
352
|
+
var sections = [];
|
353
|
+
var element = '<div id="'+ id + '" class="cb-content-gallery">';
|
348
354
|
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
};
|
358
|
-
|
359
|
-
// scroll to
|
360
|
-
function scrollTo(id) {
|
361
|
-
if(id) {
|
362
|
-
$('html, body').animate({
|
363
|
-
scrollTop: $('#' + id).offset().top
|
364
|
-
}, 400);
|
365
|
-
}
|
366
|
-
};
|
367
|
-
|
368
|
-
// add event on input file
|
369
|
-
function addEventToInputFile(id) {
|
370
|
-
$('#' + id).on('change', fileSelectAndUpload);
|
371
|
-
};
|
372
|
-
|
373
|
-
// upload file via ajax
|
374
|
-
function fileSelectAndUpload(evt) {
|
375
|
-
console.log(evt);
|
376
|
-
var file = evt.target.files[0];
|
377
|
-
|
378
|
-
if(file) {
|
379
|
-
var formData = new FormData();
|
380
|
-
formData.append('content_builder_image', file);
|
381
|
-
|
382
|
-
$.ajax({
|
383
|
-
url: 'create_images',
|
384
|
-
data: formData,
|
385
|
-
cache: false,
|
386
|
-
contentType: false,
|
387
|
-
processData: false,
|
388
|
-
type: 'PUT',
|
389
|
-
beforeSend: function() {
|
390
|
-
$('#' + evt.target.id).find('figure').append('<div class="cb-loading"></div>');
|
391
|
-
$('.cb-tools--center').addClass('cb-tools--disabled');
|
392
|
-
},
|
393
|
-
complete: function(){
|
394
|
-
$('.cb-loading').remove();
|
395
|
-
$('.cb-tools--center').removeClass('cb-tools--disabled');
|
396
|
-
}
|
397
|
-
}).done(function(e) {
|
398
|
-
var p = evt.target.getAttribute('data-position');
|
399
|
-
$('#' + evt.target.id).find('img').attr('src', getImageOfPosition(p, e));
|
400
|
-
}).fail(function(e) {
|
401
|
-
alert('error: ' + e);
|
402
|
-
});
|
403
|
-
}
|
404
|
-
};
|
405
|
-
|
406
|
-
// get image of position
|
407
|
-
function getImageOfPosition(position, e) {
|
408
|
-
switch(position) {
|
409
|
-
case 'left':
|
410
|
-
case 'right':
|
411
|
-
return e.image.left_or_right.url;
|
412
|
-
break;
|
355
|
+
element += '<div class="cb-tools">';
|
356
|
+
element += '<a class="cb-tools__btn cb-tools__btn--move fa fa-arrows" href="#"></a>';
|
357
|
+
element += '<input id="'+ id +'" data-position="center" class="filePicker cb-tools__input cb-tools__input--upload" type="file" name="cb-image" multiple>';
|
358
|
+
element += '<a class="cb-tools__btn cb-tools__btn--upload fa fa-camera" href="#'+ id + '"></a>';
|
359
|
+
element += '<a class="cb-tools__btn cb-tools__btn--delete fa fa-trash" href="#'+ id + '"></a>';
|
360
|
+
element += '</div>';
|
361
|
+
element += '<div class="cb-gallery"></div>';
|
362
|
+
element += '</div>';
|
413
363
|
|
414
|
-
|
415
|
-
|
364
|
+
container.append(element);
|
365
|
+
addEventToInputFileGallery(id);
|
366
|
+
autocomplete(id);
|
367
|
+
scrollTo(id);
|
368
|
+
activeSortable();
|
416
369
|
break;
|
417
370
|
};
|
418
|
-
};
|
419
|
-
|
420
|
-
// generate random id
|
421
|
-
function generateID() {
|
422
|
-
return '_' + Math.random().toString(36).substr(2, 9);
|
423
|
-
};
|
424
|
-
|
425
|
-
// active medium editor plugin
|
426
|
-
function activeMediumEditor() {
|
427
|
-
var text = new MediumEditor('.cb-text', {
|
428
|
-
placeholder: {
|
429
|
-
text: '',
|
430
|
-
hideOnClick: true
|
431
|
-
},
|
432
|
-
|
433
|
-
toolbar: {
|
434
|
-
buttons: ['bold', 'italic', 'underline', 'anchor']
|
435
|
-
},
|
436
|
-
|
437
|
-
anchor: {
|
438
|
-
placeholderText: 'Ex: http://site.com'
|
439
|
-
},
|
440
|
-
|
441
|
-
anchorPreview: false,
|
442
|
-
|
443
|
-
paste: {
|
444
|
-
forcePlainText: true,
|
445
|
-
cleanPastedHTML: false,
|
446
|
-
cleanReplacements: [],
|
447
|
-
cleanAttrs: ['class', 'style', 'dir'],
|
448
|
-
cleanTags: ['meta'],
|
449
|
-
unwrapTags: []
|
450
|
-
}
|
451
|
-
});
|
452
|
-
|
453
|
-
var editable = new MediumEditor('.cb-editable', {
|
454
|
-
placeholder: false,
|
455
|
-
toolbar: false,
|
456
|
-
anchor: false,
|
457
|
-
anchorPreview: false,
|
458
|
-
|
459
|
-
paste: {
|
460
|
-
forcePlainText: true,
|
461
|
-
cleanPastedHTML: false,
|
462
|
-
cleanReplacements: [],
|
463
|
-
cleanAttrs: ['class', 'style', 'dir'],
|
464
|
-
cleanTags: ['meta'],
|
465
|
-
unwrapTags: []
|
466
|
-
}
|
467
|
-
});
|
468
|
-
};
|
469
|
-
|
470
|
-
// parse url by youtube using expression regular
|
471
|
-
function youtubeParser(url) {
|
472
|
-
var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/;
|
473
|
-
var match = url.match(regExp);
|
474
371
|
|
475
|
-
|
476
|
-
|
477
|
-
} else {
|
478
|
-
alert('<%= I18n.t('admin.actions.content_builder.invalid_url')%>');
|
479
|
-
}
|
480
|
-
};
|
481
|
-
|
482
|
-
function autocomplete(id) {
|
483
|
-
$('#' + id + ' input:text').autocomplete({
|
484
|
-
source: "search_content",
|
485
|
-
minLength: 5,
|
486
|
-
select: function(event, ui) {
|
487
|
-
section_id = generateID();
|
488
|
-
|
489
|
-
element = '<li id="'+ section_id +'" class="cb-relational__item">';
|
490
|
-
element += '<a href="/noticias/' + ui.item.content_builder_category.slug + '/' + ui.item.slug + '" class="cb-relational__link" target="blank"></a>';
|
491
|
-
element += '<h2 class="cb-relational__caption cb-editable">'+ ui.item.title +'</h2>';
|
492
|
-
element += '<div class="cb-tools">';
|
493
|
-
element += '<a class="cb-tools__btn cb-tools__btn--small cb-relational__btn--move fa fa-arrows" href="#"></a>';
|
494
|
-
element += '<a class="cb-tools__btn cb-tools__btn--small cb-tools__btn--delete fa fa-trash" href="#'+ section_id +'"></a>';
|
495
|
-
element += '</div>';
|
496
|
-
element += '</li>';
|
497
|
-
|
498
|
-
$("#" + id + ' ol').append(element);
|
499
|
-
activeMediumEditor();
|
500
|
-
activeSortable();
|
501
|
-
|
502
|
-
return false;
|
503
|
-
}
|
504
|
-
}).autocomplete("instance")._renderItem = function(ul, item) {
|
505
|
-
return $( "<li>" )
|
506
|
-
.append( "<a>" + item.title + "</a>" )
|
507
|
-
.appendTo( ul );
|
508
|
-
};
|
509
|
-
};
|
372
|
+
activeMediumEditor();
|
373
|
+
});
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// sortable to relational
|
2
|
+
function activeSortable() {
|
3
|
+
$('.cb-relational__list').sortable({
|
4
|
+
revert: true,
|
5
|
+
placeholder: 'ui-sortable-placeholder',
|
6
|
+
handle: '.cb-relational__btn--move',
|
7
|
+
cursor: 'move',
|
8
|
+
});
|
9
|
+
|
10
|
+
$('.cb-gallery').sortable({
|
11
|
+
revert: true,
|
12
|
+
placeholder: 'ui-sortable-placeholder--gallery',
|
13
|
+
handle: '.cb-gallery__btn--move',
|
14
|
+
cursor: 'move',
|
15
|
+
});
|
16
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
function autocomplete(id) {
|
2
|
+
$('#' + id + ' input:text').autocomplete({
|
3
|
+
source: "search_content",
|
4
|
+
minLength: 5,
|
5
|
+
select: function(event, ui) {
|
6
|
+
section_id = generateID();
|
7
|
+
|
8
|
+
element = '<li id="'+ section_id +'" class="cb-relational__item">';
|
9
|
+
element += '<a href="/noticias/' + ui.item.content_builder_category.slug + '/' + ui.item.slug + '" class="cb-relational__link" target="blank"></a>';
|
10
|
+
element += '<h2 class="cb-relational__caption cb-editable">'+ ui.item.title +'</h2>';
|
11
|
+
element += '<div class="cb-tools">';
|
12
|
+
element += '<a class="cb-tools__btn cb-tools__btn--small cb-relational__btn--move fa fa-arrows" href="#"></a>';
|
13
|
+
element += '<a class="cb-tools__btn cb-tools__btn--small cb-tools__btn--delete fa fa-trash" href="#'+ section_id +'"></a>';
|
14
|
+
element += '</div>';
|
15
|
+
element += '</li>';
|
16
|
+
|
17
|
+
$("#" + id + ' ol').append(element);
|
18
|
+
activeMediumEditor();
|
19
|
+
activeSortable();
|
20
|
+
|
21
|
+
return false;
|
22
|
+
}
|
23
|
+
}).autocomplete("instance")._renderItem = function(ul, item) {
|
24
|
+
return $( "<li>" )
|
25
|
+
.append( "<a>" + item.title + "</a>" )
|
26
|
+
.appendTo( ul );
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
// upload file via ajax
|
2
|
+
function fileSelectAndUpload(evt) {
|
3
|
+
//console.log(evt);
|
4
|
+
var file = evt.target.files[0];
|
5
|
+
|
6
|
+
if(file) {
|
7
|
+
var formData = new FormData();
|
8
|
+
formData.append('content_builder_image', file);
|
9
|
+
|
10
|
+
$.ajax({
|
11
|
+
url: 'create_images',
|
12
|
+
data: formData,
|
13
|
+
cache: false,
|
14
|
+
contentType: false,
|
15
|
+
processData: false,
|
16
|
+
type: 'PUT',
|
17
|
+
beforeSend: function() {
|
18
|
+
$('#' + evt.target.id).find('figure').append('<div class="cb-loading"></div>');
|
19
|
+
$('.cb-tools--center').addClass('cb-tools--disabled');
|
20
|
+
},
|
21
|
+
complete: function(){
|
22
|
+
$('.cb-loading').remove();
|
23
|
+
$('.cb-tools--center').removeClass('cb-tools--disabled');
|
24
|
+
}
|
25
|
+
}).done(function(e) {
|
26
|
+
var p = evt.target.getAttribute('data-position');
|
27
|
+
$('#' + evt.target.id).find('img').attr('src', getImageOfPosition(p, e));
|
28
|
+
}).fail(function(e) {
|
29
|
+
alert('error: ' + e);
|
30
|
+
});
|
31
|
+
}
|
32
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
// Upload Gallery
|
2
|
+
function fileSelectAndUploadGallery(evt) {
|
3
|
+
//console.log(evt);
|
4
|
+
var files = evt.target.files;
|
5
|
+
|
6
|
+
for (i = 0; i < files.length; ++i) {
|
7
|
+
var formData = new FormData();
|
8
|
+
formData.append('content_builder_image', files[i]);
|
9
|
+
|
10
|
+
$.ajax({
|
11
|
+
url: 'create_images',
|
12
|
+
data: formData,
|
13
|
+
cache: false,
|
14
|
+
contentType: false,
|
15
|
+
processData: false,
|
16
|
+
type: 'PUT',
|
17
|
+
beforeSend: function() {
|
18
|
+
$('#' + evt.target.id).find('figure').append('<div class="cb-loading"></div>');
|
19
|
+
$('.cb-tools--center').addClass('cb-tools--disabled');
|
20
|
+
},
|
21
|
+
complete: function(){
|
22
|
+
$('.cb-loading').remove();
|
23
|
+
$('.cb-tools--center').removeClass('cb-tools--disabled');
|
24
|
+
}
|
25
|
+
}).done(function(e) {
|
26
|
+
var p = evt.target.getAttribute('data-position');
|
27
|
+
id = generateID();
|
28
|
+
|
29
|
+
element = '<div class="cb-gallery__item" id="'+ id + '">';
|
30
|
+
element += '<div class="cb-tools cb-tools--center">';
|
31
|
+
element += '<a class="cb-tools__btn cb-gallery__btn--move fa fa-arrows" href="#"></a>';
|
32
|
+
element += '<a class="cb-tools__btn cb-tools__btn--delete fa fa-trash" href="#'+ id + '"></a>';
|
33
|
+
element += '</div>';
|
34
|
+
element += '<figure class="cb-gallery__figure">';
|
35
|
+
element += '<img class="cb-gallery__image" src="'+ getImageOfPosition(p, e) +'">';
|
36
|
+
element += '</figure>';
|
37
|
+
element += '</div>';
|
38
|
+
|
39
|
+
$('#' + evt.target.id + ' .cb-gallery').append(element);
|
40
|
+
}).fail(function(e) {
|
41
|
+
alert('error: ' + e);
|
42
|
+
});
|
43
|
+
}
|
44
|
+
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
// active medium editor plugin
|
2
|
+
function activeMediumEditor() {
|
3
|
+
var text = new MediumEditor('.cb-text', {
|
4
|
+
placeholder: {
|
5
|
+
text: '',
|
6
|
+
hideOnClick: true
|
7
|
+
},
|
8
|
+
|
9
|
+
toolbar: {
|
10
|
+
buttons: ['bold', 'italic', 'underline', 'anchor']
|
11
|
+
},
|
12
|
+
|
13
|
+
anchor: {
|
14
|
+
placeholderText: 'Ex: http://site.com'
|
15
|
+
},
|
16
|
+
|
17
|
+
anchorPreview: false,
|
18
|
+
|
19
|
+
paste: {
|
20
|
+
forcePlainText: true,
|
21
|
+
cleanPastedHTML: false,
|
22
|
+
cleanReplacements: [],
|
23
|
+
cleanAttrs: ['class', 'style', 'dir'],
|
24
|
+
cleanTags: ['meta'],
|
25
|
+
unwrapTags: []
|
26
|
+
}
|
27
|
+
});
|
28
|
+
|
29
|
+
var editable = new MediumEditor('.cb-editable', {
|
30
|
+
placeholder: false,
|
31
|
+
toolbar: false,
|
32
|
+
anchor: false,
|
33
|
+
anchorPreview: false,
|
34
|
+
|
35
|
+
paste: {
|
36
|
+
forcePlainText: true,
|
37
|
+
cleanPastedHTML: false,
|
38
|
+
cleanReplacements: [],
|
39
|
+
cleanAttrs: ['class', 'style', 'dir'],
|
40
|
+
cleanTags: ['meta'],
|
41
|
+
unwrapTags: []
|
42
|
+
}
|
43
|
+
});
|
44
|
+
}
|