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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/.rubocop.yml +4 -0
  4. data/.travis.yml +1 -1
  5. data/Gemfile +1 -0
  6. data/app/assets/images/cb-snippet-gallery.jpg +0 -0
  7. data/app/assets/images/cb-snippet-gallery.psd +0 -0
  8. data/app/assets/javascripts/rails_admin/content_builder.js.erb +24 -160
  9. data/app/assets/javascripts/rails_admin/helpers/action_sortable.js +16 -0
  10. data/app/assets/javascripts/rails_admin/helpers/add_event_to_input.js +9 -0
  11. data/app/assets/javascripts/rails_admin/helpers/autocomplete.js.erb +28 -0
  12. data/app/assets/javascripts/rails_admin/helpers/file_select_and_upload.js +32 -0
  13. data/app/assets/javascripts/rails_admin/helpers/file_select_and_upload_gallery.js +44 -0
  14. data/app/assets/javascripts/rails_admin/helpers/generate_id.js +4 -0
  15. data/app/assets/javascripts/rails_admin/helpers/get_image_of_position.js +11 -0
  16. data/app/assets/javascripts/rails_admin/helpers/medium_editor.js +44 -0
  17. data/app/assets/javascripts/rails_admin/helpers/scrool_to.js +8 -0
  18. data/app/assets/javascripts/rails_admin/helpers/youtube_parse.js.erb +11 -0
  19. data/app/assets/stylesheets/rails_admin/content_builder.scss +50 -11
  20. data/app/models/application_record.rb +3 -0
  21. data/app/models/rails_admin_content_builder/content_builder.rb +1 -1
  22. data/app/models/rails_admin_content_builder/content_builder_category.rb +1 -1
  23. data/app/models/rails_admin_content_builder/content_builder_image.rb +1 -1
  24. data/app/views/rails_admin/main/content_builder.html.erb +7 -0
  25. data/config/initializers/assets.rb +1 -0
  26. data/lib/rails_admin_content_builder/version.rb +1 -1
  27. data/rails_admin_content_builder.gemspec +1 -1
  28. data/spec/controllers/rails_admin_content_builder/content_builder_controller_spec.rb +4 -4
  29. data/spec/dummy/config/environments/test.rb +5 -2
  30. data/vendor/assets/stylesheets/rails_admin_content_builder.scss +21 -0
  31. metadata +2891 -1244
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b8807dab26acdebbc3f803f7afe6cce394b0e91
4
- data.tar.gz: e495f7434ef80f16f04777e0024d29494d4f2751
3
+ metadata.gz: 776c8a0206f2d80bc094bcdd7134c2b7d1b8a5ac
4
+ data.tar.gz: f5a0ff75e09b027ea2e05de7772ceaaef45c878e
5
5
  SHA512:
6
- metadata.gz: d385a37e29d2eceebc6b690cd2274ab7c432f505c218788ca8f055db9411f801e9c7fc737080e35b9b282596030580aaecbf46daa2369b196f93a50a20f65360
7
- data.tar.gz: e732886db34b0567976632e06c5c655bdf588da3c591c5d8582d2b27f550c5db182e38de64d1a9bd944dd755bac18c8170b9199d62c622c61bea7c08d7ece8d5
6
+ metadata.gz: 8bcba40b02306b6f0c2c2be22ef4dd2952360c4a65ef62adba260c67898d84baa39c775a2461f562d691db0e6fbd5e2eb3beb9fe51677b38fce77c265f935ae8
7
+ data.tar.gz: 08354717581d79535c2b4d865abd6819c9ce043a8e2bac29ccebed95c56efd7e85e730f4f74404cb31d78fde6e3340c69c546ed73f4a710567a8c955d0cde3aa
data/.gitignore CHANGED
@@ -13,4 +13,5 @@
13
13
  spec/dummy/log/*.log
14
14
  spec/dummy/db/test.sqlite3
15
15
  *.gem
16
- /spec/dummy/public/uploads/
16
+ /spec/dummy/public/uploads/*
17
+ .DS_Store*
@@ -2,9 +2,13 @@ AllCops:
2
2
  Exclude:
3
3
  - 'spec/dummy/**/*'
4
4
  - 'vendor/bundle/**/*'
5
+ - 'app/models/application_record.rb'
5
6
 
6
7
  Style/FrozenStringLiteralComment:
7
8
  Enabled: false
8
9
 
9
10
  Documentation:
10
11
  Enabled: false
12
+
13
+ inherit_gem:
14
+ rubocop-github: config/default.yml
@@ -1,6 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.1
3
+ - 2.3.0
4
4
  before_install: gem install bundler -v 1.11.2
5
5
  notifications:
6
6
  email:
data/Gemfile CHANGED
@@ -6,6 +6,7 @@ group :development, :test do
6
6
  gem 'sqlite3'
7
7
  gem 'friendly_id'
8
8
  gem 'rails_admin'
9
+ gem 'rubocop-github'
9
10
  gem 'fuubar'
10
11
  gem 'coveralls', require: false
11
12
  gem 'rubocop'
@@ -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
- activeMediumEditor();
347
- });
351
+ case '11':
352
+ var sections = [];
353
+ var element = '<div id="'+ id + '" class="cb-content-gallery">';
348
354
 
349
- // sortable to relational
350
- function activeSortable() {
351
- $('.cb-relational__list').sortable({
352
- revert: true,
353
- placeholder: 'ui-sortable-placeholder',
354
- handle: '.cb-relational__btn--move',
355
- cursor: 'move',
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
- case 'center':
415
- return e.image.center.url;
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
- if(match && match[7].length == 11) {
476
- return b = match[7];
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,9 @@
1
+ // add event on input file
2
+ function addEventToInputFile(id) {
3
+ $('#' + id).on('change', fileSelectAndUpload);
4
+ }
5
+
6
+ // add event on input file
7
+ function addEventToInputFileGallery(id) {
8
+ $('#' + id).on('change', fileSelectAndUploadGallery);
9
+ }
@@ -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,4 @@
1
+ // generate random id
2
+ function generateID() {
3
+ return '_' + Math.random().toString(36).substr(2, 9);
4
+ }
@@ -0,0 +1,11 @@
1
+ // get image of position
2
+ function getImageOfPosition(position, e) {
3
+ switch(position) {
4
+ case 'left':
5
+ case 'right':
6
+ return e.image.left_or_right.url;
7
+
8
+ case 'center':
9
+ return e.image.center.url;
10
+ }
11
+ }
@@ -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
+ }