rails_admin_content_builder 1.0.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|