comfortable_media_surfer 3.0.0 → 3.1.2

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 (131) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.github/dependabot.yml +7 -0
  4. data/.github/workflows/coveralls.yml +13 -1
  5. data/.github/workflows/rubyonrails.yml +15 -3
  6. data/.gitignore +4 -0
  7. data/.rubocop.yml +4 -1
  8. data/CHANGELOG.md +86 -0
  9. data/CONTRIBUTING.md +5 -2
  10. data/Gemfile +10 -6
  11. data/README.md +64 -27
  12. data/app/assets/builds/.keep +0 -0
  13. data/app/assets/config/manifest.js +1 -0
  14. data/app/assets/javascripts/comfy/admin/cms/application.js +21 -36
  15. data/app/assets/javascripts/comfy/admin/cms/base.js +6 -5
  16. data/app/assets/javascripts/comfy/admin/cms/codemirror.js +22 -10
  17. data/app/assets/javascripts/comfy/admin/cms/diff.js +7 -5
  18. data/app/assets/javascripts/comfy/admin/cms/file_link.js +17 -11
  19. data/app/assets/javascripts/comfy/admin/cms/file_upload.js +67 -41
  20. data/app/assets/javascripts/comfy/admin/cms/files_modal.js +20 -13
  21. data/app/assets/javascripts/comfy/admin/cms/sortable_list.js +28 -19
  22. data/app/assets/javascripts/comfy/admin/cms/timepicker.js +20 -12
  23. data/app/assets/javascripts/comfy/admin/cms/wysiwyg.js +39 -20
  24. data/app/assets/javascripts/comfy/vendor/diff/pretty_text_diff.js +30 -18
  25. data/app/assets/javascripts/comfy/vendor/redactor/definedlinks.js +31 -34
  26. data/app/assets/javascripts/comfy/vendor/redactor/filemanager.js +77 -62
  27. data/app/assets/javascripts/comfy/vendor/redactor/i18n/hr.js +78 -76
  28. data/app/assets/javascripts/comfy/vendor/redactor/i18n/nb.js +76 -74
  29. data/app/assets/javascripts/comfy/vendor/redactor/i18n/pl.js +77 -75
  30. data/app/assets/javascripts/comfy/vendor/redactor/imagemanager.js +66 -55
  31. data/app/assets/javascripts/comfy/vendor/redactor/table.js +346 -335
  32. data/app/assets/javascripts/comfy/vendor/redactor/video.js +69 -64
  33. data/app/assets/javascripts/comfy/vendor/redactor.js +2 -0
  34. data/app/assets/stylesheets/comfy/admin/cms/application.sass +2 -2
  35. data/app/assets/stylesheets/comfy/admin/cms/codemirror_overrides.sass +1 -1
  36. data/app/helpers/comfy/admin/cms_helper.rb +2 -2
  37. data/app/views/comfy/admin/cms/pages/toggle_branch.js.erb +14 -8
  38. data/comfortable_media_surfer.gemspec +8 -9
  39. data/config/application.rb +4 -1
  40. data/config/environments/development.rb +11 -10
  41. data/config/environments/production.rb +0 -6
  42. data/config/puma.rb +43 -0
  43. data/db/migrate/01_create_cms.rb +0 -1
  44. data/db/migrate/02_add_markdown_to_snippets.rb +5 -0
  45. data/gemfiles/7.1.gemfile +3 -2
  46. data/gemfiles/7.2.gemfile +3 -2
  47. data/gemfiles/{6.1.gemfile → 8.0.gemfile} +3 -2
  48. data/lib/comfortable_media_surfer/content/tags/audio.rb +1 -1
  49. data/lib/comfortable_media_surfer/content/tags/breadcrumbs.rb +1 -1
  50. data/lib/comfortable_media_surfer/content/tags/children.rb +1 -1
  51. data/lib/comfortable_media_surfer/content/tags/siblings.rb +1 -1
  52. data/lib/comfortable_media_surfer/engine.rb +3 -8
  53. data/lib/comfortable_media_surfer/extensions/has_revisions.rb +1 -1
  54. data/lib/comfortable_media_surfer/render_methods.rb +7 -7
  55. data/lib/comfortable_media_surfer/version.rb +1 -1
  56. data/lib/generators/comfy/cms/README +2 -9
  57. data/lib/generators/comfy/cms/cms_generator.rb +9 -7
  58. data/lib/generators/comfy/scaffold/scaffold_generator.rb +1 -1
  59. data/lib/tasks/cms_assets.rake +19 -0
  60. data/package-lock.json +379 -0
  61. data/package.json +23 -0
  62. data/rakelib/create_release.rake +17 -17
  63. metadata +24 -146
  64. data/app/assets/javascripts/comfy/vendor/Moxie.swf +0 -0
  65. data/app/assets/javascripts/comfy/vendor/Moxie.xap +0 -0
  66. data/app/assets/javascripts/comfy/vendor/bootstrap.bundle.min.js +0 -7
  67. data/app/assets/javascripts/comfy/vendor/bootstrap.bundle.min.js.map +0 -1
  68. data/app/assets/javascripts/comfy/vendor/codemirror/addon/edit/closetag.js +0 -169
  69. data/app/assets/javascripts/comfy/vendor/codemirror/mode/css/css.js +0 -832
  70. data/app/assets/javascripts/comfy/vendor/codemirror/mode/htmlmixed/htmlmixed.js +0 -152
  71. data/app/assets/javascripts/comfy/vendor/codemirror/mode/javascript/javascript.js +0 -875
  72. data/app/assets/javascripts/comfy/vendor/codemirror/mode/markdown/markdown.js +0 -861
  73. data/app/assets/javascripts/comfy/vendor/codemirror/mode/xml/xml.js +0 -394
  74. data/app/assets/javascripts/comfy/vendor/codemirror.js +0 -9653
  75. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ar.js +0 -52
  76. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/bg.js +0 -65
  77. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/bn.js +0 -65
  78. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ca.js +0 -83
  79. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/cs.js +0 -70
  80. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/cy.js +0 -92
  81. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/da.js +0 -71
  82. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/de.js +0 -70
  83. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/default.js +0 -80
  84. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/eo.js +0 -73
  85. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/es.js +0 -69
  86. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/et.js +0 -73
  87. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/fa.js +0 -68
  88. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/fi.js +0 -69
  89. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/fr.js +0 -75
  90. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/gr.js +0 -74
  91. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/he.js +0 -57
  92. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/hi.js +0 -65
  93. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/hr.js +0 -66
  94. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/hu.js +0 -72
  95. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/id.js +0 -61
  96. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/it.js +0 -70
  97. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ja.js +0 -57
  98. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ko.js +0 -60
  99. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/lt.js +0 -72
  100. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/lv.js +0 -67
  101. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/mk.js +0 -69
  102. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/mn.js +0 -67
  103. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ms.js +0 -68
  104. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/my.js +0 -69
  105. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/nl.js +0 -75
  106. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/no.js +0 -73
  107. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/pa.js +0 -65
  108. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/pl.js +0 -68
  109. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/pt-BR.js +0 -66
  110. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/pt.js +0 -66
  111. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ro.js +0 -69
  112. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ru.js +0 -66
  113. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/si.js +0 -65
  114. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sk.js +0 -70
  115. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sl.js +0 -70
  116. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sq.js +0 -65
  117. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sr.js +0 -69
  118. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sv.js +0 -70
  119. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/th.js +0 -72
  120. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/tr.js +0 -66
  121. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/uk.js +0 -66
  122. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/vn.js +0 -66
  123. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/zh-CN.js +0 -61
  124. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/zh-TW.js +0 -61
  125. data/app/assets/javascripts/comfy/vendor/moxie.min.js +0 -16
  126. data/app/assets/javascripts/comfy/vendor/plupload.dev.js +0 -2497
  127. data/app/assets/javascripts/comfy/vendor/sortable.min.js +0 -5
  128. data/app/assets/stylesheets/comfy/vendor/codemirror.css +0 -346
  129. data/app/assets/stylesheets/comfy/vendor/flatpickr.min.css +0 -13
  130. data/config/initializers/assets.rb +0 -14
  131. data/gemfiles/7.0.gemfile +0 -31
@@ -1,77 +1,82 @@
1
- if (!RedactorPlugins) var RedactorPlugins = {};
2
-
3
- (function($)
4
- {
5
- RedactorPlugins.video = function()
6
- {
7
- return {
8
- reUrlYoutube: /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com\S*[^\w\-\s])([\w\-]{11})(?=[^\w\-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/ig,
9
- reUrlVimeo: /https?:\/\/(www\.)?vimeo.com\/(\d+)($|\/)/,
10
- getTemplate: function()
11
- {
12
- return String()
13
- + '<section id="redactor-modal-video-insert">'
14
- + '<label>' + this.lang.get('video_html_code') + '</label>'
15
- + '<textarea id="redactor-insert-video-area" style="height: 160px;"></textarea>'
16
- + '</section>';
17
- },
18
- init: function()
19
- {
20
- var button = this.button.addAfter('image', 'video', this.lang.get('video'));
21
- this.button.addCallback(button, this.video.show);
22
- },
23
- show: function()
24
- {
25
- this.modal.addTemplate('video', this.video.getTemplate());
1
+ import jQuery from "jquery";
26
2
 
27
- this.modal.load('video', this.lang.get('video'), 700);
28
- this.modal.createCancelButton();
3
+ if (!RedactorPlugins) var RedactorPlugins = {};
29
4
 
30
- var button = this.modal.createActionButton(this.lang.get('insert'));
31
- button.on('click', this.video.insert);
5
+ (function ($) {
6
+ RedactorPlugins.video = function () {
7
+ return {
8
+ reUrlYoutube:
9
+ /https?:\/\/(?:[0-9A-Z-]+\.)?(?:youtu\.be\/|youtube\.com\S*[^\w\-\s])([\w\-]{11})(?=[^\w\-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|<\/a>))[?=&+%\w.-]*/gi,
10
+ reUrlVimeo: /https?:\/\/(www\.)?vimeo.com\/(\d+)($|\/)/,
11
+ getTemplate: function () {
12
+ return (
13
+ String() +
14
+ '<section id="redactor-modal-video-insert">' +
15
+ "<label>" +
16
+ this.lang.get("video_html_code") +
17
+ "</label>" +
18
+ '<textarea id="redactor-insert-video-area" style="height: 160px;"></textarea>' +
19
+ "</section>"
20
+ );
21
+ },
22
+ init: function () {
23
+ var button = this.button.addAfter(
24
+ "image",
25
+ "video",
26
+ this.lang.get("video")
27
+ );
28
+ this.button.addCallback(button, this.video.show);
29
+ },
30
+ show: function () {
31
+ this.modal.addTemplate("video", this.video.getTemplate());
32
32
 
33
- this.selection.save();
34
- this.modal.show();
33
+ this.modal.load("video", this.lang.get("video"), 700);
34
+ this.modal.createCancelButton();
35
35
 
36
- $('#redactor-insert-video-area').focus();
36
+ var button = this.modal.createActionButton(this.lang.get("insert"));
37
+ button.on("click", this.video.insert);
37
38
 
38
- },
39
- insert: function()
40
- {
41
- var data = $('#redactor-insert-video-area').val();
39
+ this.selection.save();
40
+ this.modal.show();
42
41
 
43
- if (!data.match(/<iframe|<video/gi))
44
- {
45
- data = this.clean.stripTags(data);
42
+ $("#redactor-insert-video-area").focus();
43
+ },
44
+ insert: function () {
45
+ var data = $("#redactor-insert-video-area").val();
46
46
 
47
- // parse if it is link on youtube & vimeo
48
- var iframeStart = '<iframe style="width: 500px; height: 281px;" src="',
49
- iframeEnd = '" frameborder="0" allowfullscreen></iframe>';
47
+ if (!data.match(/<iframe|<video/gi)) {
48
+ data = this.clean.stripTags(data);
50
49
 
51
- if (data.match(this.video.reUrlYoutube))
52
- {
53
- data = data.replace(this.video.reUrlYoutube, iframeStart + '//www.youtube.com/embed/$1' + iframeEnd);
54
- }
55
- else if (data.match(this.video.reUrlVimeo))
56
- {
57
- data = data.replace(this.video.reUrlVimeo, iframeStart + '//player.vimeo.com/video/$2' + iframeEnd);
58
- }
59
- }
50
+ // parse if it is link on youtube & vimeo
51
+ var iframeStart =
52
+ '<iframe style="width: 500px; height: 281px;" src="',
53
+ iframeEnd = '" frameborder="0" allowfullscreen></iframe>';
60
54
 
61
- this.selection.restore();
62
- this.modal.close();
55
+ if (data.match(this.video.reUrlYoutube)) {
56
+ data = data.replace(
57
+ this.video.reUrlYoutube,
58
+ iframeStart + "//www.youtube.com/embed/$1" + iframeEnd
59
+ );
60
+ } else if (data.match(this.video.reUrlVimeo)) {
61
+ data = data.replace(
62
+ this.video.reUrlVimeo,
63
+ iframeStart + "//player.vimeo.com/video/$2" + iframeEnd
64
+ );
65
+ }
66
+ }
63
67
 
64
- var current = this.selection.getBlock() || this.selection.getCurrent();
68
+ this.selection.restore();
69
+ this.modal.close();
65
70
 
66
- if (current) $(current).after(data);
67
- else
68
- {
69
- this.insert.html(data);
70
- }
71
+ var current = this.selection.getBlock() || this.selection.getCurrent();
71
72
 
72
- this.code.sync();
73
- }
73
+ if (current) $(current).after(data);
74
+ else {
75
+ this.insert.html(data);
76
+ }
74
77
 
75
- };
76
- };
77
- })(jQuery);
78
+ this.code.sync();
79
+ },
80
+ };
81
+ };
82
+ })(jQuery);
@@ -13,6 +13,8 @@
13
13
  fixes and tweaks annotated with "COMFY FIX"
14
14
  */
15
15
 
16
+ import jQuery from 'jquery';
17
+
16
18
  (function($)
17
19
  {
18
20
 
@@ -1,9 +1,9 @@
1
1
  @import "comfy/vendor/bootstrap/bootstrap"
2
2
 
3
- @import "comfy/vendor/codemirror"
3
+ @import "codemirror/lib/codemirror"
4
4
  @import "comfy/vendor/fontawesome"
5
5
  @import "comfy/vendor/redactor"
6
- @import "comfy/vendor/flatpickr.min"
6
+ @import "flatpickr/dist/flatpickr.min"
7
7
 
8
8
  @import "comfy/admin/cms/codemirror_overrides"
9
9
  @import "comfy/admin/cms/redactor_overrides"
@@ -15,5 +15,5 @@ body#comfy
15
15
  .CodeMirror-focused
16
16
  border-color: rgba(82, 168, 236, 0.8)
17
17
  outline: 0
18
- outline: thin dotted \9
18
+ outline: "thin dotted \9"
19
19
  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6)
@@ -4,11 +4,11 @@ module Comfy
4
4
  module Admin
5
5
  module CmsHelper
6
6
  # Wrapper around Comfy::FormBuilder
7
- def comfy_form_with(**options, &block)
7
+ def comfy_form_with(**options, &)
8
8
  form_options = options.merge(builder: ComfortableMediaSurfer::FormBuilder)
9
9
  form_options[:bootstrap] = { layout: :horizontal }
10
10
  form_options[:local] = true
11
- bootstrap_form_with(**form_options, &block)
11
+ bootstrap_form_with(**form_options, &)
12
12
  end
13
13
 
14
14
  def comfy_admin_partial(path, params = {})
@@ -1,13 +1,19 @@
1
1
  // TODO: Extract this so the server only renders the HTML.
2
- var li = $('li#comfy_cms_page_<%=@page.id%>');
3
- li.find('.item .toggle').first().toggleClass('open');
4
-
2
+ var li = document.querySelector('li#comfy_cms_page_<%=@page.id%>');
3
+ var toggle = li.querySelector('.item .toggle');
4
+ toggle.classList.toggle('open');
5
5
  <% if session[:cms_page_tree].member?(@page.id.to_s) %>
6
- if(!li.find('ul.children')[0]) {
7
- li.append('<ul class="children sortable pl-md-3"><%= escape_javascript(render partial: "index_branch", collection: @page.children) %></ul>');
8
- CMS.sortableList.dispose();
9
- CMS.sortableList.init();
6
+ if(!li.querySelector('ul.children')) {
7
+ var childrenList = document.createElement('ul');
8
+ childrenList.className = 'children sortable pl-md-3';
9
+ childrenList.innerHTML = '<%= escape_javascript(render partial: "index_branch", collection: @page.children) %>';
10
+ li.appendChild(childrenList);
11
+ CMS.sortableList.dispose();
12
+ CMS.sortableList.init();
10
13
  }
11
14
  <% else %>
12
- li.find('ul.children').remove();
15
+ var childrenList = li.querySelector('ul.children');
16
+ if (childrenList) {
17
+ childrenList.remove();
18
+ }
13
19
  <% end %>
@@ -9,29 +9,28 @@ Gem::Specification.new do |spec|
9
9
  spec.authors = ['Oleg Khabarov', 'Andrew vonderLuft', 'ShakaCode']
10
10
  spec.email = ['justin@shakacode.com']
11
11
  spec.homepage = 'https://github.com/shakacode/comfortable-media-surfer'
12
- spec.summary = 'Rails 6.1-7.1+ CMS Engine'
13
- spec.description = 'ComfortableMediaSurfer is a powerful Rails 6.1-7.1+ CMS Engine'
12
+ spec.summary = 'Rails 7.0+ CMS Engine'
13
+ spec.description = 'ComfortableMediaSurfer is a powerful Rails 7.0+ CMS Engine'
14
14
  spec.license = 'MIT'
15
15
 
16
+ spec.post_install_message = 'Please run rake comfy:compile_assets to compile assets.'
17
+
16
18
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
19
  f.match(%r{^(test|doc)/})
18
20
  end
19
21
 
20
- spec.required_ruby_version = '>= 3.0.0'
22
+ spec.required_ruby_version = '>= 3.2.0'
21
23
  spec.metadata['rubygems_mfa_required'] = 'true'
22
24
 
23
25
  spec.add_dependency 'active_link_to', '~> 1.0', '>= 1.0.5'
24
26
  spec.add_dependency 'comfy_bootstrap_form', '~> 4.0', '>= 4.0.0'
25
27
  spec.add_dependency 'haml-rails', '~> 2.1', '>= 2.1.0'
26
28
  spec.add_dependency 'image_processing', '~> 1.2', '>= 1.12.2'
27
- spec.add_dependency 'jquery-rails', '~> 4.6', '>= 4.6.0'
28
29
  spec.add_dependency 'kaminari', '~> 1.2', '>= 1.2.2'
29
30
  spec.add_dependency 'kramdown', '~> 2.4', '>= 2.4.0'
30
31
  spec.add_dependency 'mimemagic', '~> 0.4', '>= 0.4.3'
31
- spec.add_dependency 'mini_magick', '~> 4.12', '>= 4.12.0'
32
- spec.add_dependency 'rails', '>= 6.1.0'
32
+ spec.add_dependency 'mini_magick', '>= 4.12', '< 6.0'
33
+ spec.add_dependency 'rails', '>= 7.0.0'
33
34
  spec.add_dependency 'rails-i18n', '>= 6.0.0'
34
- spec.add_dependency 'sassc-rails', '~> 2.1', '>= 2.1.2'
35
- spec.add_dependency 'sprockets-rails', '~> 3.4', '>= 3.4.2'
36
- spec.add_development_dependency "gem-release"
35
+ spec.add_dependency 'sassc-rails', '>= 2.1.2'
37
36
  end
@@ -10,6 +10,9 @@ Bundler.require(*Rails.groups)
10
10
 
11
11
  module ComfortableMediaSurfer
12
12
  class Application < Rails::Application
13
+ # Ensuring that ActiveStorage routes are loaded before Comfy's globbing
14
+ # route. Without this file serving routes are inaccessible.
15
+ config.railties_order = [ActiveStorage::Engine, :main_app, :all]
13
16
  # Load defaults based on Rails major/minor version
14
17
  config.load_defaults Rails.version.scan(%r{^\d+\.\d+}).first.to_f
15
18
 
@@ -17,7 +20,7 @@ module ComfortableMediaSurfer
17
20
  if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1.0')
18
21
  config.active_record.default_column_serializer = YAML
19
22
  config.active_record.before_committed_on_all_records = false
20
- config.active_record.commit_transaction_on_non_local_return = false
23
+ # config.active_record.commit_transaction_on_non_local_return = false # deprecated in Rails 8
21
24
  config.active_record.run_after_transaction_callbacks_in_order_defined = false
22
25
  config.active_support.message_serializer = :json
23
26
  config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction = true
@@ -16,22 +16,19 @@ defined?(ComfortableMediaSurfer::Application) && ComfortableMediaSurfer::Applica
16
16
  # Show full error reports.
17
17
  config.consider_all_requests_local = true
18
18
 
19
- # Enable server timing
19
+ # Enable server timing.
20
20
  config.server_timing = true
21
21
 
22
- # Enable/disable caching. By default caching is disabled.
23
- # Run rails dev:cache to toggle caching.
22
+ # Enable/disable Action Controller caching. By default Action Controller caching is disabled.
23
+ # Run rails dev:cache to toggle Action Controller caching.
24
24
  if Rails.root.join('tmp/caching-dev.txt').exist?
25
25
  config.action_controller.perform_caching = true
26
26
  config.action_controller.enable_fragment_cache_logging = true
27
27
 
28
28
  config.cache_store = :memory_store
29
- config.public_file_server.headers = {
30
- 'Cache-Control' => "public, max-age=#{2.days.to_i}"
31
- }
29
+ config.public_file_server.headers = { 'cache-control' => "public, max-age=#{2.days.to_i}" }
32
30
  else
33
31
  config.action_controller.perform_caching = false
34
-
35
32
  config.cache_store = :null_store
36
33
  end
37
34
 
@@ -41,8 +38,12 @@ defined?(ComfortableMediaSurfer::Application) && ComfortableMediaSurfer::Applica
41
38
  # Don't care if the mailer can't send.
42
39
  config.action_mailer.raise_delivery_errors = false
43
40
 
41
+ # Make template changes take effect immediately.
44
42
  config.action_mailer.perform_caching = false
45
43
 
44
+ # Set localhost to be used by links generated in mailer templates.
45
+ config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
46
+
46
47
  # Print deprecation notices to the Rails logger.
47
48
  config.active_support.deprecation = :log
48
49
 
@@ -61,9 +62,6 @@ defined?(ComfortableMediaSurfer::Application) && ComfortableMediaSurfer::Applica
61
62
  # Highlight code that enqueued background job in logs.
62
63
  config.active_job.verbose_enqueue_logs = true
63
64
 
64
- # Suppress logger output for asset requests.
65
- config.assets.quiet = true
66
-
67
65
  # Raises error for missing translations.
68
66
  # config.i18n.raise_on_missing_translations = true
69
67
 
@@ -77,4 +75,7 @@ defined?(ComfortableMediaSurfer::Application) && ComfortableMediaSurfer::Applica
77
75
  # Raise error when a before_action's only/except options reference missing actions
78
76
  config.action_controller.raise_on_missing_callback_actions = true
79
77
  end
78
+
79
+ # Apply autocorrection by RuboCop to files generated by `bin/rails generate`.
80
+ # config.generators.apply_rubocop_autocorrect_after_generate!
80
81
  end
@@ -25,12 +25,6 @@ defined?(ComfortableMediaSurfer::Application) && ComfortableMediaSurfer::Applica
25
25
  # Enable static file serving from the `/public` folder (turn off if using NGINX/Apache for it).
26
26
  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
27
27
 
28
- # Compress CSS using a preprocessor.
29
- # config.assets.css_compressor = :sass
30
-
31
- # Do not fallback to assets pipeline if a precompiled asset is missed.
32
- config.assets.compile = false
33
-
34
28
  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
35
29
  # config.asset_host = "http://assets.example.com"
36
30
 
data/config/puma.rb ADDED
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This configuration file will be evaluated by Puma. The top-level methods that
4
+ # are invoked here are part of Puma's configuration DSL. For more information
5
+ # about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html.
6
+ #
7
+ # Puma starts a configurable number of processes (workers) and each process
8
+ # serves each request in a thread from an internal thread pool.
9
+ #
10
+ # You can control the number of workers using ENV["WEB_CONCURRENCY"]. You
11
+ # should only set this value when you want to run 2 or more workers. The
12
+ # default is already 1.
13
+ #
14
+ # The ideal number of threads per worker depends both on how much time the
15
+ # application spends waiting for IO operations and on how much you wish to
16
+ # prioritize throughput over latency.
17
+ #
18
+ # As a rule of thumb, increasing the number of threads will increase how much
19
+ # traffic a given process can handle (throughput), but due to CRuby's
20
+ # Global VM Lock (GVL) it has diminishing returns and will degrade the
21
+ # response time (latency) of the application.
22
+ #
23
+ # The default is set to 3 threads as it's deemed a decent compromise between
24
+ # throughput and latency for the average Rails application.
25
+ #
26
+ # Any libraries that use a connection pool or another resource pool should
27
+ # be configured to provide at least as many connections as the number of
28
+ # threads. This includes Active Record's `pool` parameter in `database.yml`.
29
+ threads_count = ENV.fetch('RAILS_MAX_THREADS', 3)
30
+ threads threads_count, threads_count
31
+
32
+ # Specifies the `port` that Puma will listen on to receive requests; default is 3000.
33
+ port ENV.fetch('PORT', 3000)
34
+
35
+ # Allow puma to be restarted by `bin/rails restart` command.
36
+ plugin :tmp_restart
37
+
38
+ # Run the Solid Queue supervisor inside of Puma for single-server deployments
39
+ plugin :solid_queue if ENV['SOLID_QUEUE_IN_PUMA']
40
+
41
+ # Specify the PID file. Defaults to tmp/pids/server.pid in development.
42
+ # In other environments, only set the PID file if requested.
43
+ pidfile ENV['PIDFILE'] if ENV['PIDFILE']
@@ -88,7 +88,6 @@ class CreateCms < ActiveRecord::Migration[5.2]
88
88
  t.integer :site_id, null: false
89
89
  t.string :label, null: false
90
90
  t.string :identifier, null: false
91
- t.boolean :markdown
92
91
  t.text :content, limit: LIMIT
93
92
  t.integer :position, null: false, default: 0
94
93
  t.timestamps
@@ -0,0 +1,5 @@
1
+ class AddMarkdownToSnippets < ActiveRecord::Migration[7.1]
2
+ def change
3
+ add_column :comfy_cms_snippets, :markdown, :boolean, default: false
4
+ end
5
+ end
data/gemfiles/7.1.gemfile CHANGED
@@ -5,13 +5,14 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
5
5
 
6
6
  gemspec path: '../'
7
7
 
8
- gem 'rails', '~> 7.1.0', '>= 7.1.1'
8
+ gem 'rails', '~> 7.1.0', '>= 7.1.5.1'
9
9
 
10
10
  group :development, :test do
11
11
  gem 'autoprefixer-rails', '~> 10.4.16.0'
12
12
  gem 'byebug', '~> 11.1.0', platforms: %i[mri mingw x64_mingw]
13
13
  gem 'image_processing', '>= 1.12.0'
14
- gem 'sqlite3', '~> 1.6.7'
14
+ gem 'propshaft', '~> 1.1.0'
15
+ gem 'sqlite3', '>= 2.1'
15
16
  end
16
17
 
17
18
  group :test do
data/gemfiles/7.2.gemfile CHANGED
@@ -5,13 +5,14 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
5
5
 
6
6
  gemspec path: '../'
7
7
 
8
- gem 'rails', '~> 7.2.0', '>= 7.2.2'
8
+ gem 'rails', '~> 7.2.0', '>= 7.2.2.1'
9
9
 
10
10
  group :development, :test do
11
11
  gem 'autoprefixer-rails', '~> 10.4.16.0'
12
12
  gem 'byebug', '~> 11.1.0', platforms: %i[mri mingw x64_mingw]
13
13
  gem 'image_processing', '>= 1.12.0'
14
- gem 'sqlite3', '~> 1.6.7'
14
+ gem 'propshaft', '~> 1.1.0'
15
+ gem 'sqlite3', '>= 2.1'
15
16
  end
16
17
 
17
18
  group :test do
@@ -5,13 +5,14 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
5
5
 
6
6
  gemspec path: '../'
7
7
 
8
- gem 'rails', '~> 6.1.0'
8
+ gem 'rails', '~> 8.0.1'
9
9
 
10
10
  group :development, :test do
11
11
  gem 'autoprefixer-rails', '~> 10.4.16.0'
12
12
  gem 'byebug', '~> 11.1.0', platforms: %i[mri mingw x64_mingw]
13
13
  gem 'image_processing', '>= 1.12.0'
14
- gem 'sqlite3', '~> 1.6.7'
14
+ gem 'propshaft', '~> 1.1.0'
15
+ gem 'sqlite3', '>= 2.1'
15
16
  end
16
17
 
17
18
  group :test do
@@ -30,7 +30,7 @@ class ComfortableMediaSurfer::Content::Tags::Audio < ComfortableMediaSurfer::Con
30
30
  end
31
31
 
32
32
  def content
33
- format("#{@style}<audio controls class=\"audioplayer\" src=#{@path}></audio>")
33
+ "#{@style}<audio controls class=\"audioplayer\" src=#{@path}></audio>"
34
34
  end
35
35
  end
36
36
 
@@ -34,7 +34,7 @@ class ComfortableMediaSurfer::Content::Tags::Breadcrumbs < ComfortableMediaSurfe
34
34
  end
35
35
 
36
36
  def content
37
- format("#{@style}#{@links}")
37
+ "#{@style}#{@links}"
38
38
  end
39
39
  end
40
40
 
@@ -43,7 +43,7 @@ class ComfortableMediaSurfer::Content::Tags::Children < ComfortableMediaSurfer::
43
43
  end
44
44
  @list += '</ul>'
45
45
  end
46
- format("#{@style}#{@list}")
46
+ "#{@style}#{@list}"
47
47
  end
48
48
  end
49
49
 
@@ -57,7 +57,7 @@ class ComfortableMediaSurfer::Content::Tags::Siblings < ComfortableMediaSurfer::
57
57
  end
58
58
  @links += '</div>'
59
59
  end
60
- format("#{@style}#{@links}")
60
+ "#{@style}#{@links}"
61
61
  end
62
62
  end
63
63
 
@@ -6,18 +6,13 @@ require 'rails-i18n'
6
6
  require 'comfy_bootstrap_form'
7
7
  require 'active_link_to'
8
8
  require 'kramdown'
9
- require 'jquery-rails'
10
9
  require 'haml-rails'
11
- require 'sassc-rails'
12
10
 
13
11
  module ComfortableMediaSurfer
14
12
  class Engine < ::Rails::Engine
15
- initializer 'comfortable_media_surfer.setup_assets' do
16
- ::ComfortableMediaSurfer::Engine.config.assets.precompile += %w[
17
- comfy/admin/cms/application.js
18
- comfy/admin/cms/application.css
19
- comfy/admin/cms/lib/redactor-font.eot
20
- ]
13
+ initializer 'comfortable_media_surfer.setup_assets' do |app|
14
+ app.config.assets.paths << root.join('app/assets/builds')
15
+ app.config.assets.precompile += %w[comfy/admin/cms/application.js comfy/admin/cms/application.css]
21
16
  end
22
17
 
23
18
  config.to_prepare do
@@ -31,7 +31,7 @@ module ComfortableMediaSurfer::Extensions::HasRevisions
31
31
  return if new_record?
32
32
 
33
33
  if (respond_to?(:fragments_attributes_changed) && fragments_attributes_changed) ||
34
- !(changed & revision_fields).empty?
34
+ !!changed.intersect?(revision_fields)
35
35
  self.revision_data = revision_fields.each_with_object({}) do |field, c|
36
36
  c[field] = send("#{field}_was")
37
37
  end
@@ -33,7 +33,7 @@ module ComfortableMediaSurfer::RenderMethods
33
33
  # it by passing :cms_site parameter with site's slug. For example:
34
34
  # render cms_page: '/path/to/page', cms_site: 'default'
35
35
  #
36
- def render(options = {}, locals = {}, &block)
36
+ def render(options = {}, locals = {}, &)
37
37
  return super unless options.is_a?(Hash)
38
38
 
39
39
  if (site_identifier = options.delete(:cms_site)) && !(@cms_site = Comfy::Cms::Site.find_by_identifier(site_identifier))
@@ -47,15 +47,15 @@ module ComfortableMediaSurfer::RenderMethods
47
47
  end
48
48
 
49
49
  if page_path
50
- render_cms_page(page_path, options, locals, &block)
50
+ render_cms_page(page_path, options, locals, &)
51
51
  elsif layout_identifier
52
- render_cms_layout(layout_identifier, options, locals, &block)
52
+ render_cms_layout(layout_identifier, options, locals, &)
53
53
  else
54
54
  super
55
55
  end
56
56
  end
57
57
 
58
- def render_cms_page(path, options = {}, locals = {}, &block)
58
+ def render_cms_page(path, options = {}, locals = {}, &)
59
59
  path.gsub!(%r{^/#{@cms_site.path}}, '') if @cms_site.path.present?
60
60
 
61
61
  unless (@cms_page = @cms_site.pages.find_by_full_path(path))
@@ -77,10 +77,10 @@ module ComfortableMediaSurfer::RenderMethods
77
77
  options[:layout] ||= cms_app_layout.blank? ? nil : cms_app_layout
78
78
  options[:inline] = @cms_page.render
79
79
 
80
- render(options, locals, &block)
80
+ render(options, locals, &)
81
81
  end
82
82
 
83
- def render_cms_layout(identifier, options = {}, locals = {}, &block)
83
+ def render_cms_layout(identifier, options = {}, locals = {}, &)
84
84
  unless (@cms_layout = @cms_site.layouts.find_by_identifier(identifier))
85
85
  raise ComfortableMediaSurfer::MissingLayout, identifier
86
86
  end
@@ -97,7 +97,7 @@ module ComfortableMediaSurfer::RenderMethods
97
97
  options[:layout] ||= cms_app_layout.blank? ? nil : cms_app_layout
98
98
  options[:inline] = cms_page.render
99
99
 
100
- render(options, locals, &block)
100
+ render(options, locals, &)
101
101
  end
102
102
  end
103
103
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ComfortableMediaSurfer
4
- VERSION = '3.0.0'
4
+ VERSION = '3.1.2'
5
5
  end
@@ -13,16 +13,9 @@ You are almost done. Don't forget to:
13
13
 
14
14
  [Optional] - If you want to store files in your CMS with ActiveStorage: `rails active_storage:install`
15
15
  [Mandatory] - Create the tables in your database: `rails db:migrate`
16
+ [Mandatory] - Run `rails comfy:compile_assets`
16
17
 
17
18
  Then go to http://your-rails-app/admin to start adding content.
18
19
 
19
20
  Default username and password are: user / pass
20
- Change these defaults in config/initializers/occams.rb
21
-
22
- ----------------------------
23
- IF YOU ARE ON RAILS 6.x
24
- ----------------------------
25
- and encounter errors referencing webpacker:
26
- ensure that you have nvm installed, and then run
27
- - nvm install 13.7 && nvm use 13.7
28
- - rails webpacker:install
21
+ Change these defaults in config/initializers/comfortable_media_surfer.rb
@@ -11,14 +11,16 @@ module Comfy
11
11
  source_root File.expand_path('../../../..', __dir__)
12
12
 
13
13
  def generate_migration
14
- destination = File.expand_path('db/migrate/01_create_cms.rb', destination_root)
15
- migration_dir = File.dirname(destination)
16
- destination = self.class.migration_exists?(migration_dir, 'create_cms')
14
+ %w[01_create_cms 02_add_markdown_to_snippets].each do |migration|
15
+ destination = File.expand_path("db/migrate/#{migration}.rb", destination_root)
16
+ migration_dir = File.dirname(destination)
17
+ destination = self.class.migration_exists?(migration_dir, migration)
17
18
 
18
- if destination
19
- puts "\e[0m\e[31mFound existing cms_create.rb migration. Remove it if you want to regenerate.\e[0m"
20
- else
21
- migration_template 'db/migrate/01_create_cms.rb', 'db/migrate/create_cms.rb'
19
+ if destination
20
+ puts "\e[0m\e[31mFound existing #{migration}.rb migration. Remove it if you want to regenerate.\e[0m"
21
+ else
22
+ migration_template "db/migrate/#{migration}.rb", "db/migrate/#{migration[3..]}.rb"
23
+ end
22
24
  end
23
25
  end
24
26