alchemy_cms 5.0.6 → 5.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +1 -1
  3. data/.github/workflows/stale.yml +1 -1
  4. data/.gitignore +1 -0
  5. data/.travis.yml +48 -0
  6. data/CHANGELOG.md +50 -23
  7. data/CONTRIBUTING.md +2 -2
  8. data/Gemfile +2 -2
  9. data/README.md +2 -2
  10. data/alchemy_cms.gemspec +4 -4
  11. data/app/assets/images/alchemy/missing-image.svg +1 -0
  12. data/app/assets/stylesheets/alchemy/_variables.scss +1 -0
  13. data/app/assets/stylesheets/alchemy/archive.scss +23 -17
  14. data/app/assets/stylesheets/alchemy/errors.scss +1 -1
  15. data/app/assets/stylesheets/alchemy/navigation.scss +7 -10
  16. data/app/assets/stylesheets/alchemy/pagination.scss +1 -1
  17. data/app/assets/stylesheets/alchemy/search.scss +12 -2
  18. data/app/assets/stylesheets/alchemy/tags.scss +19 -31
  19. data/app/controllers/alchemy/admin/pictures_controller.rb +13 -6
  20. data/app/controllers/alchemy/admin/resources_controller.rb +3 -3
  21. data/app/controllers/alchemy/pages_controller.rb +49 -14
  22. data/app/helpers/alchemy/admin/base_helper.rb +0 -44
  23. data/app/helpers/alchemy/admin/navigation_helper.rb +2 -1
  24. data/app/helpers/alchemy/pages_helper.rb +1 -1
  25. data/app/models/alchemy/attachment/url.rb +40 -0
  26. data/app/models/alchemy/attachment.rb +20 -3
  27. data/app/models/alchemy/essence_picture.rb +3 -3
  28. data/app/models/alchemy/essence_picture_view.rb +5 -3
  29. data/app/models/alchemy/page/page_natures.rb +2 -0
  30. data/app/models/alchemy/page/url_path.rb +8 -6
  31. data/app/models/alchemy/page.rb +16 -1
  32. data/app/models/alchemy/picture/calculations.rb +55 -0
  33. data/app/models/alchemy/picture/transformations.rb +5 -49
  34. data/app/models/alchemy/picture/url.rb +28 -77
  35. data/app/models/alchemy/picture.rb +58 -2
  36. data/app/models/alchemy/picture_thumb/create.rb +39 -0
  37. data/app/models/alchemy/picture_thumb/signature.rb +23 -0
  38. data/app/models/alchemy/picture_thumb/uid.rb +22 -0
  39. data/app/models/alchemy/picture_thumb.rb +57 -0
  40. data/app/models/alchemy/picture_variant.rb +114 -0
  41. data/app/serializers/alchemy/page_tree_serializer.rb +4 -4
  42. data/app/views/alchemy/admin/attachments/show.html.erb +8 -8
  43. data/app/views/alchemy/admin/dashboard/index.html.erb +13 -16
  44. data/app/views/alchemy/admin/elements/_element_toolbar.html.erb +1 -1
  45. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  46. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +2 -2
  47. data/app/views/alchemy/admin/layoutpages/edit.html.erb +4 -6
  48. data/app/views/alchemy/admin/pages/_form.html.erb +4 -6
  49. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +2 -1
  50. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +14 -13
  51. data/app/views/alchemy/admin/partials/_search_form.html.erb +8 -8
  52. data/app/views/alchemy/admin/pictures/_archive.html.erb +1 -1
  53. data/app/views/alchemy/admin/pictures/_form.html.erb +1 -1
  54. data/app/views/alchemy/admin/pictures/_picture.html.erb +3 -3
  55. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  56. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +1 -1
  57. data/app/views/alchemy/admin/pictures/index.html.erb +1 -1
  58. data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
  59. data/app/views/alchemy/admin/resources/_per_page_select.html.erb +3 -3
  60. data/app/views/alchemy/admin/resources/index.html.erb +4 -1
  61. data/app/views/alchemy/admin/tags/index.html.erb +14 -15
  62. data/app/views/alchemy/base/500.html.erb +11 -13
  63. data/app/views/alchemy/essences/_essence_file_view.html.erb +3 -3
  64. data/app/views/alchemy/essences/_essence_picture_view.html.erb +3 -3
  65. data/config/alchemy/config.yml +15 -11
  66. data/config/alchemy/modules.yml +12 -12
  67. data/config/routes.rb +1 -1
  68. data/db/migrate/20200617110713_create_alchemy_picture_thumbs.rb +22 -0
  69. data/db/migrate/20200907111332_remove_tri_state_booleans.rb +33 -0
  70. data/lib/alchemy/auth_accessors.rb +12 -5
  71. data/lib/alchemy/config.rb +1 -3
  72. data/lib/alchemy/engine.rb +7 -2
  73. data/lib/alchemy/modules.rb +11 -1
  74. data/lib/alchemy/resource.rb +3 -5
  75. data/lib/alchemy/test_support/factories/picture_factory.rb +0 -1
  76. data/lib/alchemy/test_support/factories/picture_thumb_factory.rb +12 -0
  77. data/lib/alchemy/upgrader/five_point_zero.rb +0 -31
  78. data/lib/alchemy/version.rb +1 -1
  79. data/lib/generators/alchemy/install/files/alchemy.en.yml +2 -2
  80. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +5 -5
  81. data/lib/tasks/alchemy/thumbnails.rake +37 -0
  82. data/lib/tasks/alchemy/upgrade.rake +0 -20
  83. data/package/admin.js +0 -2
  84. data/package/src/__tests__/i18n.spec.js +0 -23
  85. data/package/src/i18n.js +3 -1
  86. data/package.json +1 -1
  87. metadata +26 -24
  88. data/.github/workflows/ci.yml +0 -126
  89. data/.github/workflows/greetings.yml +0 -13
  90. data/app/controllers/concerns/alchemy/locale_redirects.rb +0 -40
  91. data/app/controllers/concerns/alchemy/page_redirects.rb +0 -68
  92. data/lib/alchemy/userstamp.rb +0 -12
@@ -1,7 +1,7 @@
1
1
  <div class="picture_thumbnail assign_image_list_detail <%= size.blank? ? 'medium' : size %>" name="<%= picture_to_assign.name %>" id="picture_to_assign_<%= picture_to_assign.id %>">
2
2
  <%= link_to(
3
3
  image_tag(
4
- picture_to_assign.url(size: preview_size(size), flatten: true),
4
+ picture_to_assign.url(size: preview_size(size), flatten: true) || "alchemy/missing-image.svg",
5
5
  alt: picture_to_assign.name
6
6
  ),
7
7
  alchemy.assign_admin_essence_pictures_path(
@@ -1,6 +1,6 @@
1
1
  <%= form_tag update_multiple_admin_pictures_path do %>
2
2
  <%= hidden_field_tag :q, search_filter_params[:q] %>
3
- <%= hidden_field_tag :size, params[:size] %>
3
+ <%= hidden_field_tag :size, @size %>
4
4
  <%= hidden_field_tag :tagged_with, search_filter_params[:tagged_with] %>
5
5
  <%= hidden_field_tag :filter, search_filter_params[:filter] %>
6
6
 
@@ -5,7 +5,7 @@
5
5
  object: Alchemy::Picture.new,
6
6
  file_attribute: 'image_file',
7
7
  redirect_url: alchemy.admin_pictures_path(
8
- size: params[:size],
8
+ size: @size,
9
9
  filter: 'last_upload'
10
10
  ) %>
11
11
  <div class="toolbar_spacer"></div>
@@ -1,5 +1,5 @@
1
1
  <div class="zoomed-picture-background">
2
- <%= image_tag @picture.url %>
2
+ <%= image_tag @picture.url || "alchemy/missing-image.svg" %>
3
3
  </div>
4
4
 
5
5
  <div class="picture-overlay-navigation">
@@ -9,7 +9,7 @@
9
9
  q: search_filter_params[:q],
10
10
  page: params[:page],
11
11
  tagged_with: search_filter_params[:tagged_with],
12
- size: params[:size],
12
+ size: @size,
13
13
  filter: search_filter_params[:filter]
14
14
  ),
15
15
  class: "previous-picture",
@@ -23,7 +23,7 @@
23
23
  q: search_filter_params[:q],
24
24
  page: params[:page],
25
25
  tagged_with: search_filter_params[:tagged_with],
26
- size: params[:size],
26
+ size: @size,
27
27
  filter: search_filter_params[:filter]
28
28
  ),
29
29
  class: "next-picture",
@@ -2,10 +2,10 @@
2
2
  <% search_filter_params.reject { |k, _| k == 'page' || k == 'per_page' }.each do |key, value| %>
3
3
  <% if value.is_a? Hash %>
4
4
  <% value.each do |k, v| %>
5
- <%= hidden_field_tag "#{key}[#{k}]", v %>
5
+ <%= hidden_field_tag "#{key}[#{k}]", v, id: nil %>
6
6
  <% end %>
7
7
  <% else %>
8
- <%= hidden_field_tag key, value %>
8
+ <%= hidden_field_tag key, value, id: nil %>
9
9
  <% end %>
10
10
  <% end %>
11
11
  <label>
@@ -17,4 +17,4 @@
17
17
  ),
18
18
  onchange: 'this.form.submit()' %>
19
19
  </label>
20
- <% end %>
20
+ <% end %>
@@ -21,7 +21,10 @@
21
21
  dialog: false,
22
22
  if_permitted_to: [:index, resource_model]
23
23
  ) %>
24
- <%= render 'alchemy/admin/partials/search_form' %>
24
+ <%= render 'alchemy/admin/partials/search_form', additional_params: [
25
+ resource_has_filters ? :filter : nil,
26
+ resource_has_tags ? :tagged_with : nil
27
+ ].compact %>
25
28
  <% end %>
26
29
 
27
30
  <div id="archive_all" class="resources-table-wrapper<%= ' with_tag_filter' if resource_has_tags || resource_has_filters %>">
@@ -1,19 +1,18 @@
1
- <%= toolbar(
2
- buttons: [
3
- {
4
- icon: :plus,
5
- label: Alchemy.t('New Tag'),
6
- url: alchemy.new_admin_tag_path,
1
+ <% content_for :toolbar do %>
2
+ <%= toolbar_button(
3
+ icon: :plus,
4
+ label: Alchemy.t('New Tag'),
5
+ url: alchemy.new_admin_tag_path,
6
+ title: Alchemy.t('New Tag'),
7
+ hotkey: 'alt+n',
8
+ dialog_options: {
7
9
  title: Alchemy.t('New Tag'),
8
- hotkey: 'alt+n',
9
- dialog_options: {
10
- title: Alchemy.t('New Tag'),
11
- size: '310x180'
12
- },
13
- if_permitted_to: [:create, Alchemy::Tag]
14
- }
15
- ]
16
- ) %>
10
+ size: '310x180'
11
+ },
12
+ if_permitted_to: [:create, Alchemy::Tag]
13
+ ) %>
14
+ <%= render 'alchemy/admin/partials/search_form' %>
15
+ <% end %>
17
16
 
18
17
  <div id="archive_all" class="resources-table-wrapper">
19
18
  <%= render 'alchemy/admin/resources/table_header' %>
@@ -1,16 +1,14 @@
1
- <%= toolbar(
2
- buttons: [
3
- {
4
- icon: 'angle-double-left',
5
- url: request.referer || alchemy.admin_dashboard_path,
6
- label: Alchemy.t(:back),
7
- title: Alchemy.t(:back),
8
- hotkey: 'alt+z',
9
- dialog: false,
10
- skip_permission_check: true
11
- }
12
- ], search: false
13
- ) %>
1
+ <%= content_for :toolbar do %>
2
+ <%= toolbar_button(
3
+ icon: 'angle-double-left',
4
+ url: request.referer || alchemy.admin_dashboard_path,
5
+ label: Alchemy.t(:back),
6
+ title: Alchemy.t(:back),
7
+ hotkey: 'alt+z',
8
+ dialog: false,
9
+ skip_permission_check: true
10
+ ) %>
11
+ <% end %>
14
12
 
15
13
  <% content_for(:alchemy_body_class) { 'error' } %>
16
14
 
@@ -5,8 +5,8 @@
5
5
  content.essence.link_text.presence ||
6
6
  content.settings_value(:link_text, local_assigns.fetch(:options, {})) ||
7
7
  attachment.name,
8
- alchemy.download_attachment_path(
9
- attachment,
8
+ attachment.url(
9
+ download: true,
10
10
  name: attachment.slug,
11
11
  format: attachment.suffix
12
12
  ),
@@ -15,4 +15,4 @@
15
15
  title: content.essence.title.presence
16
16
  }.merge(html_options)
17
17
  ) -%>
18
- <%- end -%>
18
+ <%- end -%>
@@ -1,6 +1,6 @@
1
1
  <% content = local_assigns[:content] || local_assigns[:essence_picture_view] %>
2
2
  <%= Alchemy::EssencePictureView.new(
3
3
  content,
4
- local_assigns[:options] || {},
5
- local_assigns[:html_options] || {}
6
- ).render %>
4
+ local_assigns[:options],
5
+ local_assigns[:html_options]
6
+ ).render %>
@@ -9,12 +9,6 @@
9
9
  #
10
10
  auto_logout_time: 30
11
11
 
12
- # === Redirect Options
13
- #
14
- # redirect_to_public_child [Boolean] # Alchemy redirects to the first public child page found, if a page is not public.
15
- #
16
- redirect_to_public_child: true
17
-
18
12
  # === Page caching
19
13
  #
20
14
  # Enable/Disable page caching globally.
@@ -68,17 +62,27 @@ items_per_page: 15
68
62
 
69
63
  # === Picture rendering settings
70
64
  #
71
- # Alchemy uses Dragonfly to render images. Use {size: "XXXxYYY", crop: BOOLEAN [true]} to resize images.
65
+ # Alchemy uses Dragonfly to render images. Settings for image rendering are specific to elements and are defined in elements.yml
72
66
  #
73
- # See http://markevans.github.com/dragonfly for further infos.
67
+ # Example:
68
+ # - name: some_element
69
+ # contents:
70
+ # - name: some_picture
71
+ # type: EssencePicture
72
+ # settings:
73
+ # hint: true
74
+ # crop: true # turns on image cropping
75
+ # size: '500x500' # image will be cropped to this size
74
76
  #
75
- # ==== Options:
77
+ # See http://markevans.github.com/dragonfly for further info.
78
+ #
79
+ # ==== Global Options:
76
80
  #
77
81
  # output_image_jpg_quality [Integer] # If image gets rendered as JPG this is the quality setting for it. (Default 85)
78
- # preprocess_image_resize [String] # Use this option to resize images to that value. Downsizing example: '1000x1000>' (Default nil)
82
+ # preprocess_image_resize [String] # Use this option to resize images to the given size when they are uploaded to the image library. Downsizing example: '1000x1000>' (Default nil)
79
83
  # image_output_format [String] # The global image output format setting. (Default +original+)
80
84
  #
81
- # NOTE: You can always override the output format in the options of your Essence. I.E. {format: 'gif'}
85
+ # NOTE: You can always override the output format in the settings of your Essence in elements.yml, I.E. {format: 'gif'}
82
86
  #
83
87
  output_image_jpg_quality: 85
84
88
  preprocess_image_resize:
@@ -5,7 +5,7 @@
5
5
  position: 1
6
6
  navigation:
7
7
  name: 'modules.dashboard'
8
- controller: 'alchemy/admin/dashboard'
8
+ controller: '/alchemy/admin/dashboard'
9
9
  action: index
10
10
  inline_image: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="-4 -6 32 32" class="svg-inline--fa fa-lg fa-fw"><path fill="currentColor" d="M15.7 7.9L9.9 2.2 2.1 4.3 0 12.1l5.7 5.8 7.8-2.1 2.2-7.9zm-5.3 10.3l-1.2 4.4 3.2 3.2 4.4-1.2 1.2-4.4-3.2-3.2-4.4 1.2zM23.5 7.3L17.2 9l-1.7 6.2 4.5 4.6 6.2-1.7 1.7-6.2-4.4-4.6z"/></svg>'
11
11
 
@@ -14,18 +14,18 @@
14
14
  position: 2
15
15
  navigation:
16
16
  name: 'modules.pages'
17
- controller: 'alchemy/admin/pages'
17
+ controller: '/alchemy/admin/pages'
18
18
  action: index
19
19
  icon: file-alt
20
20
  sub_navigation:
21
21
  - name: 'modules.pages'
22
- controller: 'alchemy/admin/pages'
22
+ controller: '/alchemy/admin/pages'
23
23
  action: index
24
24
  - name: 'modules.layoutpages'
25
- controller: 'alchemy/admin/layoutpages'
25
+ controller: '/alchemy/admin/layoutpages'
26
26
  action: index
27
27
  nested:
28
- - controller: 'alchemy/admin/pages'
28
+ - controller: '/alchemy/admin/pages'
29
29
  action: edit
30
30
 
31
31
  - name: menus
@@ -33,7 +33,7 @@
33
33
  position: 3
34
34
  navigation:
35
35
  name: 'modules.menus'
36
- controller: 'alchemy/admin/nodes'
36
+ controller: '/alchemy/admin/nodes'
37
37
  action: index
38
38
  icon: list-ul
39
39
 
@@ -42,7 +42,7 @@
42
42
  position: 4
43
43
  navigation:
44
44
  name: 'modules.languages'
45
- controller: 'alchemy/admin/languages'
45
+ controller: '/alchemy/admin/languages'
46
46
  action: index
47
47
  icon: flag
48
48
 
@@ -51,7 +51,7 @@
51
51
  position: 5
52
52
  navigation:
53
53
  name: 'modules.sites'
54
- controller: 'alchemy/admin/sites'
54
+ controller: '/alchemy/admin/sites'
55
55
  action: index
56
56
  icon: bullseye
57
57
 
@@ -60,7 +60,7 @@
60
60
  position: 6
61
61
  navigation:
62
62
  name: 'modules.tags'
63
- controller: 'alchemy/admin/tags'
63
+ controller: '/alchemy/admin/tags'
64
64
  action: index
65
65
  icon: tags
66
66
 
@@ -68,14 +68,14 @@
68
68
  engine_name: alchemy
69
69
  position: 7
70
70
  navigation:
71
- controller: 'alchemy/admin/pictures'
71
+ controller: '/alchemy/admin/pictures'
72
72
  action: index
73
73
  name: 'modules.library'
74
74
  icon: archive
75
75
  sub_navigation:
76
76
  - name: 'modules.pictures'
77
- controller: 'alchemy/admin/pictures'
77
+ controller: '/alchemy/admin/pictures'
78
78
  action: index
79
79
  - name: 'modules.attachments'
80
- controller: 'alchemy/admin/attachments'
80
+ controller: '/alchemy/admin/attachments'
81
81
  action: index
data/config/routes.rb CHANGED
@@ -124,7 +124,7 @@ Alchemy::Engine.routes.draw do
124
124
 
125
125
  get "/attachment/:id/download(/:name)" => "attachments#download",
126
126
  as: :download_attachment
127
- get "/attachment/:id/show" => "attachments#show",
127
+ get "/attachment/:id/show(/:name)" => "attachments#show",
128
128
  as: :show_attachment
129
129
 
130
130
  resources :messages, only: [:index, :new, :create]
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateAlchemyPictureThumbs < ActiveRecord::Migration[5.2]
4
+ def up
5
+ return if table_exists?(:alchemy_picture_thumbs)
6
+
7
+ create_table :alchemy_picture_thumbs do |t|
8
+ t.references :picture, foreign_key: { to_table: :alchemy_pictures }, null: false
9
+ t.string :signature, null: false
10
+ t.text :uid, null: false
11
+ end
12
+ add_index :alchemy_picture_thumbs, :signature, unique: true
13
+ end
14
+
15
+ def down
16
+ return unless table_exists?(:alchemy_picture_thumbs)
17
+
18
+ remove_foreign_key :alchemy_picture_thumbs, :alchemy_pictures, column: :picture_id
19
+ remove_index :alchemy_picture_thumbs, :signature
20
+ drop_table :alchemy_picture_thumbs
21
+ end
22
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ class RemoveTriStateBooleans < ActiveRecord::Migration[5.2]
4
+ def change
5
+ change_column_null :alchemy_elements, :public, false, false
6
+ change_column_default :alchemy_elements, :public, true
7
+
8
+ change_column_null :alchemy_elements, :folded, false
9
+ change_column_null :alchemy_elements, :unique, false
10
+
11
+ change_column_null :alchemy_essence_richtexts, :public, false, false
12
+ change_column_default :alchemy_essence_richtexts, :public, false
13
+
14
+ change_column_null :alchemy_essence_texts, :public, false
15
+
16
+ change_column_null :alchemy_folded_pages, :folded, false
17
+
18
+ change_column_null :alchemy_languages, :public, false
19
+ change_column_null :alchemy_languages, :default, false
20
+
21
+ change_column_null :alchemy_pages, :language_root, false, false
22
+ change_column_default :alchemy_pages, :language_root, false
23
+
24
+ change_column_null :alchemy_pages, :restricted, false
25
+ change_column_null :alchemy_pages, :robot_index, false
26
+ change_column_null :alchemy_pages, :robot_follow, false
27
+ change_column_null :alchemy_pages, :sitemap, false
28
+
29
+ change_column_null :alchemy_sites, :public, false
30
+ change_column_null :alchemy_sites, :redirect_to_primary_host, false, false
31
+ change_column_default :alchemy_sites, :redirect_to_primary_host, false
32
+ end
33
+ end
@@ -91,16 +91,23 @@ module Alchemy
91
91
  @@user_class_name.constantize
92
92
  rescue NameError => e
93
93
  if e.message =~ /#{Regexp.escape(@@user_class_name)}/
94
- abort <<-MSG.strip_heredoc
94
+ Rails.logger.warn <<~MSG
95
+ #{e.message}
96
+ #{e.backtrace.join("\n")}
95
97
 
96
- AlchemyCMS cannot find any user class!
98
+ AlchemyCMS cannot find any user class!
97
99
 
98
- Please add a user class and tell Alchemy about it or, if you don't want
99
- to create your own class, add the `alchemy-devise` gem to your Gemfile.
100
+ Please add a user class and tell Alchemy about it:
100
101
 
101
- bundle add alchemy-devise
102
+ # config/initializers/alchemy.rb
103
+ Alchemy.user_class_name = 'MyUser'
104
+
105
+ Or add the `alchemy-devise` gem to your Gemfile:
106
+
107
+ bundle add alchemy-devise
102
108
 
103
109
  MSG
110
+ nil
104
111
  else
105
112
  raise e
106
113
  end
@@ -31,9 +31,7 @@ module Alchemy
31
31
  # a value of nil means there is no new default
32
32
  # any not nil value is the new default
33
33
  def deprecated_configs
34
- {
35
- redirect_to_public_child: nil,
36
- }
34
+ {}
37
35
  end
38
36
 
39
37
  private
@@ -40,8 +40,13 @@ module Alchemy
40
40
  end
41
41
  end
42
42
 
43
- config.after_initialize do
44
- require_relative "./userstamp"
43
+ initializer "alchemy.userstamp" do
44
+ if Alchemy.user_class
45
+ ActiveSupport.on_load(:active_record) do
46
+ Alchemy.user_class.model_stamper
47
+ Alchemy.user_class.stampable(stamper_class_name: Alchemy.user_class_name)
48
+ end
49
+ end
45
50
  end
46
51
  end
47
52
  end
@@ -72,7 +72,8 @@ module Alchemy
72
72
  alchemy_modules.detect do |alchemy_module|
73
73
  module_navi = alchemy_module.fetch("navigation", {})
74
74
  definition_from_mainnavi(module_navi, name_or_params) ||
75
- definition_from_subnavi(module_navi, name_or_params)
75
+ definition_from_subnavi(module_navi, name_or_params) ||
76
+ definition_from_nested(module_navi, name_or_params)
76
77
  end
77
78
  else
78
79
  raise ArgumentError, "Could not find module definition for #{name_or_params}"
@@ -94,6 +95,15 @@ module Alchemy
94
95
  end
95
96
  end
96
97
 
98
+ def definition_from_nested(module_navi, params)
99
+ nested = module_navi["nested"]
100
+ return if nested.nil?
101
+
102
+ nested.any? do |navi|
103
+ controller_matches?(navi, params) && action_matches?(navi, params)
104
+ end
105
+ end
106
+
97
107
  def controller_matches?(navi, params)
98
108
  remove_slash(navi["controller"]) == remove_slash(params["controller"])
99
109
  end
@@ -132,9 +132,7 @@ module Alchemy
132
132
  end
133
133
 
134
134
  def namespaced_resource_name
135
- @_namespaced_resource_name ||= begin
136
- namespaced_resources_name.to_s.singularize
137
- end.to_sym # Rails >= 6.0.3.7 needs symbols in polymorphic routes
135
+ @_namespaced_resource_name ||= namespaced_resources_name.singularize
138
136
  end
139
137
 
140
138
  def namespaced_resources_name
@@ -142,13 +140,13 @@ module Alchemy
142
140
  resource_name_array = resource_array.dup
143
141
  resource_name_array.delete(engine_name) if in_engine?
144
142
  resource_name_array.join("_")
145
- end.to_sym # Rails >= 6.0.3.7 needs symbols in polymorphic routes
143
+ end
146
144
  end
147
145
 
148
146
  def namespace_for_scope
149
147
  namespace_array = namespace_diff
150
148
  namespace_array.delete(engine_name) if in_engine?
151
- namespace_array.map(&:to_sym) # Rails >= 6.0.3.7 needs symbols in polymorphic routes
149
+ namespace_array
152
150
  end
153
151
 
154
152
  # Returns an array of underscored association names
@@ -8,7 +8,6 @@ FactoryBot.define do
8
8
  File.new(Alchemy::Engine.root.join("lib", "alchemy", "test_support", "fixtures", "image.png"))
9
9
  end
10
10
  name { "image" }
11
- image_file_name { "image.png" }
12
11
  upload_hash { Time.current.hash }
13
12
  end
14
13
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "factory_bot"
4
+ require "securerandom"
5
+
6
+ FactoryBot.define do
7
+ factory :alchemy_picture_thumb, class: "Alchemy::PictureThumb" do
8
+ picture { create(:alchemy_picture) }
9
+ signature { SecureRandom.hex(16) }
10
+ sequence(:uid) { |n| "#{Time.now.strftime("%Y/%m/%d")}/#{n}.jpg" }
11
+ end
12
+ end
@@ -1,18 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "tasks/harden_gutentag_migrations"
4
- require "rails/generators"
5
- require "thor"
6
- require "alchemy/install/tasks"
7
4
 
8
5
  module Alchemy
9
6
  class Upgrader::FivePointZero < Upgrader
10
- include Rails::Generators::Actions
11
- include Thor::Base
12
- include Thor::Actions
13
-
14
- source_root File.expand_path("../../generators/alchemy/install/files", __dir__)
15
-
16
7
  class << self
17
8
  def install_gutentag_migrations
18
9
  desc "Install Gutentag migrations"
@@ -45,28 +36,6 @@ module Alchemy
45
36
  log "Root page not found.", :skip
46
37
  end
47
38
  end
48
-
49
- def run_webpacker_installer
50
- # Webpacker does not create a package.json, but we need one
51
- unless File.exist? app_root.join("package.json")
52
- in_root { run "echo '{}' > package.json" }
53
- end
54
- new.rake("webpacker:install", abort_on_failure: true)
55
- end
56
-
57
- def add_npm_package
58
- new.run "yarn add @alchemy_cms/admin"
59
- end
60
-
61
- def copy_alchemy_entry_point
62
- webpack_config = YAML.load_file(app_root.join("config", "webpacker.yml"))[Rails.env]
63
- new.copy_file "alchemy_admin.js",
64
- app_root.join(webpack_config["source_path"], webpack_config["source_entry_path"], "alchemy/admin.js")
65
- end
66
-
67
- def app_root
68
- @_app_root ||= Rails.root
69
- end
70
39
  end
71
40
  end
72
41
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Alchemy
4
- VERSION = "5.0.6"
4
+ VERSION = "5.1.0.beta1"
5
5
 
6
6
  def self.version
7
7
  VERSION
@@ -18,7 +18,7 @@ en:
18
18
  # Default texts for new contents created
19
19
  default_content_texts:
20
20
  article_headline: "Welcome to your first Alchemy CMS page"
21
- article_text: '<p><strong>How to get started.</strong></p><p>First of all you should read about Alchemy and its architecture in the <a class="external" href="http://guides.alchemy-cms.com/stable/alchemy_approach.html" target="_blank" data-link-target="blank">guidelines</a>.</p><p>The most important things to know about Alchemy are elements and page layouts.</p><p><span style="text-decoration: underline;"><strong>Elements:</strong></span></p><p>With Alchemy you can split pages into content parts, elements. These elements can be defined out of several base content types: essences. The basic essences are:</p><ul><li>EssenceText - <em>A single line of text</em></li><li>EssenceRichtext - <em>A TinyMCE powered formatted text block</em></li><li>EssencePicture - <em>A reference to an image</em></li><li>EssenceHtml - <em>HTML embed code</em></li><li>EssenceSelect - <em>A selection of values</em></li><li>EssenceBoolean - <em>A checkbox</em></li></ul><p>Elements get defined in a YAML file <strong>config/alchemy/elements.yml</strong></p><p><a class="external" href="http://guides.alchemy-cms.com/stable/elements.html" target="_blank" data-link-target="blank">Read more about elements and how to define them in the guidelines.</a></p><p><span style="text-decoration: underline;"><strong>Page types:</strong></span></p><p>You can define several types of pages, called page layouts. You can assign elements to page layouts and control how elements and the page of a certain layout behave.</p><p>Page layouts get defined in a YAML file <strong>config/alchemy/page_layouts.yml</strong></p><p><a class="external" href="http://guides.alchemy-cms.com/stable/page_layouts.html" target="_blank" data-link-target="blank">Read more about defining page layouts in the guidelines.</a></p>'
21
+ article_text: '<p><strong>How to get started.</strong></p><p>First of all you should read about Alchemy and its architecture in the <a class="external" href="http://guides.alchemy-cms.com/alchemy_approach.html" target="_blank" data-link-target="blank">guidelines</a>.</p><p>The most important things to know about Alchemy are elements and page layouts.</p><p><span style="text-decoration: underline;"><strong>Elements:</strong></span></p><p>With Alchemy you can split pages into content parts, elements. These elements can be defined out of several base content types: essences. The basic essences are:</p><ul><li>EssenceText - <em>A single line of text</em></li><li>EssenceRichtext - <em>A TinyMCE powered formatted text block</em></li><li>EssencePicture - <em>A reference to an image</em></li><li>EssenceHtml - <em>HTML embed code</em></li><li>EssenceSelect - <em>A selection of values</em></li><li>EssenceBoolean - <em>A checkbox</em></li></ul><p>Elements get defined in a YAML file <strong>config/alchemy/elements.yml</strong></p><p><a class="external" href="http://guides.alchemy-cms.com/elements.html" target="_blank" data-link-target="blank">Read more about elements and how to define them in the guidelines.</a></p><p><span style="text-decoration: underline;"><strong>Page types:</strong></span></p><p>You can define several types of pages, called page layouts. You can assign elements to page layouts and control how elements and the page of a certain layout behave.</p><p>Page layouts get defined in a YAML file <strong>config/alchemy/page_layouts.yml</strong></p><p><a class="external" href="http://guides.alchemy-cms.com/page_layouts.html" target="_blank" data-link-target="blank">Read more about defining page layouts in the guidelines.</a></p>'
22
22
 
23
23
  # Hint texts for elements
24
24
  element_hints:
@@ -28,4 +28,4 @@ en:
28
28
  content_hints:
29
29
  headline: "This is a single line of unformatable Text"
30
30
  picture: "Pictures are stored in the library. You can assign a picture multiple times throughout your site. Alchemy has an image cropper build right in."
31
- text: "This is a rich text block powered by TinyMCE editor. You can change the configuration of the editor. See http://guides.alchemy-cms.com/stable/customize_tinymce.html"
31
+ text: "This is a rich text block powered by TinyMCE editor. You can change the configuration of the editor. See http://guides.alchemy-cms.com/customize_tinymce.html"
@@ -15,12 +15,12 @@ Dragonfly.app(:alchemy_pictures).configure do
15
15
  dragonfly_url nil
16
16
  plugin :imagemagick
17
17
  plugin :svg
18
- secret '<%= SecureRandom.hex(32) %>'
19
- url_format '/pictures/:job/:name.:ext'
18
+ secret "<%= SecureRandom.hex(32) %>"
19
+ url_format "/pictures/:job/:basename.:ext"
20
20
 
21
21
  datastore :file,
22
- root_path: Rails.root.join('uploads/pictures').to_s,
23
- server_root: Rails.root.join('public'),
22
+ root_path: Rails.root.join("uploads/pictures").to_s,
23
+ server_root: Rails.root.join("public"),
24
24
  store_meta: false
25
25
  end
26
26
 
@@ -30,6 +30,6 @@ Rails.application.middleware.use Dragonfly::Middleware, :alchemy_pictures
30
30
  # Attachments
31
31
  Dragonfly.app(:alchemy_attachments).configure do
32
32
  datastore :file,
33
- root_path: Rails.root.join('uploads/attachments').to_s,
33
+ root_path: Rails.root.join("uploads/attachments").to_s,
34
34
  store_meta: false
35
35
  end