alchemy_cms 4.3.2 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +92 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +59 -2
- data/Gemfile +6 -5
- data/README.md +7 -6
- data/alchemy_cms.gemspec +4 -2
- data/app/assets/config/alchemy_manifest.js +15 -0
- data/app/assets/javascripts/alchemy/admin.js +1 -0
- data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +1 -13
- data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +84 -87
- data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +0 -4
- data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +1 -1
- data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +2 -2
- data/app/assets/javascripts/alchemy/page_select.js +41 -0
- data/app/assets/javascripts/alchemy/templates/index.js +1 -0
- data/app/assets/javascripts/alchemy/templates/page.hbs +9 -0
- data/app/assets/stylesheets/alchemy/_mixins.scss +11 -1
- data/app/assets/stylesheets/alchemy/admin.scss +3 -0
- data/app/assets/stylesheets/alchemy/elements.scss +1 -0
- data/app/assets/stylesheets/alchemy/forms.scss +6 -5
- data/app/assets/stylesheets/alchemy/labels.scss +6 -0
- data/app/assets/stylesheets/alchemy/nodes.scss +154 -0
- data/app/assets/stylesheets/alchemy/page-select.scss +30 -0
- data/app/assets/stylesheets/alchemy/selects.scss +39 -22
- data/app/assets/stylesheets/alchemy/sitemap.scss +0 -33
- data/app/assets/stylesheets/alchemy/tags.scss +0 -3
- data/app/controllers/alchemy/admin/base_controller.rb +1 -0
- data/app/controllers/alchemy/admin/elements_controller.rb +24 -11
- data/app/controllers/alchemy/admin/languages_controller.rb +5 -0
- data/app/controllers/alchemy/admin/nodes_controller.rb +43 -0
- data/app/controllers/alchemy/admin/pages_controller.rb +1 -21
- data/app/controllers/alchemy/admin/resources_controller.rb +1 -1
- data/app/controllers/alchemy/admin/tags_controller.rb +1 -2
- data/app/controllers/alchemy/api/contents_controller.rb +17 -2
- data/app/controllers/alchemy/api/elements_controller.rb +26 -1
- data/app/controllers/alchemy/api/pages_controller.rb +78 -7
- data/app/controllers/alchemy/messages_controller.rb +23 -8
- data/app/helpers/alchemy/admin/contents_helper.rb +1 -1
- data/app/helpers/alchemy/admin/elements_helper.rb +6 -0
- data/app/helpers/alchemy/admin/essences_helper.rb +23 -4
- data/app/helpers/alchemy/elements_block_helper.rb +11 -3
- data/app/helpers/alchemy/elements_helper.rb +3 -3
- data/app/helpers/alchemy/essences_helper.rb +36 -9
- data/app/helpers/alchemy/pages_helper.rb +29 -0
- data/app/models/alchemy/content.rb +1 -1
- data/app/models/alchemy/element.rb +20 -8
- data/app/models/alchemy/element/element_contents.rb +6 -4
- data/app/models/alchemy/element/presenters.rb +2 -2
- data/app/models/alchemy/essence_page.rb +29 -0
- data/app/models/alchemy/essence_picture.rb +8 -3
- data/app/models/alchemy/language.rb +10 -2
- data/app/models/alchemy/node.rb +48 -0
- data/app/models/alchemy/page.rb +74 -3
- data/app/models/alchemy/page/page_elements.rb +12 -4
- data/app/models/alchemy/page/page_natures.rb +6 -0
- data/app/models/alchemy/page/page_scopes.rb +1 -1
- data/app/models/alchemy/picture.rb +5 -1
- data/app/models/concerns/alchemy/content_touching.rb +1 -1
- data/app/serializers/alchemy/element_serializer.rb +7 -1
- data/app/serializers/alchemy/page_serializer.rb +0 -4
- data/app/views/alchemy/_menubar.html.erb +1 -1
- data/app/views/alchemy/admin/elements/_element.html.erb +18 -2
- data/app/views/alchemy/admin/leave.html.erb +1 -1
- data/app/views/alchemy/admin/nodes/_form.html.erb +39 -0
- data/app/views/alchemy/admin/nodes/_node.html.erb +87 -0
- data/app/views/alchemy/admin/nodes/edit.html.erb +1 -0
- data/app/views/alchemy/admin/nodes/index.html.erb +58 -0
- data/app/views/alchemy/admin/nodes/new.html.erb +1 -0
- data/app/views/alchemy/admin/pages/_anchor_link.html.erb +22 -0
- data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
- data/app/views/alchemy/admin/pages/_internal_link.html.erb +7 -11
- data/app/views/alchemy/admin/pages/_menu_fields.html.erb +33 -0
- data/app/views/alchemy/admin/pages/_sitemap.html.erb +0 -7
- data/app/views/alchemy/admin/pages/link.html.erb +4 -0
- data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +7 -3
- data/app/views/alchemy/admin/partials/_routes.html.erb +3 -3
- data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_date_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_file_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_html_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_link_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_page_editor.html.erb +23 -0
- data/app/views/alchemy/essences/_essence_page_view.html.erb +5 -0
- data/app/views/alchemy/essences/_essence_picture_editor.html.erb +2 -0
- data/app/views/alchemy/essences/_essence_picture_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_richtext_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_select_editor.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_select_view.html.erb +1 -0
- data/app/views/alchemy/essences/_essence_text_editor.html.erb +3 -0
- data/app/views/alchemy/essences/_essence_text_view.html.erb +1 -0
- data/config/alchemy/modules.yml +13 -4
- data/config/initializers/assets.rb +1 -13
- data/config/locales/alchemy.en.yml +27 -9
- data/config/routes.rb +11 -3
- data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +8 -0
- data/db/migrate/20191029212236_create_alchemy_nodes.rb +24 -0
- data/lib/alchemy/admin/locale.rb +1 -1
- data/lib/alchemy/auth_accessors.rb +8 -2
- data/lib/alchemy/cache_digests/template_tracker.rb +8 -5
- data/lib/alchemy/elements_finder.rb +17 -14
- data/lib/alchemy/engine.rb +4 -0
- data/lib/alchemy/essence.rb +40 -2
- data/lib/alchemy/permissions.rb +2 -0
- data/lib/alchemy/tasks/tidy.rb +1 -1
- data/lib/alchemy/test_support/essence_shared_examples.rb +25 -8
- data/lib/alchemy/test_support/factories/essence_page_factory.rb +10 -0
- data/lib/alchemy/test_support/factories/essence_picture_factory.rb +5 -0
- data/lib/alchemy/test_support/factories/node_factory.rb +21 -0
- data/lib/alchemy/version.rb +1 -1
- data/lib/rails/generators/alchemy/elements/elements_generator.rb +0 -1
- data/lib/rails/generators/alchemy/elements/templates/view.html.erb +3 -3
- data/lib/rails/generators/alchemy/elements/templates/view.html.haml +3 -3
- data/lib/rails/generators/alchemy/elements/templates/view.html.slim +3 -3
- data/lib/rails/generators/alchemy/install/files/{_article_view.html.erb → _article.html.erb} +2 -2
- data/lib/rails/generators/alchemy/install/files/application.html.erb +13 -10
- data/lib/rails/generators/alchemy/install/install_generator.rb +2 -11
- data/lib/rails/generators/alchemy/menus/menus_generator.rb +24 -0
- data/lib/rails/generators/alchemy/menus/templates/node.html.erb +19 -0
- data/lib/rails/generators/alchemy/menus/templates/node.html.haml +16 -0
- data/lib/rails/generators/alchemy/menus/templates/node.html.slim +16 -0
- data/lib/rails/generators/alchemy/menus/templates/wrapper.html.erb +8 -0
- data/lib/rails/generators/alchemy/menus/templates/wrapper.html.haml +6 -0
- data/lib/rails/generators/alchemy/menus/templates/wrapper.html.slim +6 -0
- data/lib/rails/generators/alchemy/views/views_generator.rb +1 -1
- data/lib/tasks/alchemy/convert.rake +60 -0
- metadata +79 -20
- data/.rspec +0 -1
- data/.travis.yml +0 -28
- data/app/models/alchemy/page/page_users.rb +0 -60
- data/app/views/alchemy/admin/elements/list.html.erb +0 -16
- data/app/views/alchemy/admin/pages/_page_for_links.html.erb +0 -53
- data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +0 -9
- data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +0 -8
- data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +0 -8
- data/lib/rails/generators/alchemy/install/files/_article_editor.html.erb +0 -5
- data/lib/rails/generators/alchemy/install/files/alchemy.de.yml +0 -31
- data/lib/rails/generators/alchemy/install/files/alchemy.es.yml +0 -31
|
@@ -47,30 +47,6 @@
|
|
|
47
47
|
text-overflow: ellipsis;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
#page_selector_container {
|
|
51
|
-
height: 230px;
|
|
52
|
-
background-color: $light-gray;
|
|
53
|
-
margin-bottom: 4px;
|
|
54
|
-
border-width: $form-field-border-width;
|
|
55
|
-
border-style: $form-field-border-style;
|
|
56
|
-
border-color: $form-field-border-color;
|
|
57
|
-
overflow: auto;
|
|
58
|
-
padding: 4px 0 0 4px;
|
|
59
|
-
border-radius: $default-border-radius;
|
|
60
|
-
|
|
61
|
-
.sitemap_pagename_link:hover {
|
|
62
|
-
text-decoration: none;
|
|
63
|
-
|
|
64
|
-
&:after {
|
|
65
|
-
display: none;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
.sitemap_right_tools {
|
|
70
|
-
width: 24px;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
50
|
.sitemap_line_spacer {
|
|
75
51
|
float: left;
|
|
76
52
|
width: 20px;
|
|
@@ -177,11 +153,6 @@
|
|
|
177
153
|
li {
|
|
178
154
|
padding-left: 0;
|
|
179
155
|
|
|
180
|
-
.selected_page {
|
|
181
|
-
background-color: $linked-color;
|
|
182
|
-
color: $dark-gray;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
156
|
li {
|
|
186
157
|
padding-left: $sitemap-line-height;
|
|
187
158
|
padding-right: 0;
|
|
@@ -245,7 +216,3 @@
|
|
|
245
216
|
.page_icon { cursor: default }
|
|
246
217
|
}
|
|
247
218
|
}
|
|
248
|
-
|
|
249
|
-
.elements_from_page_selector {
|
|
250
|
-
width: 100%;
|
|
251
|
-
}
|
|
@@ -8,16 +8,8 @@ module Alchemy
|
|
|
8
8
|
|
|
9
9
|
def index
|
|
10
10
|
@page = Page.find(params[:page_id])
|
|
11
|
-
@elements = @page.all_elements.not_nested.unfixed.not_trashed
|
|
12
|
-
@fixed_elements = @page.all_elements.fixed.not_trashed
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def list
|
|
16
|
-
@page_id = params[:page_id]
|
|
17
|
-
if @page_id.blank? && !params[:page_urlname].blank?
|
|
18
|
-
@page_id = Language.current.pages.find_by(urlname: params[:page_urlname]).id
|
|
19
|
-
end
|
|
20
|
-
@elements = Element.published.where(page_id: @page_id)
|
|
11
|
+
@elements = @page.all_elements.not_nested.unfixed.not_trashed.includes(*element_includes)
|
|
12
|
+
@fixed_elements = @page.all_elements.fixed.not_trashed.includes(*element_includes)
|
|
21
13
|
end
|
|
22
14
|
|
|
23
15
|
def new
|
|
@@ -61,7 +53,7 @@ module Alchemy
|
|
|
61
53
|
def update
|
|
62
54
|
if @element.update_contents(contents_params)
|
|
63
55
|
@page = @element.page
|
|
64
|
-
@element_validated = @element.
|
|
56
|
+
@element_validated = @element.update(element_params)
|
|
65
57
|
else
|
|
66
58
|
@element_validated = false
|
|
67
59
|
@notice = Alchemy.t('Validation failed')
|
|
@@ -104,6 +96,27 @@ module Alchemy
|
|
|
104
96
|
|
|
105
97
|
private
|
|
106
98
|
|
|
99
|
+
def element_includes
|
|
100
|
+
[
|
|
101
|
+
{
|
|
102
|
+
contents: {
|
|
103
|
+
essence: :ingredient_association
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
:tags,
|
|
107
|
+
{
|
|
108
|
+
all_nested_elements: [
|
|
109
|
+
{
|
|
110
|
+
contents: {
|
|
111
|
+
essence: :ingredient_association
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
:tags
|
|
115
|
+
]
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
end
|
|
119
|
+
|
|
107
120
|
def load_element
|
|
108
121
|
@element = Element.find(params[:id])
|
|
109
122
|
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Alchemy
|
|
4
|
+
module Admin
|
|
5
|
+
class NodesController < Admin::ResourcesController
|
|
6
|
+
def index
|
|
7
|
+
@root_nodes = Node.language_root_nodes
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def new
|
|
11
|
+
@node = Node.new(
|
|
12
|
+
parent_id: params[:parent_id],
|
|
13
|
+
language: Language.current
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def toggle
|
|
18
|
+
node = Node.find(params[:id])
|
|
19
|
+
node.update(folded: !node.folded)
|
|
20
|
+
if node.folded?
|
|
21
|
+
head :ok
|
|
22
|
+
else
|
|
23
|
+
render partial: 'node', collection: node.children.includes(:page, :children)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def resource_params
|
|
30
|
+
params.require(:node).permit(
|
|
31
|
+
:parent_id,
|
|
32
|
+
:language_id,
|
|
33
|
+
:page_id,
|
|
34
|
+
:name,
|
|
35
|
+
:url,
|
|
36
|
+
:title,
|
|
37
|
+
:nofollow,
|
|
38
|
+
:external
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -26,7 +26,6 @@ module Alchemy
|
|
|
26
26
|
def index
|
|
27
27
|
authorize! :index, :alchemy_admin_pages
|
|
28
28
|
|
|
29
|
-
@languages = Language.on_current_site
|
|
30
29
|
if !@page_root
|
|
31
30
|
@language = Language.current
|
|
32
31
|
@languages_with_page_tree = Language.on_current_site.with_root_page
|
|
@@ -104,7 +103,7 @@ module Alchemy
|
|
|
104
103
|
def update
|
|
105
104
|
# stores old page_layout value, because unfurtunally rails @page.changes does not work here.
|
|
106
105
|
@old_page_layout = @page.page_layout
|
|
107
|
-
if @page.
|
|
106
|
+
if @page.update(page_params)
|
|
108
107
|
@notice = Alchemy.t("Page saved", name: @page.name)
|
|
109
108
|
@while_page_edit = request.referer.include?('edit')
|
|
110
109
|
|
|
@@ -140,12 +139,6 @@ module Alchemy
|
|
|
140
139
|
end
|
|
141
140
|
|
|
142
141
|
def link
|
|
143
|
-
if configuration(:show_real_root)
|
|
144
|
-
@page_root = Page.root
|
|
145
|
-
else
|
|
146
|
-
set_root_page
|
|
147
|
-
end
|
|
148
|
-
@content_id = params[:content_id]
|
|
149
142
|
@attachments = Attachment.all.collect { |f|
|
|
150
143
|
[f.name, download_attachment_path(id: f.id, name: f.urlname)]
|
|
151
144
|
}
|
|
@@ -219,11 +212,6 @@ module Alchemy
|
|
|
219
212
|
do_redirect_to admin_pages_path
|
|
220
213
|
end
|
|
221
214
|
|
|
222
|
-
def switch_language
|
|
223
|
-
set_alchemy_language(params[:language_id])
|
|
224
|
-
do_redirect_to redirect_path_for_switch_language
|
|
225
|
-
end
|
|
226
|
-
|
|
227
215
|
def flush
|
|
228
216
|
Language.current.pages.flushables.update_all(published_at: Time.current)
|
|
229
217
|
# We need to ensure, that also all layoutpages get the +published_at+ timestamp set,
|
|
@@ -341,14 +329,6 @@ module Alchemy
|
|
|
341
329
|
end
|
|
342
330
|
end
|
|
343
331
|
|
|
344
|
-
def redirect_path_for_switch_language
|
|
345
|
-
if request.referer && request.referer.include?('admin/layoutpages')
|
|
346
|
-
admin_layoutpages_path
|
|
347
|
-
else
|
|
348
|
-
admin_pages_path
|
|
349
|
-
end
|
|
350
|
-
end
|
|
351
|
-
|
|
352
332
|
def redirect_path_after_create_page
|
|
353
333
|
if @page.redirects_to_external? || !@page.editable_by?(current_alchemy_user)
|
|
354
334
|
admin_pages_path
|
|
@@ -68,7 +68,7 @@ module Alchemy
|
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
def update
|
|
71
|
-
resource_instance_variable.
|
|
71
|
+
resource_instance_variable.update(resource_params)
|
|
72
72
|
render_errors_or_redirect(
|
|
73
73
|
resource_instance_variable,
|
|
74
74
|
resources_path(resource_instance_variable.class, search_filter_params),
|
|
@@ -34,8 +34,7 @@ module Alchemy
|
|
|
34
34
|
operation_text = Alchemy.t('Replaced Tag') % {old_tag: @tag.name, new_tag: @new_tag.name}
|
|
35
35
|
@tag.destroy
|
|
36
36
|
else
|
|
37
|
-
@tag.
|
|
38
|
-
@tag.save
|
|
37
|
+
@tag.update(tag_params)
|
|
39
38
|
operation_text = Alchemy.t(:successfully_updated_tag)
|
|
40
39
|
end
|
|
41
40
|
render_errors_or_redirect @tag, admin_tags_path, operation_text
|
|
@@ -16,6 +16,8 @@ module Alchemy
|
|
|
16
16
|
if params[:element_id].present?
|
|
17
17
|
@contents = @contents.where(element_id: params[:element_id])
|
|
18
18
|
end
|
|
19
|
+
@contents = @contents.includes(*content_includes)
|
|
20
|
+
|
|
19
21
|
render json: @contents, adapter: :json, root: 'contents'
|
|
20
22
|
end
|
|
21
23
|
|
|
@@ -30,12 +32,25 @@ module Alchemy
|
|
|
30
32
|
#
|
|
31
33
|
def show
|
|
32
34
|
if params[:id]
|
|
33
|
-
@content = Content.
|
|
35
|
+
@content = Content.where(id: params[:id]).includes(:essence).first
|
|
34
36
|
elsif params[:element_id] && params[:name]
|
|
35
|
-
@content = Content.
|
|
37
|
+
@content = Content.where(
|
|
38
|
+
element_id: params[:element_id],
|
|
39
|
+
name: params[:name]
|
|
40
|
+
).includes(*content_includes).first || raise(ActiveRecord::RecordNotFound)
|
|
36
41
|
end
|
|
37
42
|
authorize! :show, @content
|
|
38
43
|
respond_with @content
|
|
39
44
|
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def content_includes
|
|
49
|
+
[
|
|
50
|
+
{
|
|
51
|
+
essence: :ingredient_association
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
end
|
|
40
55
|
end
|
|
41
56
|
end
|
|
@@ -20,15 +20,40 @@ module Alchemy
|
|
|
20
20
|
if params[:named].present?
|
|
21
21
|
@elements = @elements.named(params[:named])
|
|
22
22
|
end
|
|
23
|
+
@elements = @elements.includes(*element_includes)
|
|
24
|
+
|
|
23
25
|
render json: @elements, adapter: :json, root: 'elements'
|
|
24
26
|
end
|
|
25
27
|
|
|
26
28
|
# Returns a json object for element
|
|
27
29
|
#
|
|
28
30
|
def show
|
|
29
|
-
@element = Element.
|
|
31
|
+
@element = Element.where(id: params[:id]).includes(*element_includes).first
|
|
30
32
|
authorize! :show, @element
|
|
31
33
|
respond_with @element
|
|
32
34
|
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def element_includes
|
|
39
|
+
[
|
|
40
|
+
{
|
|
41
|
+
nested_elements: [
|
|
42
|
+
{
|
|
43
|
+
contents: {
|
|
44
|
+
essence: :ingredient_association
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
:tags
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
contents: {
|
|
52
|
+
essence: :ingredient_association
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
:tags
|
|
56
|
+
]
|
|
57
|
+
end
|
|
33
58
|
end
|
|
34
59
|
end
|
|
@@ -13,10 +13,24 @@ module Alchemy
|
|
|
13
13
|
else
|
|
14
14
|
@pages = Page.accessible_by(current_ability, :index)
|
|
15
15
|
end
|
|
16
|
+
@pages = @pages.includes(*page_includes)
|
|
16
17
|
if params[:page_layout].present?
|
|
18
|
+
Alchemy::Deprecation.warn <<~WARN
|
|
19
|
+
Passing page_layout parameter to Alchemy::Api::PagesController#index is deprecated.
|
|
20
|
+
Please pass a Ransack search query instead:
|
|
21
|
+
q: {
|
|
22
|
+
page_layout_eq: '#{params[:page_layout]}'
|
|
23
|
+
}
|
|
24
|
+
WARN
|
|
17
25
|
@pages = @pages.where(page_layout: params[:page_layout])
|
|
18
26
|
end
|
|
19
|
-
|
|
27
|
+
@pages = @pages.ransack(params[:q]).result
|
|
28
|
+
|
|
29
|
+
if params[:page]
|
|
30
|
+
@pages = @pages.page(params[:page]).per(params[:per_page])
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
render json: @pages, adapter: :json, root: 'pages', meta: meta_data
|
|
20
34
|
end
|
|
21
35
|
|
|
22
36
|
# Returns all pages as nested json object for tree views
|
|
@@ -47,12 +61,69 @@ module Alchemy
|
|
|
47
61
|
private
|
|
48
62
|
|
|
49
63
|
def load_page
|
|
50
|
-
@page =
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
64
|
+
@page = load_page_by_id || load_page_by_urlname || raise(ActiveRecord::RecordNotFound)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def load_page_by_id
|
|
68
|
+
# The route param is called :urlname although it might be an integer
|
|
69
|
+
Page.where(id: params[:urlname]).includes(page_includes).first
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def load_page_by_urlname
|
|
73
|
+
Language.current.pages.where(
|
|
74
|
+
urlname: params[:urlname],
|
|
75
|
+
language_code: params[:locale] || Language.current.code
|
|
76
|
+
).includes(page_includes).first
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def meta_data
|
|
80
|
+
{
|
|
81
|
+
total_count: total_count_value,
|
|
82
|
+
per_page: per_page_value,
|
|
83
|
+
page: page_value
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def total_count_value
|
|
88
|
+
params[:page] ? @pages.total_count : @pages.size
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def per_page_value
|
|
92
|
+
if params[:page]
|
|
93
|
+
(params[:per_page] || Kaminari.config.default_per_page).to_i
|
|
94
|
+
else
|
|
95
|
+
@pages.size
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def page_value
|
|
100
|
+
params[:page] ? params[:page].to_i : nil
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def page_includes
|
|
104
|
+
[
|
|
105
|
+
:tags,
|
|
106
|
+
{
|
|
107
|
+
elements: [
|
|
108
|
+
{
|
|
109
|
+
nested_elements: [
|
|
110
|
+
{
|
|
111
|
+
contents: {
|
|
112
|
+
essence: :ingredient_association
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
:tags
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
contents: {
|
|
120
|
+
essence: :ingredient_association
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
:tags
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
]
|
|
56
127
|
end
|
|
57
128
|
end
|
|
58
129
|
end
|
|
@@ -19,7 +19,7 @@ module Alchemy
|
|
|
19
19
|
# - name: mail_from
|
|
20
20
|
# type: EssenceText
|
|
21
21
|
# - name: success_page
|
|
22
|
-
# type:
|
|
22
|
+
# type: EssencePage
|
|
23
23
|
#
|
|
24
24
|
# The fields +mail_to+, +mail_from+, +subject+ and +success_page+ are recommended.
|
|
25
25
|
# The +Alchemy::MessagesController+ uses them to send your mails. So your customer has full controll of these values inside his contactform element.
|
|
@@ -32,14 +32,16 @@ module Alchemy
|
|
|
32
32
|
# elements: [pageheading, heading, contactform]
|
|
33
33
|
# autogenerate: [contactform]
|
|
34
34
|
#
|
|
35
|
-
# Disabling the page caching is
|
|
35
|
+
# Disabling the page caching is strongly recommended!
|
|
36
36
|
#
|
|
37
37
|
# The editor view for your element should have this layout:
|
|
38
38
|
#
|
|
39
|
-
# <%=
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
39
|
+
# <%= element_editor_for(element) do |el| %>
|
|
40
|
+
# <%= el.edit :mail_from %>
|
|
41
|
+
# <%= el.edit :mail_to %>
|
|
42
|
+
# <%= el.edit :subject %>
|
|
43
|
+
# <%= el.edit :success_page %>
|
|
44
|
+
# <% end %>
|
|
43
45
|
#
|
|
44
46
|
# Please have a look at the +alchemy/config/config.yml+ file for further Message settings.
|
|
45
47
|
#
|
|
@@ -97,8 +99,8 @@ module Alchemy
|
|
|
97
99
|
|
|
98
100
|
def redirect_to_success_page
|
|
99
101
|
flash[:notice] = Alchemy.t(:success, scope: 'contactform.messages')
|
|
100
|
-
if
|
|
101
|
-
urlname =
|
|
102
|
+
if success_page
|
|
103
|
+
urlname = success_page_urlname
|
|
102
104
|
elsif mailer_config['forward_to_page'] && mailer_config['mail_success_page']
|
|
103
105
|
urlname = Page.find_by(urlname: mailer_config['mail_success_page']).urlname
|
|
104
106
|
else
|
|
@@ -110,6 +112,19 @@ module Alchemy
|
|
|
110
112
|
)
|
|
111
113
|
end
|
|
112
114
|
|
|
115
|
+
def success_page
|
|
116
|
+
@_success_page ||= @element.ingredient(:success_page)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def success_page_urlname
|
|
120
|
+
case success_page
|
|
121
|
+
when Alchemy::Page
|
|
122
|
+
success_page.urlname
|
|
123
|
+
when String
|
|
124
|
+
success_page
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
113
128
|
def get_page
|
|
114
129
|
@page = Language.current.pages.find_by(page_layout: mailer_config['page_layout_name'])
|
|
115
130
|
if @page.blank?
|