alchemy_cms 7.0.0.pre.a → 7.0.0.pre.b
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/brakeman-analysis.yml +2 -2
- data/.github/workflows/ci.yml +7 -7
- data/.github/workflows/lint.yml +17 -0
- data/.hound.yml +2 -3
- data/.rubocop.yml +4 -350
- data/.standard.yml +3 -0
- data/CHANGELOG.md +29 -0
- data/Gemfile +3 -1
- data/README.md +7 -9
- data/Rakefile +1 -1
- data/alchemy_cms.gemspec +2 -1
- data/app/assets/javascripts/alchemy/admin.js +0 -1
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +6 -1
- data/app/components/alchemy/ingredients/audio_view.rb +37 -0
- data/app/components/alchemy/ingredients/base_view.rb +38 -0
- data/app/components/alchemy/ingredients/boolean_view.rb +13 -0
- data/app/components/alchemy/ingredients/datetime_view.rb +22 -0
- data/app/components/alchemy/ingredients/file_view.rb +40 -0
- data/app/components/alchemy/ingredients/headline_view.rb +20 -0
- data/app/components/alchemy/ingredients/html_view.rb +9 -0
- data/app/components/alchemy/ingredients/link_view.rb +25 -0
- data/app/components/alchemy/ingredients/node_view.rb +11 -0
- data/app/components/alchemy/ingredients/page_view.rb +15 -0
- data/app/components/alchemy/ingredients/picture_view.rb +108 -0
- data/app/components/alchemy/ingredients/richtext_view.rb +22 -0
- data/app/components/alchemy/ingredients/select_view.rb +6 -0
- data/app/components/alchemy/ingredients/text_view.rb +41 -0
- data/app/components/alchemy/ingredients/video_view.rb +39 -0
- data/app/controllers/alchemy/admin/attachments_controller.rb +3 -3
- data/app/controllers/alchemy/admin/base_controller.rb +7 -7
- data/app/controllers/alchemy/admin/clipboard_controller.rb +2 -2
- data/app/controllers/alchemy/admin/elements_controller.rb +26 -11
- data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
- data/app/controllers/alchemy/admin/nodes_controller.rb +2 -2
- data/app/controllers/alchemy/admin/pages_controller.rb +10 -10
- data/app/controllers/alchemy/admin/pictures_controller.rb +14 -14
- data/app/controllers/alchemy/admin/resources_controller.rb +27 -28
- data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
- data/app/controllers/alchemy/admin/tags_controller.rb +11 -11
- data/app/controllers/alchemy/api/base_controller.rb +2 -2
- data/app/controllers/alchemy/api/elements_controller.rb +11 -11
- data/app/controllers/alchemy/api/ingredients_controller.rb +1 -1
- data/app/controllers/alchemy/api/nodes_controller.rb +1 -1
- data/app/controllers/alchemy/api/pages_controller.rb +11 -11
- data/app/controllers/alchemy/attachments_controller.rb +3 -3
- data/app/controllers/alchemy/base_controller.rb +1 -1
- data/app/controllers/alchemy/messages_controller.rb +9 -9
- data/app/controllers/alchemy/pages_controller.rb +8 -19
- data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +1 -0
- data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -7
- data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +5 -5
- data/app/decorators/alchemy/element_editor.rb +4 -4
- data/app/decorators/alchemy/ingredient_editor.rb +6 -6
- data/app/helpers/alchemy/admin/attachments_helper.rb +1 -1
- data/app/helpers/alchemy/admin/base_helper.rb +21 -22
- data/app/helpers/alchemy/admin/elements_helper.rb +1 -1
- data/app/helpers/alchemy/admin/form_helper.rb +1 -1
- data/app/helpers/alchemy/admin/navigation_helper.rb +7 -7
- data/app/helpers/alchemy/admin/pages_helper.rb +2 -2
- data/app/helpers/alchemy/admin/tags_helper.rb +3 -3
- data/app/helpers/alchemy/base_helper.rb +2 -2
- data/app/helpers/alchemy/elements_block_helper.rb +9 -7
- data/app/helpers/alchemy/elements_helper.rb +12 -12
- data/app/helpers/alchemy/pages_helper.rb +11 -11
- data/app/helpers/alchemy/url_helper.rb +1 -1
- data/app/mailers/alchemy/messages_mailer.rb +1 -1
- data/app/models/alchemy/attachment.rb +6 -6
- data/app/models/alchemy/base_record.rb +1 -0
- data/app/models/alchemy/eager_loading.rb +6 -6
- data/app/models/alchemy/element/definitions.rb +1 -1
- data/app/models/alchemy/element/element_ingredients.rb +3 -3
- data/app/models/alchemy/element.rb +2 -2
- data/app/models/alchemy/elements_repository.rb +1 -1
- data/app/models/alchemy/image_cropper_settings.rb +2 -2
- data/app/models/alchemy/ingredient.rb +14 -12
- data/app/models/alchemy/ingredient_validator.rb +1 -1
- data/app/models/alchemy/ingredients/datetime.rb +1 -1
- data/app/models/alchemy/ingredients/file.rb +5 -5
- data/app/models/alchemy/ingredients/headline.rb +4 -4
- data/app/models/alchemy/ingredients/picture.rb +27 -9
- data/app/models/alchemy/ingredients/richtext.rb +15 -12
- data/app/models/alchemy/ingredients/text.rb +6 -6
- data/app/models/alchemy/language/code.rb +1 -1
- data/app/models/alchemy/language.rb +4 -4
- data/app/models/alchemy/legacy_page_url.rb +1 -1
- data/app/models/alchemy/node.rb +2 -2
- data/app/models/alchemy/page/page_elements.rb +14 -14
- data/app/models/alchemy/page/page_naming.rb +4 -4
- data/app/models/alchemy/page/page_natures.rb +1 -1
- data/app/models/alchemy/page/page_scopes.rb +5 -5
- data/app/models/alchemy/page.rb +11 -11
- data/app/models/alchemy/picture/calculations.rb +2 -2
- data/app/models/alchemy/picture/transformations.rb +2 -2
- data/app/models/alchemy/picture/url.rb +4 -4
- data/app/models/alchemy/picture.rb +11 -10
- data/app/models/alchemy/picture_thumb/create.rb +1 -1
- data/app/models/alchemy/picture_thumb.rb +1 -1
- data/app/models/alchemy/picture_variant.rb +2 -3
- data/app/models/alchemy/tag.rb +8 -0
- data/app/models/concerns/alchemy/picture_thumbnails.rb +6 -6
- data/app/serializers/alchemy/base_serializer.rb +1 -1
- data/app/serializers/alchemy/page_tree_serializer.rb +7 -7
- data/app/services/alchemy/duplicate_element.rb +3 -3
- data/app/services/alchemy/tag_validations.rb +1 -1
- data/app/views/alchemy/admin/elements/_element.html.erb +3 -0
- data/app/views/alchemy/admin/pages/edit.html.erb +0 -3
- data/app/views/alchemy/admin/pages/update.js.erb +10 -4
- data/app/views/alchemy/admin/pictures/_infos.html.erb +1 -1
- data/app/views/alchemy/ingredients/_audio_view.html.erb +1 -14
- data/app/views/alchemy/ingredients/_boolean_view.html.erb +1 -1
- data/app/views/alchemy/ingredients/_datetime_view.html.erb +3 -9
- data/app/views/alchemy/ingredients/_file_view.html.erb +3 -16
- data/app/views/alchemy/ingredients/_headline_view.html.erb +4 -10
- data/app/views/alchemy/ingredients/_html_view.html.erb +1 -1
- data/app/views/alchemy/ingredients/_link_view.html.erb +4 -9
- data/app/views/alchemy/ingredients/_node_view.html.erb +1 -1
- data/app/views/alchemy/ingredients/_page_view.html.erb +1 -4
- data/app/views/alchemy/ingredients/_picture_view.html.erb +4 -5
- data/app/views/alchemy/ingredients/_richtext_editor.html.erb +11 -2
- data/app/views/alchemy/ingredients/_richtext_view.html.erb +3 -3
- data/app/views/alchemy/ingredients/_select_view.html.erb +1 -1
- data/app/views/alchemy/ingredients/_text_view.html.erb +3 -19
- data/app/views/alchemy/ingredients/_video_view.html.erb +3 -18
- data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +1 -0
- data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +1 -0
- data/app/views/layouts/alchemy/admin.html.erb +7 -9
- data/bin/setup +37 -0
- data/bin/start +17 -0
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/dragonfly.rb +1 -0
- data/config/initializers/mime_types.rb +1 -0
- data/config/initializers/mini_profiler.rb +1 -0
- data/config/initializers/simple_form.rb +3 -2
- data/config/locales/alchemy.en.yml +1 -1
- data/config/routes.rb +21 -20
- data/config/spring.rb +1 -0
- data/db/migrate/20230121212637_alchemy_six_point_one.rb +8 -8
- data/db/migrate/20230505132743_add_indexes_to_alchemy_pictures.rb +6 -0
- data/lib/alchemy/admin/locale.rb +3 -3
- data/lib/alchemy/admin/preview_url.rb +2 -2
- data/lib/alchemy/auth_accessors.rb +1 -1
- data/lib/alchemy/config.rb +1 -1
- data/lib/alchemy/controller_actions.rb +4 -4
- data/lib/alchemy/deprecation.rb +1 -0
- data/lib/alchemy/dragonfly/processors/thumbnail.rb +1 -1
- data/lib/alchemy/element_definition.rb +2 -2
- data/lib/alchemy/engine.rb +2 -1
- data/lib/alchemy/filetypes.rb +7 -7
- data/lib/alchemy/forms/builder.rb +4 -4
- data/lib/alchemy/i18n.rb +6 -4
- data/lib/alchemy/install/tasks.rb +2 -1
- data/lib/alchemy/name_conversions.rb +1 -1
- data/lib/alchemy/page_layout.rb +1 -1
- data/lib/alchemy/permissions.rb +5 -4
- data/lib/alchemy/resource.rb +10 -10
- data/lib/alchemy/resources_helper.rb +7 -7
- data/lib/alchemy/routing_constraints.rb +2 -2
- data/lib/alchemy/seeder.rb +12 -5
- data/lib/alchemy/shell.rb +2 -1
- data/lib/alchemy/taggable.rb +3 -2
- data/lib/alchemy/tasks/tidy.rb +1 -0
- data/lib/alchemy/test_support/capybara_helpers.rb +1 -1
- data/lib/alchemy/test_support/config_stubbing.rb +1 -0
- data/lib/alchemy/test_support/factories/element_factory.rb +4 -0
- data/lib/alchemy/test_support/factories/page_factory.rb +2 -2
- data/lib/alchemy/test_support/having_crop_action_examples.rb +9 -9
- data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +33 -33
- data/lib/alchemy/test_support/integration_helpers.rb +4 -3
- data/lib/alchemy/test_support/shared_contexts.rb +2 -1
- data/lib/alchemy/test_support/shared_dom_ids_examples.rb +9 -9
- data/lib/alchemy/test_support/shared_ingredient_examples.rb +12 -6
- data/lib/alchemy/test_support/shared_uploader_examples.rb +1 -0
- data/lib/alchemy/tinymce.rb +3 -26
- data/lib/alchemy/upgrader.rb +1 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +1 -0
- data/lib/generators/alchemy/base.rb +3 -2
- data/lib/generators/alchemy/elements/elements_generator.rb +2 -1
- data/lib/generators/alchemy/ingredient/ingredient_generator.rb +1 -0
- data/lib/generators/alchemy/install/files/application.html.erb +1 -1
- data/lib/generators/alchemy/install/install_generator.rb +2 -1
- data/lib/generators/alchemy/module/module_generator.rb +1 -0
- data/lib/generators/alchemy/page_layouts/page_layouts_generator.rb +1 -0
- data/lib/generators/alchemy/site_layouts/site_layouts_generator.rb +1 -0
- data/lib/generators/alchemy/views/views_generator.rb +2 -1
- data/lib/tasks/alchemy/thumbnails.rake +5 -5
- data/lib/tasks/alchemy/tidy.rake +1 -0
- data/lib/tasks/alchemy/upgrade.rake +6 -5
- data/package/admin.js +2 -0
- data/package/dist/admin.js +3 -3
- data/package/dist/admin.js.map +4 -4
- data/package/src/datepicker.js +1 -0
- data/package/src/tinymce.js +142 -0
- data/package.json +2 -2
- metadata +39 -7
- data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +0 -93
- data/app/presenters/alchemy/picture_view.rb +0 -88
- data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +0 -10
@@ -109,7 +109,7 @@ module Alchemy
|
|
109
109
|
@preview_urls = Alchemy.preview_sources.map do |klass|
|
110
110
|
[
|
111
111
|
klass.model_name.human,
|
112
|
-
klass.new(routes: Alchemy::Engine.routes).url_for(@page)
|
112
|
+
klass.new(routes: Alchemy::Engine.routes).url_for(@page)
|
113
113
|
]
|
114
114
|
end
|
115
115
|
@layoutpage = @page.layoutpage?
|
@@ -152,10 +152,10 @@ module Alchemy
|
|
152
152
|
respond_to do |format|
|
153
153
|
format.js do
|
154
154
|
@redirect_url = if @page.layoutpage?
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
155
|
+
alchemy.admin_layoutpages_path
|
156
|
+
else
|
157
|
+
alchemy.admin_pages_path
|
158
|
+
end
|
159
159
|
|
160
160
|
render :redirect
|
161
161
|
end
|
@@ -185,7 +185,7 @@ module Alchemy
|
|
185
185
|
format.html do
|
186
186
|
redirect_to(
|
187
187
|
params[:redirect_to].presence || admin_pages_path,
|
188
|
-
allow_other_host: true
|
188
|
+
allow_other_host: true
|
189
189
|
)
|
190
190
|
end
|
191
191
|
end
|
@@ -248,7 +248,7 @@ module Alchemy
|
|
248
248
|
Page.copy(
|
249
249
|
language_root_to_copy_from,
|
250
250
|
language_id: params[:languages][:new_lang_id],
|
251
|
-
language_code: @current_language.code
|
251
|
+
language_code: @current_language.code
|
252
252
|
)
|
253
253
|
end
|
254
254
|
|
@@ -322,7 +322,7 @@ module Alchemy
|
|
322
322
|
#
|
323
323
|
def process_url(ancestors_path, item)
|
324
324
|
default_urlname = (ancestors_path.blank? ? "" : "#{ancestors_path}/") + item["slug"].to_s
|
325
|
-
{
|
325
|
+
{my_urlname: default_urlname, children_path: default_urlname}
|
326
326
|
end
|
327
327
|
|
328
328
|
def load_resource
|
@@ -333,7 +333,7 @@ module Alchemy
|
|
333
333
|
request.raw_post.split("&").map do |i|
|
334
334
|
parts = i.split("=")
|
335
335
|
{
|
336
|
-
parts[0].gsub(/[^0-9]/, "") => parts[1]
|
336
|
+
parts[0].gsub(/[^0-9]/, "") => parts[1]
|
337
337
|
}
|
338
338
|
end
|
339
339
|
end
|
@@ -391,7 +391,7 @@ module Alchemy
|
|
391
391
|
PageTreeSerializer.new(
|
392
392
|
@page,
|
393
393
|
ability: current_ability,
|
394
|
-
user: current_alchemy_user
|
394
|
+
user: current_alchemy_user
|
395
395
|
)
|
396
396
|
end
|
397
397
|
|
@@ -44,7 +44,7 @@ module Alchemy
|
|
44
44
|
render json: {
|
45
45
|
url: @picture.url(options),
|
46
46
|
alt: @picture.name,
|
47
|
-
title: Alchemy.t(:image_name, name: @picture.name)
|
47
|
+
title: Alchemy.t(:image_name, name: @picture.name)
|
48
48
|
}
|
49
49
|
end
|
50
50
|
|
@@ -64,15 +64,15 @@ module Alchemy
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def update
|
67
|
-
if @picture.update(picture_params)
|
68
|
-
|
67
|
+
@message = if @picture.update(picture_params)
|
68
|
+
{
|
69
69
|
body: Alchemy.t(:picture_updated_successfully, name: @picture.name),
|
70
|
-
type: "notice"
|
70
|
+
type: "notice"
|
71
71
|
}
|
72
72
|
else
|
73
|
-
|
73
|
+
{
|
74
74
|
body: Alchemy.t(:picture_update_failed),
|
75
|
-
type: "error"
|
75
|
+
type: "error"
|
76
76
|
}
|
77
77
|
end
|
78
78
|
render :update
|
@@ -103,7 +103,7 @@ module Alchemy
|
|
103
103
|
if not_deletable.any?
|
104
104
|
flash[:warn] = Alchemy.t(
|
105
105
|
"These pictures could not be deleted, because they were in use",
|
106
|
-
names: not_deletable.to_sentence
|
106
|
+
names: not_deletable.to_sentence
|
107
107
|
)
|
108
108
|
else
|
109
109
|
flash[:notice] = Alchemy.t("Pictures deleted successfully", names: names.to_sentence)
|
@@ -111,7 +111,7 @@ module Alchemy
|
|
111
111
|
else
|
112
112
|
flash[:warn] = Alchemy.t("Could not delete Pictures")
|
113
113
|
end
|
114
|
-
rescue
|
114
|
+
rescue => e
|
115
115
|
flash[:error] = e.message
|
116
116
|
ensure
|
117
117
|
redirect_to_index
|
@@ -121,7 +121,7 @@ module Alchemy
|
|
121
121
|
name = @picture.name
|
122
122
|
@picture.destroy
|
123
123
|
flash[:notice] = Alchemy.t("Picture deleted successfully", name: name)
|
124
|
-
rescue
|
124
|
+
rescue => e
|
125
125
|
flash[:error] = e.message
|
126
126
|
ensure
|
127
127
|
redirect_to_index
|
@@ -153,8 +153,8 @@ module Alchemy
|
|
153
153
|
end
|
154
154
|
else
|
155
155
|
cookies[:alchemy_pictures_per_page] = params[:per_page] ||
|
156
|
-
|
157
|
-
|
156
|
+
cookies[:alchemy_pictures_per_page] ||
|
157
|
+
pictures_per_page_for_size
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
@@ -186,9 +186,9 @@ module Alchemy
|
|
186
186
|
def search_filter_params
|
187
187
|
@_search_filter_params ||= params.except(*COMMON_SEARCH_FILTER_EXCLUDES + [:picture_ids]).permit(
|
188
188
|
*common_search_filter_includes + [
|
189
|
-
|
190
|
-
|
191
|
-
|
189
|
+
:size,
|
190
|
+
:form_field_id
|
191
|
+
]
|
192
192
|
)
|
193
193
|
end
|
194
194
|
|
@@ -8,7 +8,7 @@ require "alchemy/resource_filter"
|
|
8
8
|
module Alchemy
|
9
9
|
module Admin
|
10
10
|
class ResourcesController < Alchemy::Admin::BaseController
|
11
|
-
COMMON_SEARCH_FILTER_EXCLUDES = [
|
11
|
+
COMMON_SEARCH_FILTER_EXCLUDES = %i[id utf8 _method _ format].freeze
|
12
12
|
|
13
13
|
include Alchemy::ResourcesHelper
|
14
14
|
|
@@ -18,7 +18,7 @@ module Alchemy
|
|
18
18
|
:resource_filters_for_select
|
19
19
|
|
20
20
|
before_action :load_resource,
|
21
|
-
only: [
|
21
|
+
only: %i[show edit update destroy]
|
22
22
|
|
23
23
|
before_action :authorize_resource
|
24
24
|
|
@@ -27,26 +27,18 @@ module Alchemy
|
|
27
27
|
@query.sorts = default_sort_order if @query.sorts.empty?
|
28
28
|
items = @query.result
|
29
29
|
|
30
|
-
if contains_relations?
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
if search_filter_params[:tagged_with].present?
|
35
|
-
items = items.tagged_with(search_filter_params[:tagged_with])
|
36
|
-
end
|
37
|
-
|
38
|
-
if search_filter_params[:filter].present?
|
39
|
-
items = apply_filters(items)
|
40
|
-
end
|
30
|
+
items = items.includes(*resource_relations_names) if contains_relations?
|
31
|
+
items = items.tagged_with(search_filter_params[:tagged_with]) if search_filter_params[:tagged_with].present?
|
32
|
+
items = apply_filters(items) if search_filter_params[:filter].present?
|
41
33
|
|
42
34
|
respond_to do |format|
|
43
|
-
format.html
|
35
|
+
format.html do
|
44
36
|
items = items.page(params[:page] || 1).per(items_per_page)
|
45
37
|
instance_variable_set("@#{resource_handler.resources_name}", items)
|
46
|
-
|
47
|
-
format.csv
|
38
|
+
end
|
39
|
+
format.csv do
|
48
40
|
instance_variable_set("@#{resource_handler.resources_name}", items)
|
49
|
-
|
41
|
+
end
|
50
42
|
end
|
51
43
|
end
|
52
44
|
|
@@ -58,7 +50,8 @@ module Alchemy
|
|
58
50
|
render action: "edit"
|
59
51
|
end
|
60
52
|
|
61
|
-
def edit
|
53
|
+
def edit
|
54
|
+
end
|
62
55
|
|
63
56
|
def create
|
64
57
|
instance_variable_set("@#{resource_handler.resource_name}", resource_handler.model.new(resource_params))
|
@@ -66,7 +59,7 @@ module Alchemy
|
|
66
59
|
render_errors_or_redirect(
|
67
60
|
resource_instance_variable,
|
68
61
|
resources_path(resource_instance_variable.class, search_filter_params),
|
69
|
-
flash_notice_for_resource_action
|
62
|
+
flash_notice_for_resource_action
|
70
63
|
)
|
71
64
|
end
|
72
65
|
|
@@ -75,7 +68,7 @@ module Alchemy
|
|
75
68
|
render_errors_or_redirect(
|
76
69
|
resource_instance_variable,
|
77
70
|
resources_path(resource_instance_variable.class, search_filter_params),
|
78
|
-
flash_notice_for_resource_action
|
71
|
+
flash_notice_for_resource_action
|
79
72
|
)
|
80
73
|
end
|
81
74
|
|
@@ -161,7 +154,10 @@ module Alchemy
|
|
161
154
|
when :destroy
|
162
155
|
verb = "removed"
|
163
156
|
end
|
164
|
-
flash[:notice] = Alchemy.t(
|
157
|
+
flash[:notice] = Alchemy.t(
|
158
|
+
"#{resource_handler.resource_name.classify} successfully #{verb}",
|
159
|
+
default: Alchemy.t("Successfully #{verb}")
|
160
|
+
)
|
165
161
|
end
|
166
162
|
|
167
163
|
def is_alchemy_module?
|
@@ -198,18 +194,20 @@ module Alchemy
|
|
198
194
|
|
199
195
|
def common_search_filter_includes
|
200
196
|
search_filters = [
|
201
|
-
{
|
202
|
-
|
203
|
-
|
204
|
-
|
197
|
+
{
|
198
|
+
q: [
|
199
|
+
resource_handler.search_field_name,
|
200
|
+
:s
|
201
|
+
]
|
202
|
+
},
|
205
203
|
:tagged_with,
|
206
204
|
:page,
|
207
|
-
:per_page
|
205
|
+
:per_page
|
208
206
|
]
|
209
207
|
|
210
208
|
if resource_has_filters
|
211
209
|
search_filters << {
|
212
|
-
filter: resource_filters.map { |f| f[:name] }
|
210
|
+
filter: resource_filters.map { |f| f[:name] }
|
213
211
|
}
|
214
212
|
end
|
215
213
|
|
@@ -217,7 +215,8 @@ module Alchemy
|
|
217
215
|
end
|
218
216
|
|
219
217
|
def items_per_page
|
220
|
-
cookies[:alchemy_items_per_page] =
|
218
|
+
cookies[:alchemy_items_per_page] =
|
219
|
+
params[:per_page] || cookies[:alchemy_items_per_page] || Alchemy::Config.get(:items_per_page)
|
221
220
|
end
|
222
221
|
|
223
222
|
def items_per_page_options
|
@@ -6,31 +6,31 @@ module Alchemy
|
|
6
6
|
before_action :load_tag, only: [:edit, :update, :destroy]
|
7
7
|
|
8
8
|
def index
|
9
|
-
@query =
|
9
|
+
@query = Tag.ransack(search_filter_params[:q])
|
10
10
|
@query.sorts = default_sort_order if @query.sorts.empty?
|
11
11
|
@tags = @query
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
.result
|
13
|
+
.page(params[:page] || 1)
|
14
|
+
.per(items_per_page)
|
15
|
+
.order("name ASC")
|
16
16
|
end
|
17
17
|
|
18
18
|
def new
|
19
|
-
@tag =
|
19
|
+
@tag = Tag.new
|
20
20
|
end
|
21
21
|
|
22
22
|
def create
|
23
|
-
@tag =
|
23
|
+
@tag = Tag.create(tag_params)
|
24
24
|
render_errors_or_redirect @tag, admin_tags_path, Alchemy.t("New Tag Created")
|
25
25
|
end
|
26
26
|
|
27
27
|
def edit
|
28
|
-
@tags =
|
28
|
+
@tags = Tag.order("name ASC").to_a - [@tag]
|
29
29
|
end
|
30
30
|
|
31
31
|
def update
|
32
32
|
if tag_params[:merge_to]
|
33
|
-
@new_tag =
|
33
|
+
@new_tag = Tag.find(tag_params[:merge_to])
|
34
34
|
Tag.replace(@tag, @new_tag)
|
35
35
|
operation_text = Alchemy.t("Replaced Tag") % {old_tag: @tag.name, new_tag: @new_tag.name}
|
36
36
|
@tag.destroy
|
@@ -57,7 +57,7 @@ module Alchemy
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def load_tag
|
60
|
-
@tag =
|
60
|
+
@tag = Tag.find(params[:id])
|
61
61
|
end
|
62
62
|
|
63
63
|
def tag_params
|
@@ -67,7 +67,7 @@ module Alchemy
|
|
67
67
|
def tags_from_term(term)
|
68
68
|
return [] if term.blank?
|
69
69
|
|
70
|
-
|
70
|
+
Tag.where(["LOWER(name) LIKE ?", "#{term.downcase}%"])
|
71
71
|
end
|
72
72
|
|
73
73
|
def json_for_autocomplete(items, attribute)
|
@@ -12,11 +12,11 @@ module Alchemy
|
|
12
12
|
private
|
13
13
|
|
14
14
|
def render_not_authorized
|
15
|
-
render json: {
|
15
|
+
render json: {error: "Not authorized"}, status: 403
|
16
16
|
end
|
17
17
|
|
18
18
|
def render_not_found
|
19
|
-
render json: {
|
19
|
+
render json: {error: "Record not found"}, status: 404
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -10,18 +10,18 @@ module Alchemy
|
|
10
10
|
#
|
11
11
|
def index
|
12
12
|
# Fix for cancancan not able to merge multiple AR scopes for logged in users
|
13
|
-
if cannot? :manage, Alchemy::Element
|
14
|
-
|
13
|
+
@elements = if cannot? :manage, Alchemy::Element
|
14
|
+
Alchemy::Element.accessible_by(current_ability, :index)
|
15
15
|
else
|
16
|
-
|
16
|
+
Alchemy::Element.all
|
17
17
|
end
|
18
18
|
|
19
19
|
@elements = @elements.not_nested.joins(:page_version).merge(PageVersion.published)
|
20
20
|
|
21
|
-
if params[:page_id].present?
|
22
|
-
@elements
|
21
|
+
@elements = if params[:page_id].present?
|
22
|
+
@elements.includes(:page).where(alchemy_pages: {id: params[:page_id]})
|
23
23
|
else
|
24
|
-
@elements
|
24
|
+
@elements.includes(*element_includes)
|
25
25
|
end
|
26
26
|
|
27
27
|
if params[:named].present?
|
@@ -47,15 +47,15 @@ module Alchemy
|
|
47
47
|
{
|
48
48
|
nested_elements: [
|
49
49
|
{
|
50
|
-
ingredients: :related_object
|
50
|
+
ingredients: :related_object
|
51
51
|
},
|
52
|
-
:tags
|
53
|
-
]
|
52
|
+
:tags
|
53
|
+
]
|
54
54
|
},
|
55
55
|
{
|
56
|
-
ingredients: :related_object
|
56
|
+
ingredients: :related_object
|
57
57
|
},
|
58
|
-
:tags
|
58
|
+
:tags
|
59
59
|
]
|
60
60
|
end
|
61
61
|
end
|
@@ -11,7 +11,7 @@ module Alchemy
|
|
11
11
|
|
12
12
|
if params[:page_id].present?
|
13
13
|
@ingredients = @ingredients
|
14
|
-
.where(alchemy_page_versions: {
|
14
|
+
.where(alchemy_page_versions: {page_id: params[:page_id]})
|
15
15
|
.merge(Alchemy::PageVersion.drafts)
|
16
16
|
.joins(element: :page_version)
|
17
17
|
end
|
@@ -35,7 +35,7 @@ module Alchemy
|
|
35
35
|
ability: current_ability,
|
36
36
|
user: current_alchemy_user,
|
37
37
|
elements: params[:elements],
|
38
|
-
full: true
|
38
|
+
full: true
|
39
39
|
)
|
40
40
|
end
|
41
41
|
|
@@ -72,7 +72,7 @@ module Alchemy
|
|
72
72
|
|
73
73
|
Language.current.pages.where(
|
74
74
|
urlname: params[:urlname],
|
75
|
-
language_code: params[:locale] || Language.current.code
|
75
|
+
language_code: params[:locale] || Language.current.code
|
76
76
|
).includes(page_includes).first
|
77
77
|
end
|
78
78
|
|
@@ -80,7 +80,7 @@ module Alchemy
|
|
80
80
|
{
|
81
81
|
total_count: total_count_value,
|
82
82
|
per_page: per_page_value,
|
83
|
-
page: page_value
|
83
|
+
page: page_value
|
84
84
|
}
|
85
85
|
end
|
86
86
|
|
@@ -97,7 +97,7 @@ module Alchemy
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def page_value
|
100
|
-
params[:page]
|
100
|
+
params[:page]&.to_i
|
101
101
|
end
|
102
102
|
|
103
103
|
def page_includes
|
@@ -109,17 +109,17 @@ module Alchemy
|
|
109
109
|
{
|
110
110
|
nested_elements: [
|
111
111
|
{
|
112
|
-
ingredients: :related_object
|
112
|
+
ingredients: :related_object
|
113
113
|
},
|
114
|
-
:tags
|
115
|
-
]
|
114
|
+
:tags
|
115
|
+
]
|
116
116
|
},
|
117
117
|
{
|
118
|
-
ingredients: :related_object
|
118
|
+
ingredients: :related_object
|
119
119
|
},
|
120
|
-
:tags
|
121
|
-
]
|
122
|
-
}
|
120
|
+
:tags
|
121
|
+
]
|
122
|
+
}
|
123
123
|
]
|
124
124
|
end
|
125
125
|
end
|
@@ -13,8 +13,8 @@ module Alchemy
|
|
13
13
|
{
|
14
14
|
filename: @attachment.file_name,
|
15
15
|
type: @attachment.file_mime_type,
|
16
|
-
disposition: "inline"
|
17
|
-
}
|
16
|
+
disposition: "inline"
|
17
|
+
}
|
18
18
|
)
|
19
19
|
end
|
20
20
|
|
@@ -24,7 +24,7 @@ module Alchemy
|
|
24
24
|
send_file(
|
25
25
|
@attachment.file.path, {
|
26
26
|
filename: @attachment.file_name,
|
27
|
-
type: @attachment.file_mime_type
|
27
|
+
type: @attachment.file_mime_type
|
28
28
|
}
|
29
29
|
)
|
30
30
|
end
|
@@ -41,19 +41,19 @@ module Alchemy
|
|
41
41
|
|
42
42
|
helper "alchemy/pages"
|
43
43
|
|
44
|
-
def index
|
44
|
+
def index # :nodoc:
|
45
45
|
redirect_to show_page_path(
|
46
46
|
urlname: @page.urlname,
|
47
|
-
locale: prefix_locale? ? @page.language_code : nil
|
47
|
+
locale: prefix_locale? ? @page.language_code : nil
|
48
48
|
)
|
49
49
|
end
|
50
50
|
|
51
|
-
def new
|
51
|
+
def new # :nodoc:
|
52
52
|
@message = Message.new
|
53
53
|
render template: "alchemy/pages/show"
|
54
54
|
end
|
55
55
|
|
56
|
-
def create
|
56
|
+
def create # :nodoc:
|
57
57
|
@message = Message.new(message_params)
|
58
58
|
@message.ip = request.remote_ip
|
59
59
|
@element = Element.find_by(id: @message.contact_form_id)
|
@@ -90,16 +90,16 @@ module Alchemy
|
|
90
90
|
|
91
91
|
def redirect_to_success_page
|
92
92
|
flash[:notice] = Alchemy.t(:success, scope: "contactform.messages")
|
93
|
-
if success_page
|
94
|
-
|
93
|
+
urlname = if success_page
|
94
|
+
success_page_urlname
|
95
95
|
elsif mailer_config["forward_to_page"] && mailer_config["mail_success_page"]
|
96
|
-
|
96
|
+
Page.find_by(urlname: mailer_config["mail_success_page"]).urlname
|
97
97
|
else
|
98
|
-
|
98
|
+
Language.current_root_page.urlname
|
99
99
|
end
|
100
100
|
redirect_to show_page_path(
|
101
101
|
urlname: urlname,
|
102
|
-
locale: prefix_locale? ? Language.current.code : nil
|
102
|
+
locale: prefix_locale? ? Language.current.code : nil
|
103
103
|
)
|
104
104
|
end
|
105
105
|
|
@@ -6,7 +6,7 @@ module Alchemy
|
|
6
6
|
"action",
|
7
7
|
"controller",
|
8
8
|
"urlname",
|
9
|
-
"locale"
|
9
|
+
"locale"
|
10
10
|
]
|
11
11
|
|
12
12
|
include OnPageLayout::CallbacksRunner
|
@@ -104,13 +104,7 @@ module Alchemy
|
|
104
104
|
# If no index page and no admin users are present we show the "Welcome to Alchemy" page.
|
105
105
|
#
|
106
106
|
def load_index_page
|
107
|
-
@page ||=
|
108
|
-
.contentpages
|
109
|
-
.language_roots
|
110
|
-
.where(language: Language.current)
|
111
|
-
.includes(page_includes)
|
112
|
-
.first
|
113
|
-
|
107
|
+
@page ||= Language.current_root_page
|
114
108
|
render template: "alchemy/welcome", layout: false if signup_required?
|
115
109
|
end
|
116
110
|
|
@@ -126,11 +120,10 @@ module Alchemy
|
|
126
120
|
def load_page
|
127
121
|
page_not_found! unless Language.current
|
128
122
|
|
129
|
-
@page ||=
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
.find_by(urlname: params[:urlname])
|
123
|
+
@page ||= Language.current.pages.contentpages.find_by(
|
124
|
+
urlname: params[:urlname],
|
125
|
+
language_code: params[:locale] || Language.current.code
|
126
|
+
)
|
134
127
|
end
|
135
128
|
|
136
129
|
def enforce_locale
|
@@ -149,7 +142,7 @@ module Alchemy
|
|
149
142
|
def page_locale_redirect_url(options = {})
|
150
143
|
options = {
|
151
144
|
locale: prefix_locale? ? @page.language_code : nil,
|
152
|
-
urlname: @page.urlname
|
145
|
+
urlname: @page.urlname
|
153
146
|
}.merge(options)
|
154
147
|
|
155
148
|
alchemy.show_page_path additional_params.merge(options)
|
@@ -223,7 +216,7 @@ module Alchemy
|
|
223
216
|
etag: page_etag,
|
224
217
|
last_modified: @page.published_at,
|
225
218
|
public: !@page.restricted,
|
226
|
-
template: "pages/show"
|
219
|
+
template: "pages/show"
|
227
220
|
)
|
228
221
|
end
|
229
222
|
|
@@ -235,9 +228,5 @@ module Alchemy
|
|
235
228
|
def page_not_found!
|
236
229
|
not_found_error!("Alchemy::Page not found \"#{request.fullpath}\"")
|
237
230
|
end
|
238
|
-
|
239
|
-
def page_includes
|
240
|
-
Alchemy::EagerLoading.page_includes(version: :public_version)
|
241
|
-
end
|
242
231
|
end
|
243
232
|
end
|
@@ -8,12 +8,11 @@ module Alchemy
|
|
8
8
|
def successful_uploader_response(file:, status: :created)
|
9
9
|
message = Alchemy.t(:upload_success,
|
10
10
|
scope: [:uploader, file.class.model_name.i18n_key],
|
11
|
-
name: file.name
|
12
|
-
)
|
11
|
+
name: file.name)
|
13
12
|
|
14
13
|
{
|
15
14
|
json: uploader_response(file: file, message: message),
|
16
|
-
status: status
|
15
|
+
status: status
|
17
16
|
}
|
18
17
|
end
|
19
18
|
|
@@ -21,12 +20,11 @@ module Alchemy
|
|
21
20
|
message = Alchemy.t(:upload_failure,
|
22
21
|
scope: [:uploader, file.class.model_name.i18n_key],
|
23
22
|
error: file.errors[:file].join,
|
24
|
-
name: file.name
|
25
|
-
)
|
23
|
+
name: file.name)
|
26
24
|
|
27
25
|
{
|
28
26
|
json: uploader_response(file: file, message: message),
|
29
|
-
status: :unprocessable_entity
|
27
|
+
status: :unprocessable_entity
|
30
28
|
}
|
31
29
|
end
|
32
30
|
|
@@ -35,7 +33,7 @@ module Alchemy
|
|
35
33
|
def uploader_response(file:, message:)
|
36
34
|
{
|
37
35
|
files: [file.to_jq_upload],
|
38
|
-
growl_message: message
|
36
|
+
growl_message: message
|
39
37
|
}
|
40
38
|
end
|
41
39
|
end
|