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.
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
+ }