alchemy_cms 5.0.1 → 5.1.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/PULL_REQUEST_TEMPLATE.md +1 -1
- data/.github/workflows/ci.yml +126 -0
- data/.github/workflows/stale.yml +1 -1
- data/.gitignore +1 -0
- data/CHANGELOG.md +66 -2
- data/CONTRIBUTING.md +2 -2
- data/Gemfile +2 -2
- data/README.md +2 -2
- data/alchemy_cms.gemspec +3 -3
- data/app/assets/images/alchemy/missing-image.svg +1 -0
- data/app/assets/javascripts/alchemy/admin.js +0 -1
- data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +1 -4
- data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +0 -3
- data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +29 -4
- data/app/assets/stylesheets/alchemy/_variables.scss +8 -0
- data/app/assets/stylesheets/alchemy/admin.scss +0 -1
- data/app/assets/stylesheets/alchemy/archive.scss +23 -17
- data/app/assets/stylesheets/alchemy/buttons.scss +26 -15
- data/app/assets/stylesheets/alchemy/elements.scss +58 -19
- data/app/assets/stylesheets/alchemy/errors.scss +1 -1
- data/app/assets/stylesheets/alchemy/frame.scss +0 -1
- data/app/assets/stylesheets/alchemy/hints.scss +2 -1
- data/app/assets/stylesheets/alchemy/navigation.scss +7 -10
- data/app/assets/stylesheets/alchemy/pagination.scss +1 -1
- data/app/assets/stylesheets/alchemy/search.scss +13 -3
- data/app/assets/stylesheets/alchemy/selects.scss +26 -20
- data/app/assets/stylesheets/alchemy/tables.scss +38 -9
- data/app/assets/stylesheets/alchemy/tags.scss +19 -31
- data/app/controllers/alchemy/admin/pages_controller.rb +58 -8
- data/app/controllers/alchemy/admin/pictures_controller.rb +13 -6
- data/app/controllers/alchemy/admin/resources_controller.rb +3 -3
- data/app/controllers/alchemy/pages_controller.rb +49 -14
- data/app/decorators/alchemy/element_editor.rb +1 -0
- data/app/helpers/alchemy/admin/base_helper.rb +0 -44
- data/app/helpers/alchemy/admin/navigation_helper.rb +2 -1
- data/app/models/alchemy/attachment.rb +20 -3
- data/app/models/alchemy/attachment/url.rb +40 -0
- data/app/models/alchemy/essence_picture.rb +3 -3
- data/app/models/alchemy/essence_picture_view.rb +5 -3
- data/app/models/alchemy/legacy_page_url.rb +1 -1
- data/app/models/alchemy/page.rb +24 -1
- data/app/models/alchemy/page/page_natures.rb +2 -0
- data/app/models/alchemy/page/url_path.rb +8 -6
- data/app/models/alchemy/picture.rb +58 -2
- data/app/models/alchemy/picture/calculations.rb +55 -0
- data/app/models/alchemy/picture/transformations.rb +5 -49
- data/app/models/alchemy/picture/url.rb +28 -77
- data/app/models/alchemy/picture_thumb.rb +57 -0
- data/app/models/alchemy/picture_thumb/create.rb +39 -0
- data/app/models/alchemy/picture_thumb/signature.rb +23 -0
- data/app/models/alchemy/picture_thumb/uid.rb +22 -0
- data/app/models/alchemy/picture_variant.rb +114 -0
- data/app/models/alchemy/site/layout.rb +30 -2
- data/app/serializers/alchemy/page_tree_serializer.rb +4 -4
- data/app/views/alchemy/admin/attachments/show.html.erb +8 -8
- data/app/views/alchemy/admin/dashboard/index.html.erb +13 -16
- data/app/views/alchemy/admin/elements/_element_footer.html.erb +1 -1
- data/app/views/alchemy/admin/elements/publish.js.erb +1 -0
- data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
- data/app/views/alchemy/admin/essence_pictures/edit.html.erb +2 -2
- data/app/views/alchemy/admin/layoutpages/edit.html.erb +4 -6
- data/app/views/alchemy/admin/pages/_create_language_form.html.erb +19 -29
- data/app/views/alchemy/admin/pages/_form.html.erb +4 -6
- data/app/views/alchemy/admin/pages/_new_page_form.html.erb +12 -2
- data/app/views/alchemy/admin/pages/_page_layout_filter.html.erb +29 -0
- data/app/views/alchemy/admin/pages/_table.html.erb +27 -0
- data/app/views/alchemy/admin/pages/_table_row.html.erb +107 -0
- data/app/views/alchemy/admin/pages/_toolbar.html.erb +77 -0
- data/app/views/alchemy/admin/pages/edit.html.erb +9 -1
- data/app/views/alchemy/admin/pages/index.html.erb +41 -74
- data/app/views/alchemy/admin/pages/list/_table.html.erb +31 -0
- data/app/views/alchemy/admin/pages/unlock.js.erb +2 -2
- data/app/views/alchemy/admin/pages/update.js.erb +19 -10
- data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +14 -13
- data/app/views/alchemy/admin/partials/_search_form.html.erb +8 -8
- data/app/views/alchemy/admin/pictures/_archive.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_form.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/_picture.html.erb +3 -3
- data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/index.html.erb +1 -1
- data/app/views/alchemy/admin/pictures/show.html.erb +3 -3
- data/app/views/alchemy/admin/resources/_filter_bar.html.erb +13 -11
- data/app/views/alchemy/admin/resources/_per_page_select.html.erb +3 -3
- data/app/views/alchemy/admin/resources/index.html.erb +4 -1
- data/app/views/alchemy/admin/tags/index.html.erb +14 -15
- data/app/views/alchemy/base/500.html.erb +11 -13
- data/app/views/alchemy/essences/_essence_file_view.html.erb +3 -3
- data/config/alchemy/config.yml +15 -11
- data/config/alchemy/modules.yml +12 -12
- data/config/locales/alchemy.en.yml +6 -4
- data/config/routes.rb +1 -1
- data/db/migrate/20200617110713_create_alchemy_picture_thumbs.rb +22 -0
- data/db/migrate/20200907111332_remove_tri_state_booleans.rb +33 -0
- data/lib/alchemy.rb +66 -0
- data/lib/alchemy/admin/preview_url.rb +2 -0
- data/lib/alchemy/auth_accessors.rb +12 -5
- data/lib/alchemy/config.rb +1 -3
- data/lib/alchemy/engine.rb +7 -6
- data/lib/alchemy/modules.rb +11 -1
- data/lib/alchemy/permissions.rb +1 -0
- data/lib/alchemy/test_support/factories/picture_factory.rb +0 -1
- data/lib/alchemy/test_support/factories/picture_thumb_factory.rb +12 -0
- data/lib/alchemy/test_support/integration_helpers.rb +0 -7
- data/lib/alchemy/version.rb +1 -1
- data/lib/alchemy_cms.rb +2 -4
- data/lib/generators/alchemy/install/files/alchemy.en.yml +2 -2
- data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +5 -5
- data/lib/tasks/alchemy/thumbnails.rake +37 -0
- data/vendor/assets/javascripts/jquery_plugins/select2.js +3729 -0
- data/vendor/assets/stylesheets/alchemy_admin/select2.scss +740 -0
- metadata +46 -37
- data/.github/workflows/greetings.yml +0 -13
- data/.travis.yml +0 -48
- data/app/controllers/concerns/alchemy/locale_redirects.rb +0 -40
- data/app/controllers/concerns/alchemy/page_redirects.rb +0 -68
- data/lib/alchemy/userstamp.rb +0 -12
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Alchemy
|
|
4
|
+
class PictureThumb < BaseRecord
|
|
5
|
+
class Signature
|
|
6
|
+
# Returns a unique image process signature
|
|
7
|
+
#
|
|
8
|
+
# @param [Alchemy::PictureVariant]
|
|
9
|
+
#
|
|
10
|
+
# @return [String]
|
|
11
|
+
def self.call(variant)
|
|
12
|
+
steps_without_fetch = variant.image.steps.reject do |step|
|
|
13
|
+
step.is_a?(::Dragonfly::Job::Fetch)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
steps_with_id = [[variant.picture.id]] + steps_without_fetch
|
|
17
|
+
job_string = steps_with_id.map(&:to_a).to_dragonfly_unique_s
|
|
18
|
+
|
|
19
|
+
Digest::SHA1.hexdigest(job_string)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Alchemy
|
|
4
|
+
class PictureThumb < BaseRecord
|
|
5
|
+
class Uid
|
|
6
|
+
# Returns a image variant uid for storage
|
|
7
|
+
#
|
|
8
|
+
# @param [String]
|
|
9
|
+
# @param [Alchemy::PictureVariant]
|
|
10
|
+
#
|
|
11
|
+
# @return [String]
|
|
12
|
+
def self.call(signature, variant)
|
|
13
|
+
picture = variant.picture
|
|
14
|
+
filename = variant.image_file_name || "image"
|
|
15
|
+
name = File.basename(filename, ".*").gsub(/[^\w.]+/, "_")
|
|
16
|
+
ext = variant.render_format
|
|
17
|
+
|
|
18
|
+
"pictures/#{picture.id}/#{signature}/#{name}.#{ext}"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "forwardable"
|
|
4
|
+
|
|
5
|
+
module Alchemy
|
|
6
|
+
# Represents a rendered picture
|
|
7
|
+
#
|
|
8
|
+
# Resizes, crops and encodes the image with imagemagick
|
|
9
|
+
#
|
|
10
|
+
class PictureVariant
|
|
11
|
+
extend Forwardable
|
|
12
|
+
|
|
13
|
+
include Alchemy::Logger
|
|
14
|
+
include Alchemy::Picture::Transformations
|
|
15
|
+
|
|
16
|
+
attr_reader :picture, :render_format
|
|
17
|
+
|
|
18
|
+
def_delegators :@picture,
|
|
19
|
+
:image_file,
|
|
20
|
+
:image_file_width,
|
|
21
|
+
:image_file_height,
|
|
22
|
+
:image_file_name,
|
|
23
|
+
:image_file_size
|
|
24
|
+
|
|
25
|
+
# @param [Alchemy::Picture]
|
|
26
|
+
#
|
|
27
|
+
# @param [Hash] options passed to the image processor
|
|
28
|
+
# @option options [Boolean] :crop Pass true to enable cropping
|
|
29
|
+
# @option options [String] :crop_from Coordinates to start cropping from
|
|
30
|
+
# @option options [String] :crop_size Size of the cropping area
|
|
31
|
+
# @option options [Boolean] :flatten Pass true to flatten GIFs
|
|
32
|
+
# @option options [String|Symbol] :format Image format to encode the image in
|
|
33
|
+
# @option options [Integer] :quality JPEG compress quality
|
|
34
|
+
# @option options [String] :size Size of resulting image in WxH
|
|
35
|
+
# @option options [Boolean] :upsample Pass true to upsample (grow) an image if the original size is lower than the resulting size
|
|
36
|
+
#
|
|
37
|
+
def initialize(picture, options = {})
|
|
38
|
+
raise ArgumentError, "Picture missing!" if picture.nil?
|
|
39
|
+
|
|
40
|
+
@picture = picture
|
|
41
|
+
@options = options
|
|
42
|
+
@render_format = options[:format] || picture.default_render_format
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Process a variant of picture
|
|
46
|
+
#
|
|
47
|
+
# @return [Dragonfly::Attachment|Dragonfly::Job] The processed image variant
|
|
48
|
+
#
|
|
49
|
+
def image
|
|
50
|
+
image = image_file
|
|
51
|
+
|
|
52
|
+
raise MissingImageFileError, "Missing image file for #{picture.inspect}" if image.nil?
|
|
53
|
+
|
|
54
|
+
image = processed_image(image, @options)
|
|
55
|
+
image = encoded_image(image, @options)
|
|
56
|
+
image
|
|
57
|
+
rescue MissingImageFileError, WrongImageFormatError => e
|
|
58
|
+
log_warning(e.message)
|
|
59
|
+
nil
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
# Returns the processed image dependent of size and cropping parameters
|
|
65
|
+
def processed_image(image, options = {})
|
|
66
|
+
size = options[:size]
|
|
67
|
+
upsample = !!options[:upsample]
|
|
68
|
+
|
|
69
|
+
return image unless size.present? && picture.has_convertible_format?
|
|
70
|
+
|
|
71
|
+
if options[:crop]
|
|
72
|
+
crop(size, options[:crop_from], options[:crop_size], upsample)
|
|
73
|
+
else
|
|
74
|
+
resize(size, upsample)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Returns the encoded image
|
|
79
|
+
#
|
|
80
|
+
# Flatten animated gifs, only if converting to a different format.
|
|
81
|
+
# Can be overwritten via +options[:flatten]+.
|
|
82
|
+
#
|
|
83
|
+
def encoded_image(image, options = {})
|
|
84
|
+
unless render_format.in?(Alchemy::Picture.allowed_filetypes)
|
|
85
|
+
raise WrongImageFormatError.new(picture, @render_format)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
options = {
|
|
89
|
+
flatten: render_format != "gif" && picture.image_file_format == "gif",
|
|
90
|
+
}.with_indifferent_access.merge(options)
|
|
91
|
+
|
|
92
|
+
encoding_options = []
|
|
93
|
+
|
|
94
|
+
convert_format = render_format.sub("jpeg", "jpg") != picture.image_file_format.sub("jpeg", "jpg")
|
|
95
|
+
|
|
96
|
+
if render_format =~ /jpe?g/ && convert_format
|
|
97
|
+
quality = options[:quality] || Config.get(:output_image_jpg_quality)
|
|
98
|
+
encoding_options << "-quality #{quality}"
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
if options[:flatten]
|
|
102
|
+
encoding_options << "-flatten"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
convertion_needed = convert_format || encoding_options.present?
|
|
106
|
+
|
|
107
|
+
if picture.has_convertible_format? && convertion_needed
|
|
108
|
+
image = image.encode(render_format, encoding_options.join(" "))
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
image
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -25,10 +25,38 @@ module Alchemy
|
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
# Returns
|
|
28
|
+
# Returns sites layout definition
|
|
29
29
|
#
|
|
30
30
|
def definition
|
|
31
|
-
self.class.definitions.detect { |l| l["name"] == partial_name }
|
|
31
|
+
self.class.definitions.detect { |l| l["name"] == partial_name } || {}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns sites page layout names
|
|
35
|
+
#
|
|
36
|
+
# If no site layout file is defined all page layouts are returned
|
|
37
|
+
#
|
|
38
|
+
# @param [Boolean] layoutpages Return layout pages only (default false)
|
|
39
|
+
#
|
|
40
|
+
# @return [Array<String>] Array of page layout names
|
|
41
|
+
#
|
|
42
|
+
def page_layout_names(layoutpages: false)
|
|
43
|
+
page_layout_definitions.select do |layout|
|
|
44
|
+
!!layout["layoutpage"] && layoutpages || !layout["layoutpage"] && !layoutpages
|
|
45
|
+
end.collect { |layout| layout["name"] }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns sites page layout definitions
|
|
49
|
+
#
|
|
50
|
+
# If no site layout file is defined all page layouts are returned
|
|
51
|
+
#
|
|
52
|
+
def page_layout_definitions
|
|
53
|
+
if definition["page_layouts"].presence
|
|
54
|
+
Alchemy::PageLayout.all.select do |layout|
|
|
55
|
+
layout["name"].in?(definition["page_layouts"])
|
|
56
|
+
end
|
|
57
|
+
else
|
|
58
|
+
Alchemy::PageLayout.all
|
|
59
|
+
end
|
|
32
60
|
end
|
|
33
61
|
|
|
34
62
|
# Returns the name for the layout partial
|
|
@@ -40,7 +40,7 @@ module Alchemy
|
|
|
40
40
|
|
|
41
41
|
level = path.count + base_level
|
|
42
42
|
|
|
43
|
-
path.last[:children] << page_hash(page,
|
|
43
|
+
path.last[:children] << page_hash(page, level, folded)
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
tree
|
|
@@ -48,7 +48,7 @@ module Alchemy
|
|
|
48
48
|
|
|
49
49
|
protected
|
|
50
50
|
|
|
51
|
-
def page_hash(page,
|
|
51
|
+
def page_hash(page, level, folded)
|
|
52
52
|
p_hash = {
|
|
53
53
|
id: page.id,
|
|
54
54
|
name: page.name,
|
|
@@ -59,8 +59,8 @@ module Alchemy
|
|
|
59
59
|
urlname: page.urlname,
|
|
60
60
|
url_path: page.url_path,
|
|
61
61
|
level: level,
|
|
62
|
-
root: page.
|
|
63
|
-
root_or_leaf: page.
|
|
62
|
+
root: page.root?,
|
|
63
|
+
root_or_leaf: page.root? || page.leaf?,
|
|
64
64
|
children: [],
|
|
65
65
|
}
|
|
66
66
|
|
|
@@ -7,15 +7,15 @@
|
|
|
7
7
|
</div>
|
|
8
8
|
<div class="value with-icon">
|
|
9
9
|
<label><%= Alchemy::Attachment.human_attribute_name(:url) %></label>
|
|
10
|
-
<p><%=
|
|
11
|
-
<a data-clipboard-text="<%=
|
|
10
|
+
<p><%= @attachment.url %></p>
|
|
11
|
+
<a data-clipboard-text="<%= @attachment.url %>" class="icon_button--right">
|
|
12
12
|
<%= render_icon(:clipboard, style: 'regular') %>
|
|
13
13
|
</a>
|
|
14
14
|
</div>
|
|
15
15
|
<div class="value with-icon">
|
|
16
16
|
<label><%= Alchemy::Attachment.human_attribute_name(:download_url) %></label>
|
|
17
|
-
<p><%=
|
|
18
|
-
<a data-clipboard-text="<%=
|
|
17
|
+
<p><%= @attachment.url(download: true) %></p>
|
|
18
|
+
<a data-clipboard-text="<%= @attachment.url(download: true) %>" class="icon_button--right">
|
|
19
19
|
<%= render_icon(:clipboard, style: 'regular') %>
|
|
20
20
|
</a>
|
|
21
21
|
</div>
|
|
@@ -24,18 +24,18 @@
|
|
|
24
24
|
<% case @attachment.icon_css_class %>
|
|
25
25
|
<% when "file-image" %>
|
|
26
26
|
<div class="attachment_preview_container image-preview">
|
|
27
|
-
<%= image_tag(
|
|
27
|
+
<%= image_tag(@attachment.url, class: "full_width") %>
|
|
28
28
|
</div>
|
|
29
29
|
<% when "file-audio" %>
|
|
30
30
|
<div class="attachment_preview_container player-preview">
|
|
31
|
-
<%= audio_tag(
|
|
31
|
+
<%= audio_tag(@attachment.url, preload: "none", controls: true, class: "full_width") %>
|
|
32
32
|
</div>
|
|
33
33
|
<% when "file-video" %>
|
|
34
34
|
<div class="attachment_preview_container player-preview">
|
|
35
|
-
<%= video_tag(
|
|
35
|
+
<%= video_tag(@attachment.url, preload: "metadata", controls: true, class: "full_width") %>
|
|
36
36
|
</div>
|
|
37
37
|
<% when "file-pdf" %>
|
|
38
|
-
<iframe src="<%=
|
|
38
|
+
<iframe src="<%= @attachment.url %>" frameborder=0 class="full-iframe">
|
|
39
39
|
Your browser does not support frames.
|
|
40
40
|
</iframe>
|
|
41
41
|
<% end %>
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
<%= toolbar
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
<%= content_for :toolbar do %>
|
|
2
|
+
<%= toolbar_button(
|
|
3
|
+
icon: 'info-circle',
|
|
4
|
+
label: Alchemy.t(:info),
|
|
5
|
+
url: alchemy.dashboard_info_path,
|
|
6
|
+
title: Alchemy.t(:info),
|
|
7
|
+
dialog_options: {
|
|
7
8
|
title: Alchemy.t(:info),
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
],
|
|
16
|
-
search: false
|
|
17
|
-
) %>
|
|
9
|
+
size: "420x435"
|
|
10
|
+
},
|
|
11
|
+
if_permitted_to: [:info, :alchemy_admin_dashboard],
|
|
12
|
+
hotkey: 'alt+i'
|
|
13
|
+
) %>
|
|
14
|
+
<% end %>
|
|
18
15
|
|
|
19
16
|
<div id="dashboard">
|
|
20
17
|
<h1>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
</p>
|
|
6
6
|
<% end %>
|
|
7
7
|
|
|
8
|
-
<button type="submit" form="element_<%= element.id %>_form" class="button" data-alchemy-button>
|
|
8
|
+
<button type="submit" <%= "disabled" unless element.public? %> form="element_<%= element.id %>_form" class="button" data-alchemy-button>
|
|
9
9
|
<%= Alchemy.t(:save) %>
|
|
10
10
|
</button>
|
|
11
11
|
</div>
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
$('#imageToCrop').load(function() {
|
|
35
35
|
Alchemy.ImageCropper.init(
|
|
36
36
|
<%= @initial_box.values.to_json %>,
|
|
37
|
-
<% if @
|
|
37
|
+
<% if @picture.can_be_cropped_to?("#{@min_size[:width]}x#{@min_size[:height]}") %>
|
|
38
38
|
<%= @min_size.values.to_json %>,
|
|
39
39
|
<% else %>
|
|
40
40
|
<%= false %>,
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
<%= f.input :caption, as: @content.settings[:caption_as_textarea] ? 'text' : 'string' %>
|
|
5
5
|
<%= f.input :title %>
|
|
6
6
|
<%= f.input :alt_tag %>
|
|
7
|
-
<%- if @content.settings[:sizes].present? -%>
|
|
7
|
+
<%- if @content.settings[:sizes].present? && @content.settings[:srcset].blank? -%>
|
|
8
8
|
<%= f.input :render_size,
|
|
9
9
|
collection: [
|
|
10
|
-
[Alchemy.t('Layout default'),
|
|
10
|
+
[Alchemy.t('Layout default'), ""]
|
|
11
11
|
] + @content.settings[:sizes].to_a,
|
|
12
12
|
include_blank: false,
|
|
13
13
|
input_html: {class: 'alchemy_selectbox'} %>
|
|
@@ -5,11 +5,9 @@
|
|
|
5
5
|
include_blank: Alchemy.t('Please choose'),
|
|
6
6
|
input_html: {class: 'alchemy_selectbox'} %>
|
|
7
7
|
<%= f.input :name, autofocus: true %>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
</div>
|
|
13
|
-
<% end %>
|
|
8
|
+
<div class="input string">
|
|
9
|
+
<%= f.label :tag_list %>
|
|
10
|
+
<%= render 'alchemy/admin/partials/autocomplete_tag_list', f: f %>
|
|
11
|
+
</div>
|
|
14
12
|
<%= f.submit Alchemy.t(:save) %>
|
|
15
13
|
<% end %>
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
<div class="panel">
|
|
2
2
|
<%= render_message do %>
|
|
3
|
-
<p><%= Alchemy.t(:
|
|
3
|
+
<p><%= Alchemy.t(:homepage_does_not_exist) %></p>
|
|
4
4
|
<% end %>
|
|
5
|
-
<%- if @language -%>
|
|
6
5
|
|
|
7
6
|
<%- if @languages_with_page_tree.size >= 1 -%>
|
|
8
7
|
<%= form_tag(alchemy.copy_language_tree_admin_pages_path) do %>
|
|
@@ -19,32 +18,23 @@
|
|
|
19
18
|
<% end %>
|
|
20
19
|
<%- end -%>
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<p><%= Alchemy.t(:want_to_create_new_language) %></p>
|
|
27
|
-
<% end %>
|
|
28
|
-
<%= form.input :name, input_html: {value: @language.frontpage_name} %>
|
|
29
|
-
<%= form.input :page_layout,
|
|
30
|
-
collection: @page_layouts,
|
|
31
|
-
selected: @language.page_layout,
|
|
32
|
-
label: Alchemy.t(:page_type),
|
|
33
|
-
include_blank: Alchemy.t('Please choose'),
|
|
34
|
-
required: true,
|
|
35
|
-
input_html: {class: 'alchemy_selectbox'} %>
|
|
36
|
-
<%= form.hidden_field :language_id, value: @language.id %>
|
|
37
|
-
<%= form.hidden_field :language_code, value: @language.code %>
|
|
38
|
-
<%= form.hidden_field :language_root, value: true %>
|
|
39
|
-
<%= form.hidden_field :public, value: Alchemy::Language.all.size == 1 %>
|
|
40
|
-
<%= form.submit Alchemy.t("create_tree_as_new_language", language: @language.name), autofocus: true %>
|
|
21
|
+
<%= alchemy_form_for([:admin, Alchemy::Page.new], id: 'create_language_tree') do |form| %>
|
|
22
|
+
<% if @languages_with_page_tree.size >= 1 %>
|
|
23
|
+
<h3><%= Alchemy.t(:create_language_tree_heading) %></h3>
|
|
24
|
+
<p><%= Alchemy.t(:want_to_create_new_language) %></p>
|
|
41
25
|
<% end %>
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
26
|
+
<%= form.input :name, input_html: {value: @language.frontpage_name} %>
|
|
27
|
+
<%= form.input :page_layout,
|
|
28
|
+
collection: @page_layouts,
|
|
29
|
+
selected: @language.page_layout,
|
|
30
|
+
label: Alchemy.t(:page_type),
|
|
31
|
+
include_blank: Alchemy.t('Please choose'),
|
|
32
|
+
required: true,
|
|
33
|
+
input_html: {class: 'alchemy_selectbox'} %>
|
|
34
|
+
<%= form.hidden_field :language_id, value: @language.id %>
|
|
35
|
+
<%= form.hidden_field :language_code, value: @language.code %>
|
|
36
|
+
<%= form.hidden_field :language_root, value: true %>
|
|
37
|
+
<%= form.hidden_field :public, value: Alchemy::Language.all.size == 1 %>
|
|
38
|
+
<%= form.submit Alchemy.t(:create), autofocus: true %>
|
|
39
|
+
<% end %>
|
|
50
40
|
</div>
|
|
@@ -36,12 +36,10 @@
|
|
|
36
36
|
as: 'text',
|
|
37
37
|
hint: Alchemy.t('pages.update.comma_seperated') %>
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
</div>
|
|
44
|
-
<% end %>
|
|
39
|
+
<div class="input string autocomplete_tag_list">
|
|
40
|
+
<%= f.label :tag_list %>
|
|
41
|
+
<%= render 'alchemy/admin/partials/autocomplete_tag_list', f: f %>
|
|
42
|
+
</div>
|
|
45
43
|
|
|
46
44
|
<%= f.submit Alchemy.t(:save) %>
|
|
47
45
|
<% end %>
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
<%= alchemy_form_for([:admin, @page]) do |f| %>
|
|
2
|
-
|
|
2
|
+
<% if @page.parent_id || @page.layoutpage %>
|
|
3
|
+
<%= f.hidden_field(:parent_id) %>
|
|
4
|
+
<% else %>
|
|
5
|
+
<% @page.parent = @current_language.root_page %>
|
|
6
|
+
<%= f.input :parent_id,
|
|
7
|
+
collection: @current_language.pages.contentpages,
|
|
8
|
+
label_method: :name,
|
|
9
|
+
value_method: :id,
|
|
10
|
+
input_html: { class: "alchemy_selectbox" } %>
|
|
11
|
+
<% end %>
|
|
3
12
|
<%= f.hidden_field(:language_id) %>
|
|
4
13
|
<%= f.hidden_field(:layoutpage) %>
|
|
5
14
|
<%= f.input :page_layout,
|
|
6
15
|
collection: @page_layouts,
|
|
7
16
|
label: Alchemy.t(:page_type),
|
|
8
|
-
include_blank: Alchemy.t('Please choose'),
|
|
17
|
+
include_blank: @page_layouts.length == 1 ? nil : Alchemy.t('Please choose'),
|
|
9
18
|
required: true,
|
|
19
|
+
selected: @page_layouts.length == 1 ? @page_layouts.first : nil,
|
|
10
20
|
input_html: {class: 'alchemy_selectbox'} %>
|
|
11
21
|
<%= f.input :name %>
|
|
12
22
|
<%= f.submit Alchemy.t(:create) %>
|