alchemy_cms 5.2.1 → 6.0.0.b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (261) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +6 -14
  3. data/.gitignore +0 -1
  4. data/.hound.yml +1 -1
  5. data/.rubocop.yml +46 -4
  6. data/CHANGELOG.md +81 -9
  7. data/Gemfile +4 -2
  8. data/README.md +5 -2
  9. data/alchemy_cms.gemspec +78 -65
  10. data/app/assets/javascripts/alchemy/admin.js +0 -2
  11. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +0 -27
  12. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +2 -1
  13. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +1 -1
  14. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +0 -25
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +1 -1
  16. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +2 -0
  17. data/app/assets/javascripts/alchemy/alchemy.fixed_elements.js +1 -1
  18. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +3 -1
  19. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +1 -1
  20. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +40 -27
  21. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +1 -1
  22. data/app/assets/stylesheets/alchemy/admin.scss +1 -1
  23. data/app/assets/stylesheets/alchemy/archive.scss +4 -4
  24. data/app/assets/stylesheets/alchemy/buttons.scss +0 -4
  25. data/app/assets/stylesheets/alchemy/elements.scss +73 -61
  26. data/app/assets/stylesheets/alchemy/images.scss +8 -0
  27. data/app/assets/stylesheets/alchemy/node-select.scss +4 -3
  28. data/app/assets/stylesheets/alchemy/page-select.scss +1 -0
  29. data/app/controllers/alchemy/admin/attachments_controller.rb +6 -2
  30. data/app/controllers/alchemy/admin/base_controller.rb +5 -7
  31. data/app/controllers/alchemy/admin/elements_controller.rb +58 -34
  32. data/app/controllers/alchemy/admin/essence_audios_controller.rb +30 -0
  33. data/app/controllers/alchemy/admin/essence_files_controller.rb +0 -14
  34. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +8 -79
  35. data/app/controllers/alchemy/admin/essence_videos_controller.rb +33 -0
  36. data/app/controllers/alchemy/admin/ingredients_controller.rb +30 -0
  37. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -1
  38. data/app/controllers/alchemy/admin/pages_controller.rb +6 -13
  39. data/app/controllers/alchemy/admin/pictures_controller.rb +35 -9
  40. data/app/controllers/alchemy/api/elements_controller.rb +10 -5
  41. data/app/controllers/alchemy/api/pages_controller.rb +3 -4
  42. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +13 -3
  43. data/app/controllers/concerns/alchemy/admin/crop_action.rb +26 -0
  44. data/app/decorators/alchemy/element_editor.rb +23 -1
  45. data/app/decorators/alchemy/ingredient_editor.rb +154 -0
  46. data/app/helpers/alchemy/admin/elements_helper.rb +1 -0
  47. data/app/helpers/alchemy/admin/essences_helper.rb +1 -1
  48. data/app/helpers/alchemy/admin/ingredients_helper.rb +42 -0
  49. data/app/helpers/alchemy/elements_block_helper.rb +22 -7
  50. data/app/helpers/alchemy/elements_helper.rb +12 -5
  51. data/app/helpers/alchemy/pages_helper.rb +3 -11
  52. data/app/jobs/alchemy/base_job.rb +11 -0
  53. data/app/jobs/alchemy/publish_page_job.rb +11 -0
  54. data/app/models/alchemy/content.rb +1 -6
  55. data/app/models/alchemy/content/factory.rb +23 -27
  56. data/app/models/alchemy/element.rb +39 -72
  57. data/app/models/alchemy/element/definitions.rb +29 -27
  58. data/app/models/alchemy/element/element_contents.rb +131 -122
  59. data/app/models/alchemy/element/element_essences.rb +100 -98
  60. data/app/models/alchemy/element/element_ingredients.rb +176 -0
  61. data/app/models/alchemy/element/presenters.rb +89 -87
  62. data/app/models/alchemy/elements_repository.rb +126 -0
  63. data/app/models/alchemy/essence_audio.rb +12 -0
  64. data/app/models/alchemy/essence_headline.rb +40 -0
  65. data/app/models/alchemy/essence_picture.rb +4 -116
  66. data/app/models/alchemy/essence_richtext.rb +12 -0
  67. data/app/models/alchemy/essence_video.rb +12 -0
  68. data/app/models/alchemy/image_cropper_settings.rb +87 -0
  69. data/app/models/alchemy/ingredient.rb +219 -0
  70. data/app/models/alchemy/ingredient_validator.rb +97 -0
  71. data/app/models/alchemy/ingredients/audio.rb +29 -0
  72. data/app/models/alchemy/ingredients/boolean.rb +21 -0
  73. data/app/models/alchemy/ingredients/datetime.rb +20 -0
  74. data/app/models/alchemy/ingredients/file.rb +30 -0
  75. data/app/models/alchemy/ingredients/headline.rb +42 -0
  76. data/app/models/alchemy/ingredients/html.rb +19 -0
  77. data/app/models/alchemy/ingredients/link.rb +16 -0
  78. data/app/models/alchemy/ingredients/node.rb +23 -0
  79. data/app/models/alchemy/ingredients/page.rb +23 -0
  80. data/app/models/alchemy/ingredients/picture.rb +41 -0
  81. data/app/models/alchemy/ingredients/richtext.rb +57 -0
  82. data/app/models/alchemy/ingredients/select.rb +10 -0
  83. data/app/models/alchemy/ingredients/text.rb +17 -0
  84. data/app/models/alchemy/ingredients/video.rb +33 -0
  85. data/app/models/alchemy/language.rb +0 -11
  86. data/app/models/alchemy/page.rb +66 -32
  87. data/app/models/alchemy/page/fixed_attributes.rb +53 -51
  88. data/app/models/alchemy/page/page_elements.rb +186 -205
  89. data/app/models/alchemy/page/page_naming.rb +66 -64
  90. data/app/models/alchemy/page/page_natures.rb +139 -142
  91. data/app/models/alchemy/page/page_scopes.rb +113 -102
  92. data/app/models/alchemy/page/publisher.rb +50 -0
  93. data/app/models/alchemy/page/url_path.rb +1 -1
  94. data/app/models/alchemy/page_version.rb +58 -0
  95. data/app/models/alchemy/picture.rb +3 -1
  96. data/app/models/alchemy/picture/calculations.rb +2 -8
  97. data/app/models/alchemy/picture/preprocessor.rb +2 -0
  98. data/app/models/alchemy/picture/transformations.rb +24 -96
  99. data/app/models/concerns/alchemy/picture_thumbnails.rb +181 -0
  100. data/app/models/concerns/alchemy/touch_elements.rb +2 -2
  101. data/app/presenters/alchemy/picture_view.rb +88 -0
  102. data/app/serializers/alchemy/element_serializer.rb +5 -0
  103. data/app/serializers/alchemy/page_tree_serializer.rb +3 -2
  104. data/app/services/alchemy/delete_elements.rb +44 -0
  105. data/app/services/alchemy/duplicate_element.rb +56 -0
  106. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  107. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +3 -3
  108. data/app/views/alchemy/admin/attachments/assign.js.erb +11 -0
  109. data/app/views/alchemy/admin/crop.html.erb +36 -0
  110. data/app/views/alchemy/admin/elements/_element.html.erb +14 -10
  111. data/app/views/alchemy/admin/elements/{_element_footer.html.erb → _footer.html.erb} +0 -0
  112. data/app/views/alchemy/admin/elements/{_new_element_form.html.erb → _form.html.erb} +1 -1
  113. data/app/views/alchemy/admin/elements/{_element_header.html.erb → _header.html.erb} +1 -1
  114. data/app/views/alchemy/admin/elements/{_element_toolbar.html.erb → _toolbar.html.erb} +5 -6
  115. data/app/views/alchemy/admin/elements/{trash.js.erb → destroy.js.erb} +1 -3
  116. data/app/views/alchemy/admin/elements/new.html.erb +3 -3
  117. data/app/views/alchemy/admin/elements/order.js.erb +0 -17
  118. data/app/views/alchemy/admin/elements/update.js.erb +3 -2
  119. data/app/views/alchemy/admin/essence_audios/edit.html.erb +7 -0
  120. data/app/views/alchemy/admin/essence_pictures/update.js.erb +0 -1
  121. data/app/views/alchemy/admin/essence_videos/edit.html.erb +11 -0
  122. data/app/views/alchemy/admin/ingredients/_audio_fields.html.erb +4 -0
  123. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +18 -0
  124. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +25 -0
  125. data/app/views/alchemy/admin/ingredients/_video_fields.html.erb +8 -0
  126. data/app/views/alchemy/admin/ingredients/edit.html.erb +4 -0
  127. data/app/views/alchemy/admin/layoutpages/edit.html.erb +0 -5
  128. data/app/views/alchemy/admin/nodes/_node.html.erb +2 -2
  129. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +1 -1
  130. data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
  131. data/app/views/alchemy/admin/pages/_file_link.html.erb +1 -1
  132. data/app/views/alchemy/admin/pages/_form.html.erb +0 -6
  133. data/app/views/alchemy/admin/pages/_internal_link.html.erb +1 -1
  134. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +5 -2
  135. data/app/views/alchemy/admin/pages/edit.html.erb +36 -24
  136. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -4
  137. data/app/views/alchemy/admin/partials/_routes.html.erb +7 -11
  138. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +4 -8
  139. data/app/views/alchemy/admin/pictures/_infos.html.erb +0 -1
  140. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +4 -4
  141. data/app/views/alchemy/admin/pictures/assign.js.erb +10 -0
  142. data/app/views/alchemy/admin/resources/_form.html.erb +1 -0
  143. data/app/views/alchemy/essences/_essence_audio_editor.html.erb +4 -0
  144. data/app/views/alchemy/essences/_essence_audio_view.html.erb +15 -0
  145. data/app/views/alchemy/essences/_essence_file_editor.html.erb +15 -6
  146. data/app/views/alchemy/essences/_essence_headline_editor.html.erb +36 -0
  147. data/app/views/alchemy/essences/_essence_headline_view.html.erb +10 -0
  148. data/app/views/alchemy/essences/_essence_link_editor.html.erb +8 -4
  149. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +27 -12
  150. data/app/views/alchemy/essences/_essence_picture_view.html.erb +3 -3
  151. data/app/views/alchemy/essences/_essence_text_editor.html.erb +12 -4
  152. data/app/views/alchemy/essences/_essence_video_editor.html.erb +4 -0
  153. data/app/views/alchemy/essences/_essence_video_view.html.erb +18 -0
  154. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +21 -16
  155. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +2 -2
  156. data/app/views/alchemy/ingredients/_audio_editor.html.erb +5 -0
  157. data/app/views/alchemy/ingredients/_audio_view.html.erb +14 -0
  158. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +11 -0
  159. data/app/views/alchemy/ingredients/_boolean_view.html.erb +1 -0
  160. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +17 -0
  161. data/app/views/alchemy/ingredients/_datetime_view.html.erb +9 -0
  162. data/app/views/alchemy/ingredients/_file_editor.html.erb +50 -0
  163. data/app/views/alchemy/ingredients/_file_view.html.erb +17 -0
  164. data/app/views/alchemy/ingredients/_headline_editor.html.erb +30 -0
  165. data/app/views/alchemy/ingredients/_headline_view.html.erb +9 -0
  166. data/app/views/alchemy/ingredients/_html_editor.html.erb +8 -0
  167. data/app/views/alchemy/ingredients/_html_view.html.erb +1 -0
  168. data/app/views/alchemy/ingredients/_link_editor.html.erb +24 -0
  169. data/app/views/alchemy/ingredients/_link_view.html.erb +9 -0
  170. data/app/views/alchemy/ingredients/_node_editor.html.erb +25 -0
  171. data/app/views/alchemy/ingredients/_node_view.html.erb +1 -0
  172. data/app/views/alchemy/ingredients/_page_editor.html.erb +24 -0
  173. data/app/views/alchemy/ingredients/_page_view.html.erb +4 -0
  174. data/app/views/alchemy/ingredients/_picture_editor.html.erb +59 -0
  175. data/app/views/alchemy/ingredients/_picture_view.html.erb +5 -0
  176. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +12 -0
  177. data/app/views/alchemy/ingredients/_richtext_view.html.erb +3 -0
  178. data/app/views/alchemy/ingredients/_select_editor.html.erb +29 -0
  179. data/app/views/alchemy/ingredients/_select_view.html.erb +1 -0
  180. data/app/views/alchemy/ingredients/_text_editor.html.erb +19 -0
  181. data/app/views/alchemy/ingredients/_text_view.html.erb +16 -0
  182. data/app/views/alchemy/ingredients/_video_editor.html.erb +5 -0
  183. data/app/views/alchemy/ingredients/_video_view.html.erb +17 -0
  184. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +20 -0
  185. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +57 -0
  186. data/config/brakeman.ignore +66 -159
  187. data/config/initializers/dragonfly.rb +10 -0
  188. data/config/locales/alchemy.en.yml +23 -15
  189. data/config/routes.rb +17 -22
  190. data/db/migrate/20201207131309_create_page_versions.rb +19 -0
  191. data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +76 -0
  192. data/db/migrate/20210205143548_rename_public_on_and_public_until_on_alchemy_pages.rb +10 -0
  193. data/db/migrate/20210326105046_add_sanitized_body_to_alchemy_essence_richtexts.rb +7 -0
  194. data/db/migrate/20210406093436_add_alchemy_essence_headlines.rb +12 -0
  195. data/db/migrate/20210506135919_create_essence_audios.rb +19 -0
  196. data/db/migrate/20210506140258_create_essence_videos.rb +23 -0
  197. data/db/migrate/20210508091432_create_alchemy_ingredients.rb +22 -0
  198. data/lib/alchemy/admin/preview_url.rb +2 -0
  199. data/lib/alchemy/deprecation.rb +1 -1
  200. data/lib/alchemy/dragonfly/processors/auto_orient.rb +18 -0
  201. data/lib/alchemy/dragonfly/processors/crop_resize.rb +35 -0
  202. data/lib/alchemy/elements_finder.rb +14 -60
  203. data/lib/alchemy/essence.rb +1 -2
  204. data/lib/alchemy/hints.rb +8 -4
  205. data/lib/alchemy/page_layout.rb +0 -13
  206. data/lib/alchemy/permissions.rb +30 -29
  207. data/lib/alchemy/resource.rb +13 -3
  208. data/lib/alchemy/tasks/tidy.rb +29 -0
  209. data/lib/alchemy/test_support.rb +2 -11
  210. data/lib/alchemy/test_support/essence_shared_examples.rb +0 -1
  211. data/lib/alchemy/test_support/factories/element_factory.rb +8 -8
  212. data/lib/alchemy/test_support/factories/essence_audio_factory.rb +7 -0
  213. data/lib/alchemy/test_support/factories/essence_video_factory.rb +7 -0
  214. data/lib/alchemy/test_support/factories/ingredient_factory.rb +25 -0
  215. data/lib/alchemy/test_support/factories/page_factory.rb +20 -1
  216. data/lib/alchemy/test_support/factories/page_version_factory.rb +23 -0
  217. data/lib/alchemy/test_support/having_crop_action_examples.rb +170 -0
  218. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +646 -0
  219. data/lib/alchemy/test_support/shared_ingredient_editor_examples.rb +21 -0
  220. data/lib/alchemy/test_support/shared_ingredient_examples.rb +57 -0
  221. data/lib/alchemy/tinymce.rb +17 -0
  222. data/lib/alchemy/upgrader/six_point_zero.rb +21 -0
  223. data/lib/alchemy/upgrader/tasks/add_page_versions.rb +33 -0
  224. data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +51 -0
  225. data/lib/alchemy/version.rb +1 -1
  226. data/lib/generators/alchemy/elements/elements_generator.rb +1 -0
  227. data/lib/generators/alchemy/elements/templates/view.html.erb +9 -0
  228. data/lib/generators/alchemy/elements/templates/view.html.haml +9 -0
  229. data/lib/generators/alchemy/elements/templates/view.html.slim +9 -0
  230. data/lib/generators/alchemy/ingredient/ingredient_generator.rb +38 -0
  231. data/lib/generators/alchemy/ingredient/templates/editor.html.erb +14 -0
  232. data/lib/generators/alchemy/ingredient/templates/model.rb.tt +13 -0
  233. data/lib/generators/alchemy/ingredient/templates/view.html.erb +1 -0
  234. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +1 -1
  235. data/lib/tasks/alchemy/thumbnails.rake +2 -0
  236. data/lib/tasks/alchemy/tidy.rake +12 -0
  237. data/lib/tasks/alchemy/upgrade.rake +26 -0
  238. data/package.json +2 -1
  239. data/package/admin.js +11 -1
  240. data/package/src/__tests__/i18n.spec.js +23 -0
  241. data/package/src/file_editors.js +28 -0
  242. data/package/src/i18n.js +1 -3
  243. data/package/src/image_cropper.js +103 -0
  244. data/package/src/image_loader.js +58 -0
  245. data/package/src/node_tree.js +5 -5
  246. data/package/src/picture_editors.js +169 -0
  247. data/package/src/utils/__tests__/ajax.spec.js +20 -12
  248. data/package/src/utils/ajax.js +8 -3
  249. data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +3 -18
  250. data/vendor/assets/stylesheets/jquery.Jcrop.min.scss +2 -28
  251. metadata +284 -48
  252. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +0 -44
  253. data/app/assets/javascripts/alchemy/alchemy.trash_window.js.coffee +0 -30
  254. data/app/assets/stylesheets/alchemy/trash.scss +0 -8
  255. data/app/controllers/alchemy/admin/trash_controller.rb +0 -44
  256. data/app/views/alchemy/admin/essence_files/assign.js.erb +0 -3
  257. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +0 -4
  258. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +0 -48
  259. data/app/views/alchemy/admin/trash/clear.js.erb +0 -4
  260. data/app/views/alchemy/admin/trash/index.html.erb +0 -31
  261. data/lib/alchemy/test_support/factories.rb +0 -20
@@ -0,0 +1,16 @@
1
+ <%- options = local_assigns.fetch(:options, {}) -%>
2
+ <%- html_options = local_assigns.fetch(:html_options, {}) -%>
3
+ <%- if text_view.link.blank? ||
4
+ text_view.settings_value(:disable_link, options) -%>
5
+ <%= text_view.value -%>
6
+ <%- else -%>
7
+ <%= link_to(
8
+ text_view.value,
9
+ url_for(text_view.link),
10
+ {
11
+ title: text_view.link_title,
12
+ target: (text_view.link_target == "blank" ? "_blank" : nil),
13
+ 'data-link-target' => text_view.link_target
14
+ }.merge(html_options)
15
+ ) -%>
16
+ <%- end -%>
@@ -0,0 +1,5 @@
1
+ <%= render(
2
+ "alchemy/ingredients/file_editor",
3
+ element_form: element_form,
4
+ file_editor: video_editor,
5
+ ) %>
@@ -0,0 +1,17 @@
1
+ <%- if video_view.attachment -%>
2
+ <%= content_tag :video,
3
+ controls: video_view.controls,
4
+ autoplay: video_view.autoplay,
5
+ loop: video_view.loop,
6
+ muted: video_view.muted,
7
+ preload: video_view.preload.presence,
8
+ width: video_view.width.presence,
9
+ height: video_view.height.presence do %>
10
+ <%= tag :source,
11
+ src: alchemy.show_attachment_path(
12
+ video_view.attachment,
13
+ format: video_view.attachment.suffix
14
+ ),
15
+ type: video_view.attachment.file_mime_type %>
16
+ <% end %>
17
+ <%- end -%>
@@ -0,0 +1,20 @@
1
+ <span class="linkable_essence_tools">
2
+ <%= link_to(
3
+ render_icon(:link),
4
+ '#',
5
+ onclick: 'new Alchemy.LinkDialog(this).open(); return false;',
6
+ class: "icon_button#{ingredient_editor.linked? ? ' linked' : ''} link-essence",
7
+ "data-parent-selector": "[data-ingredient-id='#{ingredient_editor.id}']",
8
+ title: Alchemy.t(:place_link),
9
+ id: "edit_link_#{ingredient_editor.id}"
10
+ ) %>
11
+ <%= link_to(
12
+ render_icon(:unlink),
13
+ '#',
14
+ onclick: "return Alchemy.LinkDialog.removeLink(this, '[data-ingredient-id=\"#{ingredient_editor.id}\"]')",
15
+ class: "icon_button unlink-essence #{ingredient_editor.linked? ? 'linked' : 'disabled'}",
16
+ tabindex: ingredient_editor.linked? ? nil : '-1',
17
+ 'data-ingredient-id' => ingredient_editor.id,
18
+ title: Alchemy.t(:unlink)
19
+ ) %>
20
+ </span>
@@ -0,0 +1,57 @@
1
+ <% linkable = picture_editor.settings[:linkable] != false %>
2
+ <% croppable = picture_editor.allow_image_cropping? %>
3
+
4
+ <%= link_to_dialog render_icon(:crop),
5
+ alchemy.crop_admin_ingredient_path(picture_editor.ingredient, {
6
+ crop_from_form_field_id: picture_editor.form_field_id(:crop_from),
7
+ crop_size_form_field_id: picture_editor.form_field_id(:crop_size),
8
+ picture_id: picture_editor.picture&.id
9
+ }), {
10
+ size: "1080x615",
11
+ title: Alchemy.t("Edit Picturemask"),
12
+ image_loader: false,
13
+ padding: false
14
+ }, {
15
+ title: Alchemy.t("Edit Picturemask"),
16
+ class: croppable ? "crop_link" : "disabled crop_link",
17
+ tabindex: croppable ? nil : "-1",
18
+ onclick: "return false"
19
+ } %>
20
+
21
+ <%= link_to_dialog render_icon("file-image", style: "regular"),
22
+ alchemy.admin_pictures_path(
23
+ form_field_id: picture_editor.form_field_id(:picture_id)
24
+ ),
25
+ {
26
+ title: (picture_editor.picture ? Alchemy.t(:swap_image) : Alchemy.t(:insert_image)),
27
+ size: "790x590",
28
+ padding: false
29
+ },
30
+ title: (picture_editor.picture ? Alchemy.t(:swap_image) : Alchemy.t(:insert_image)) %>
31
+
32
+ <%= link_to_if linkable, render_icon(:link), "", {
33
+ onclick: "new Alchemy.LinkDialog(this).open(); return false;",
34
+ class: picture_editor.linked? ? "linked" : nil,
35
+ title: Alchemy.t(:link_image),
36
+ "data-parent-selector": "[data-ingredient-id='#{picture_editor.id}']",
37
+ id: "edit_link_#{picture_editor.id}"
38
+ } do %>
39
+ <span class="disabled" tabindex="-1"><%= render_icon(:link) %></span>
40
+ <% end %>
41
+
42
+ <%= link_to_if linkable, render_icon(:unlink), "", {
43
+ onclick: "return Alchemy.LinkDialog.removeLink(this, '[data-ingredient-id=\"#{picture_editor.id}\"]')",
44
+ class: picture_editor.linked? ? "linked" : "disabled",
45
+ tabindex: picture_editor.linked? ? nil : "-1",
46
+ title: Alchemy.t(:unlink)
47
+ } do %>
48
+ <span class="disabled" tabindex="-1"><%= render_icon(:unlink) %></span>
49
+ <% end %>
50
+
51
+ <%= link_to_dialog render_icon(:edit),
52
+ alchemy.edit_admin_ingredient_path(id: picture_editor.id),
53
+ {
54
+ title: Alchemy.t(:edit_image_properties),
55
+ size: "380x255"
56
+ },
57
+ title: Alchemy.t(:edit_image_properties) %>
@@ -3,19 +3,19 @@
3
3
  {
4
4
  "warning_type": "Cross-Site Scripting",
5
5
  "warning_code": 2,
6
- "fingerprint": "0551e3f9180b85fca4b17fe3c7cbbac1611d2ef8d385f77e9445c562c471d688",
6
+ "fingerprint": "068b12d24047e2ece633115ba065ce46fc8c8a26827be7de2565ab721e1c2e82",
7
7
  "check_name": "CrossSiteScripting",
8
8
  "message": "Unescaped parameter value",
9
9
  "file": "app/views/alchemy/admin/elements/update.js.erb",
10
- "line": 18,
10
+ "line": 21,
11
11
  "link": "https://brakemanscanner.org/docs/warning_types/cross_site_scripting",
12
- "code": "j(Element.find(params[:id]).essence_error_messages.join(\"</li><li>\"))",
12
+ "code": "Element.find(params[:id]).ingredients_with_errors.map do\n \"[data-ingredient-id=\\\"#{ingredient.id}\\\"]\"\n end.join(\", \")",
13
13
  "render_path": [
14
14
  {
15
15
  "type": "controller",
16
16
  "class": "Alchemy::Admin::ElementsController",
17
17
  "method": "update",
18
- "line": 55,
18
+ "line": 61,
19
19
  "file": "app/controllers/alchemy/admin/elements_controller.rb",
20
20
  "rendered": {
21
21
  "name": "alchemy/admin/elements/update",
@@ -38,7 +38,7 @@
38
38
  "check_name": "SendFile",
39
39
  "message": "Parameter value used in file name",
40
40
  "file": "app/controllers/alchemy/admin/attachments_controller.rb",
41
- "line": 65,
41
+ "line": 69,
42
42
  "link": "https://brakemanscanner.org/docs/warning_types/file_access/",
43
43
  "code": "send_file(Attachment.find(params[:id]).file.path, :filename => Attachment.find(params[:id]).file_name, :type => Attachment.find(params[:id]).file_mime_type)",
44
44
  "render_path": null,
@@ -71,130 +71,6 @@
71
71
  "confidence": "Medium",
72
72
  "note": "Because we actually can't know all attributes each inheriting controller supports, we permit all resource model params. It is adviced that all inheriting controllers implement this method and provide its own set of permitted attributes. As this all happens inside the password protected /admin namespace this can be considered a false positive."
73
73
  },
74
- {
75
- "warning_type": "Cross-Site Scripting",
76
- "warning_code": 2,
77
- "fingerprint": "293a6f5581ba3f0e7aa4f81b38d68baf21f1219c8f3bae3eca6b3e1776b734df",
78
- "check_name": "CrossSiteScripting",
79
- "message": "Unescaped parameter value",
80
- "file": "app/views/alchemy/admin/elements/order.js.erb",
81
- "line": 17,
82
- "link": "https://brakemanscanner.org/docs/warning_types/cross_site_scripting",
83
- "code": "Element.trashed.where(:id => params[:element_ids]).pluck(:id).collect do\n \"#element_area [data-element-id=\\\"#{id}\\\"]\"\n end.join(\", \")",
84
- "render_path": [
85
- {
86
- "type": "controller",
87
- "class": "Alchemy::Admin::ElementsController",
88
- "method": "order",
89
- "line": 78,
90
- "file": "app/controllers/alchemy/admin/elements_controller.rb",
91
- "rendered": {
92
- "name": "alchemy/admin/elements/order",
93
- "file": "app/views/alchemy/admin/elements/order.js.erb"
94
- }
95
- }
96
- ],
97
- "location": {
98
- "type": "template",
99
- "template": "alchemy/admin/elements/order"
100
- },
101
- "user_input": "params[:element_ids]",
102
- "confidence": "Weak",
103
- "note": ""
104
- },
105
- {
106
- "warning_type": "Dynamic Render Path",
107
- "warning_code": 15,
108
- "fingerprint": "2eb67abb2b025c3446afa2f9b8d48c6b6a05379234a9228c9af4c25b7e672b00",
109
- "check_name": "Render",
110
- "message": "Render path contains parameter value",
111
- "file": "app/views/alchemy/admin/elements/index.html.erb",
112
- "line": 18,
113
- "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
114
- "code": "render(action => Page.find(params[:page_id]).all_elements.not_nested.unfixed.not_trashed.includes(*element_includes).map do\n Alchemy::ElementEditor.new(element)\n end, {})",
115
- "render_path": [
116
- {
117
- "type": "controller",
118
- "class": "Alchemy::Admin::ElementsController",
119
- "method": "index",
120
- "line": 13,
121
- "file": "app/controllers/alchemy/admin/elements_controller.rb",
122
- "rendered": {
123
- "name": "alchemy/admin/elements/index",
124
- "file": "app/views/alchemy/admin/elements/index.html.erb"
125
- }
126
- }
127
- ],
128
- "location": {
129
- "type": "template",
130
- "template": "alchemy/admin/elements/index"
131
- },
132
- "user_input": "params[:page_id]",
133
- "confidence": "Weak",
134
- "note": ""
135
- },
136
- {
137
- "warning_type": "Dynamic Render Path",
138
- "warning_code": 15,
139
- "fingerprint": "2eb67abb2b025c3446afa2f9b8d48c6b6a05379234a9228c9af4c25b7e672b00",
140
- "check_name": "Render",
141
- "message": "Render path contains parameter value",
142
- "file": "app/views/alchemy/admin/elements/index.html.erb",
143
- "line": 31,
144
- "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
145
- "code": "render(action => Page.find(params[:page_id]).all_elements.not_nested.unfixed.not_trashed.includes(*element_includes).map do\n Alchemy::ElementEditor.new(element)\n end, {})",
146
- "render_path": [
147
- {
148
- "type": "controller",
149
- "class": "Alchemy::Admin::ElementsController",
150
- "method": "index",
151
- "line": 13,
152
- "file": "app/controllers/alchemy/admin/elements_controller.rb",
153
- "rendered": {
154
- "name": "alchemy/admin/elements/index",
155
- "file": "app/views/alchemy/admin/elements/index.html.erb"
156
- }
157
- }
158
- ],
159
- "location": {
160
- "type": "template",
161
- "template": "alchemy/admin/elements/index"
162
- },
163
- "user_input": "params[:page_id]",
164
- "confidence": "Weak",
165
- "note": ""
166
- },
167
- {
168
- "warning_type": "Dynamic Render Path",
169
- "warning_code": 15,
170
- "fingerprint": "2fa9bf5c73b4e6e3c272f0b14635f96efbd763e9a2c5b785caefffe3589ac461",
171
- "check_name": "Render",
172
- "message": "Render path contains parameter value",
173
- "file": "app/views/alchemy/admin/essence_pictures/assign.js.erb",
174
- "line": 2,
175
- "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
176
- "code": "render(action => Alchemy::ContentEditor.new(Content.find(params[:content_id])), {})",
177
- "render_path": [
178
- {
179
- "type": "controller",
180
- "class": "Alchemy::Admin::EssencePicturesController",
181
- "method": "assign",
182
- "line": 49,
183
- "file": "app/controllers/alchemy/admin/essence_pictures_controller.rb",
184
- "rendered": {
185
- "name": "alchemy/admin/essence_pictures/assign",
186
- "file": "app/views/alchemy/admin/essence_pictures/assign.js.erb"
187
- }
188
- }
189
- ],
190
- "location": {
191
- "type": "template",
192
- "template": "alchemy/admin/essence_pictures/assign"
193
- },
194
- "user_input": "params[:content_id]",
195
- "confidence": "Weak",
196
- "note": ""
197
- },
198
74
  {
199
75
  "warning_type": "Dynamic Render Path",
200
76
  "warning_code": 15,
@@ -210,7 +86,7 @@
210
86
  "type": "controller",
211
87
  "class": "Alchemy::Admin::ElementsController",
212
88
  "method": "fold",
213
- "line": 95,
89
+ "line": 97,
214
90
  "file": "app/controllers/alchemy/admin/elements_controller.rb",
215
91
  "rendered": {
216
92
  "name": "alchemy/admin/elements/fold",
@@ -233,7 +109,7 @@
233
109
  "check_name": "MassAssignment",
234
110
  "message": "Specify exact keys allowed for mass assignment instead of using `permit!` which allows any keys",
235
111
  "file": "app/controllers/alchemy/admin/elements_controller.rb",
236
- "line": 146,
112
+ "line": 150,
237
113
  "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
238
114
  "code": "params.fetch(:contents, {}).permit!",
239
115
  "render_path": null,
@@ -297,57 +173,88 @@
297
173
  "note": ""
298
174
  },
299
175
  {
300
- "warning_type": "File Access",
301
- "warning_code": 16,
302
- "fingerprint": "a1197cfa89e3a66e6d10ee060cd87af97d5e978d6d93b5936eb987288f1c02e6",
303
- "check_name": "SendFile",
304
- "message": "Parameter value used in file name",
305
- "file": "app/controllers/alchemy/attachments_controller.rb",
306
- "line": 12,
307
- "link": "https://brakemanscanner.org/docs/warning_types/file_access/",
308
- "code": "send_file(Attachment.find(params[:id]).file.path, :filename => Attachment.find(params[:id]).file_name, :type => Attachment.find(params[:id]).file_mime_type, :disposition => \"inline\")",
309
- "render_path": null,
176
+ "warning_type": "Dynamic Render Path",
177
+ "warning_code": 15,
178
+ "fingerprint": "80b9b11d658cd393c549d568b3655c62566862f55b2fa16ed688de7c2e9343ac",
179
+ "check_name": "Render",
180
+ "message": "Render path contains parameter value",
181
+ "file": "app/views/alchemy/admin/elements/index.html.erb",
182
+ "line": 18,
183
+ "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
184
+ "code": "render(action => PageVersion.find(params[:page_version_id]).elements.order(:position).includes(*element_includes).not_nested.unfixed.map do\n Alchemy::ElementEditor.new(element)\n end, {})",
185
+ "render_path": [
186
+ {
187
+ "type": "controller",
188
+ "class": "Alchemy::Admin::ElementsController",
189
+ "method": "index",
190
+ "line": 15,
191
+ "file": "app/controllers/alchemy/admin/elements_controller.rb",
192
+ "rendered": {
193
+ "name": "alchemy/admin/elements/index",
194
+ "file": "app/views/alchemy/admin/elements/index.html.erb"
195
+ }
196
+ }
197
+ ],
310
198
  "location": {
311
- "type": "method",
312
- "class": "Alchemy::AttachmentsController",
313
- "method": "show"
199
+ "type": "template",
200
+ "template": "alchemy/admin/elements/index"
314
201
  },
315
- "user_input": "params[:id]",
202
+ "user_input": "params[:page_version_id]",
316
203
  "confidence": "Weak",
317
204
  "note": ""
318
205
  },
319
206
  {
320
207
  "warning_type": "Dynamic Render Path",
321
208
  "warning_code": 15,
322
- "fingerprint": "b9f63fd46d0ebd6684b649ab260f27df8a6422d44fed4769273d8e6a6a30397c",
209
+ "fingerprint": "80b9b11d658cd393c549d568b3655c62566862f55b2fa16ed688de7c2e9343ac",
323
210
  "check_name": "Render",
324
211
  "message": "Render path contains parameter value",
325
- "file": "app/views/alchemy/admin/essence_files/assign.js.erb",
326
- "line": 1,
212
+ "file": "app/views/alchemy/admin/elements/index.html.erb",
213
+ "line": 31,
327
214
  "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
328
- "code": "render(action => Alchemy::ContentEditor.new(Content.find_by(:id => params[:content_id])), {})",
215
+ "code": "render(action => PageVersion.find(params[:page_version_id]).elements.order(:position).includes(*element_includes).not_nested.unfixed.map do\n Alchemy::ElementEditor.new(element)\n end, {})",
329
216
  "render_path": [
330
217
  {
331
218
  "type": "controller",
332
- "class": "Alchemy::Admin::EssenceFilesController",
333
- "method": "assign",
334
- "line": 32,
335
- "file": "app/controllers/alchemy/admin/essence_files_controller.rb",
219
+ "class": "Alchemy::Admin::ElementsController",
220
+ "method": "index",
221
+ "line": 15,
222
+ "file": "app/controllers/alchemy/admin/elements_controller.rb",
336
223
  "rendered": {
337
- "name": "alchemy/admin/essence_files/assign",
338
- "file": "app/views/alchemy/admin/essence_files/assign.js.erb"
224
+ "name": "alchemy/admin/elements/index",
225
+ "file": "app/views/alchemy/admin/elements/index.html.erb"
339
226
  }
340
227
  }
341
228
  ],
342
229
  "location": {
343
230
  "type": "template",
344
- "template": "alchemy/admin/essence_files/assign"
231
+ "template": "alchemy/admin/elements/index"
345
232
  },
346
- "user_input": "params[:content_id]",
233
+ "user_input": "params[:page_version_id]",
234
+ "confidence": "Weak",
235
+ "note": ""
236
+ },
237
+ {
238
+ "warning_type": "File Access",
239
+ "warning_code": 16,
240
+ "fingerprint": "a1197cfa89e3a66e6d10ee060cd87af97d5e978d6d93b5936eb987288f1c02e6",
241
+ "check_name": "SendFile",
242
+ "message": "Parameter value used in file name",
243
+ "file": "app/controllers/alchemy/attachments_controller.rb",
244
+ "line": 12,
245
+ "link": "https://brakemanscanner.org/docs/warning_types/file_access/",
246
+ "code": "send_file(Attachment.find(params[:id]).file.path, :filename => Attachment.find(params[:id]).file_name, :type => Attachment.find(params[:id]).file_mime_type, :disposition => \"inline\")",
247
+ "render_path": null,
248
+ "location": {
249
+ "type": "method",
250
+ "class": "Alchemy::AttachmentsController",
251
+ "method": "show"
252
+ },
253
+ "user_input": "params[:id]",
347
254
  "confidence": "Weak",
348
255
  "note": ""
349
256
  }
350
257
  ],
351
- "updated": "2021-01-04 16:29:42 +0100",
352
- "brakeman_version": "4.10.1"
258
+ "updated": "2021-06-29 20:56:10 +0200",
259
+ "brakeman_version": "5.0.1"
353
260
  }
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require "dragonfly_svg"
3
+ require "alchemy/dragonfly/processors/crop_resize"
4
+ require "alchemy/dragonfly/processors/auto_orient"
3
5
 
4
6
  # Logger
5
7
  Dragonfly.logger = Rails.logger
@@ -9,3 +11,11 @@ if defined?(ActiveRecord::Base)
9
11
  ActiveRecord::Base.extend Dragonfly::Model
10
12
  ActiveRecord::Base.extend Dragonfly::Model::Validations
11
13
  end
14
+
15
+ # Dragonfly 1.4.0 only allows `quality` as argument to `encode`
16
+ Dragonfly::ImageMagick::Processors::Encode::WHITELISTED_ARGS << "flatten"
17
+
18
+ Rails.application.config.after_initialize do
19
+ Dragonfly.app(:alchemy_pictures).add_processor(:crop_resize, Alchemy::Dragonfly::Processors::CropResize.new)
20
+ Dragonfly.app(:alchemy_pictures).add_processor(:auto_orient, Alchemy::Dragonfly::Processors::AutoOrient.new)
21
+ end
@@ -89,6 +89,11 @@ en:
89
89
  right: 'Right from text'
90
90
  no_float: 'Above the text'
91
91
 
92
+ ingredient_values:
93
+ boolean:
94
+ true: "True"
95
+ false: "False"
96
+
92
97
  # == Contactform translations
93
98
  contactform:
94
99
  labels:
@@ -194,7 +199,6 @@ en:
194
199
  'An error happened': 'An error happened'
195
200
  "Change password": "Change password"
196
201
  "Choose page": "Choose page"
197
- "Cleared trash": "Cleared trash"
198
202
  "Clear selection": "Clear selection"
199
203
  "Forgot your password?": "Forgot your password?"
200
204
  "Clipboard": "Clipboard"
@@ -204,15 +208,14 @@ en:
204
208
  "Currently locked pages": "Currently locked pages"
205
209
  "Default language has to be public": "Default language has to be public"
206
210
  "Delete image": "Delete image"
211
+ "Delete element": "Delete element"
207
212
  "Do you really want to clear the clipboard?": "Do you really want to clear the clipboard?"
208
- "Do you really want to clear the trash?": "Do you really want to clear the trash?"
209
213
  "Do you really want to delete this content?": "Do you really want to delete this content?"
210
214
  "Drag an element over to the element window to restore it": "Drag an element over to the element window to restore it"
211
215
  "Edit Picturemask": "Edit picturemask"
212
216
  "Edit image": "Edit image"
213
217
  "Edit multiple pictures": "Edit multiple pictures"
214
218
  "Elements": "Elements"
215
- "Element trashed": "Element trashed"
216
219
  "Error with the Flash® Uploader!": "Error with the Flash® Uploader!"
217
220
  "Excerpt": "Excerpt"
218
221
  "File successfully updated": "File successfully updated"
@@ -268,7 +271,6 @@ en:
268
271
  "Please log in": "Please log in."
269
272
  "Please seperate the tags with commata": "* Please seperate the tags with commas."
270
273
  "Properties": "Properties"
271
- "Publish page": "Publish page"
272
274
  "Read the License": "Read the License"
273
275
  "Redirects to": "Redirects to"
274
276
  "Reload Preview": "Reload Preview"
@@ -287,7 +289,6 @@ en:
287
289
  "Show clipboard": "Show clipboard"
288
290
  "Copied to clipboard": "Copied to clipboard"
289
291
  "Show picture infos": "Show picture infos"
290
- "Show trash": "Show trash"
291
292
  "Site successfully created": "Website successfully created."
292
293
  "Site successfully removed": "Website successfully removed."
293
294
  "Site successfully updated": "Website successfully updated."
@@ -295,6 +296,7 @@ en:
295
296
  "Sort pages": "Reorder pages"
296
297
  "Successfully added content": "Successfully added %{content}"
297
298
  "Successfully deleted content": "Successfully deleted %{content}"
299
+ "Successfully deleted element": "Successfully deleted %{element}"
298
300
  "Tags": "Tags"
299
301
  "These pictures could not be deleted, because they were in use": "These pictures could not be deleted, because they were in use: %{names}"
300
302
  "This page is locked": "This page is currently locked by %{name}"
@@ -310,6 +312,7 @@ en:
310
312
  "Warning!": "Warning!"
311
313
  content_definition_missing: "Warning: Content is missing its definition. Please check the elements.yml"
312
314
  content_deprecated: "WARNING! This content is deprecated and will be removed soon. Please do not use it anymore."
315
+ ingredient_deprecated: "WARNING! This content is deprecated and will be removed soon. Please do not use it anymore."
313
316
  element_definition_missing: "WARNING! Missing element definition. Please check your elements.yml file."
314
317
  element_deprecated: "WARNING! This element is deprecated and will be removed soon. Please do not use it anymore."
315
318
  page_definition_missing: "WARNING! Missing page layout definition. Please check your page_layouts.yml file."
@@ -321,7 +324,6 @@ en:
321
324
  element_dirty_close_window_notice: "You have unsaved elements. Do you really want to close the elements window?"
322
325
  "Your last login was on": "Your last login was on %{time}."
323
326
  "Your last updated pages": "Your last updated pages"
324
- "Your trash is empty": "Your trash is empty"
325
327
  above: "above"
326
328
  add: "Add"
327
329
  align_in_text: "Alignment in text"
@@ -329,7 +331,6 @@ en:
329
331
  all_pictures: "All pictures"
330
332
  apply: "apply"
331
333
  assign_file: "Assign a file"
332
- assign_file_from_archive: "assign a file from your archive"
333
334
  assign_image: "Assign an image"
334
335
  attached_to: "attached to"
335
336
  attachment_filename_notice: "* Please do not use any special characters for the filename."
@@ -337,17 +338,18 @@ en:
337
338
  big_thumbnails: "Big thumbnails"
338
339
  cancel: "cancel"
339
340
  cannot_delete_picture_notice: "Cannot delete Picture %{name}, because it's still in use."
341
+ cannot_visit_unpublic_page: "Publish page before visiting it."
340
342
  choose_file_to_link: "Please choose a file to link"
341
343
  "clear clipboard": "clear clipboard"
342
- "clear trash": "clear trash"
343
344
  click_to_show_all: "Click to show all again."
345
+ confirm_to_delete_element: "Do you really want to delete this element? It cannot be restored!"
344
346
  confirm_to_delete_file: "Do you really want to delete this file from the server?"
345
347
  confirm_to_delete_image: "Do you really want to delete this image from server?"
346
348
  confirm_to_delete_image_from_server: "Do you really want to delete this image from the server?"
347
349
  confirm_to_delete_images_from_server: "Do you really want to delete these images from the server?"
348
350
  confirm_to_delete_menu: "Do you really want to delete this menu?"
349
351
  confirm_to_delete_node: "Do you really want to delete this menu node?"
350
- confirm_to_delete_page: "Do you really want to delete this page? All its elements (even trashed ones) will get lost!"
352
+ confirm_to_delete_page: "Do you really want to delete this page?"
351
353
  content_essence_not_found: "Content essence not found"
352
354
  content_not_found: "Field for content not present."
353
355
  content_validations_headline: "Please check marked fields below"
@@ -393,7 +395,7 @@ en:
393
395
  element_saved: "Saved element."
394
396
  enter_external_link: "Please enter the URL you want to link with"
395
397
  explain_cropping: "<p>Move the frame and change its size with the mouse or arrow keys to adjust the image mask. Click on \"apply\" when you are satisfied with your selection.</p><p>If you want to return to the original centered image mask like it was defined in the layout, click \"reset\" and \"apply\" afterwards.</p>"
396
- explain_publishing: "Publish the page and remove the cached version from the server."
398
+ explain_publishing: "Publish current page content"
397
399
  explain_sitemap_dragndrop_sorting: "Tip: Drag the pages at the icon in order to sort them."
398
400
  explain_unlocking: "Leave page and unlock it for other users."
399
401
  external_link_notice_1: "Please enter the complete url with http:// or a similar protocol."
@@ -422,7 +424,7 @@ en:
422
424
  dashboard: "Dashboard"
423
425
  image_alt_tag: "Alt-tag"
424
426
  image_caption: "Caption"
425
- image_name: "Name"
427
+ image_name: "Name: %{name}"
426
428
  image_title: "Title-tag"
427
429
  internal_link_headline: "Search for a page to link to by entering its name into the Page select."
428
430
  internal_link_page_elements_explanation: "Additionally you can choose an anchor to an element from selected page."
@@ -491,7 +493,7 @@ en:
491
493
  or_replace_it_with_an_existing_tag: 'Or replace it with an existing tag'
492
494
  "Page created": "Page: '%{name}' created."
493
495
  page_infos: 'Page info'
494
- page_layout_changed_notice: "Page type was changed. Elements not usable anymore have been moved into the trash."
496
+ page_layout_changed_notice: "Page type was changed. Elements not usable anymore have been hided."
495
497
  page_properties: "Page properties"
496
498
  page_public: "published"
497
499
  page_published: "Published page"
@@ -538,6 +540,8 @@ en:
538
540
  '1024': '1024px (iPad - Landscape)'
539
541
  '1280': '1280px (Desktop)'
540
542
  preview_url: Preview
543
+ publish_page_language_not_public: Cannot publish page if language is not public
544
+ publish_page_not_allowed: You have not the permission to publish this page
541
545
  recently_uploaded_only: 'Recently uploaded only'
542
546
  "regular method": "Regular method"
543
547
  remove: "Remove"
@@ -568,7 +572,6 @@ en:
568
572
  subject: "Subject"
569
573
  successfully_added_element: "Successfully added new element."
570
574
  successfully_deleted_tag: "Successfully deleted tag"
571
- successfully_restored_element: "Element restored successfully."
572
575
  successfully_saved_element_position: "Element position updated successfully."
573
576
  successfully_updated_tag: "Successfully updated tag"
574
577
  swap_image: "Change image"
@@ -578,7 +581,6 @@ en:
578
581
  this_picture_is_used_on_these_pages: "This picture is used on following pages"
579
582
  title: "Title"
580
583
  to_alchemy: "To Alchemy"
581
- "trash element": "Put element into trash"
582
584
  unknown: "unknown"
583
585
  unlink: "Remove link from this image."
584
586
  unlock_page: "Leave page"
@@ -704,11 +706,18 @@ en:
704
706
  # Translations for Alchemy models
705
707
  activemodel:
706
708
  models:
709
+ alchemy/essence_headline:
710
+ one: Headline
711
+ other: Headline
707
712
  alchemy/message:
708
713
  one: Message
709
714
  other: Messages
710
715
  alchemy/admin/preview_url: Internal
711
716
  attributes:
717
+ alchemy/essence_headline:
718
+ body: Headline
719
+ level: Level
720
+ size: Size
712
721
  alchemy/message:
713
722
  salutation: 'Salutation'
714
723
  firstname: 'Firstname'
@@ -785,7 +794,6 @@ en:
785
794
  name: "Name"
786
795
  public: "visible"
787
796
  tag_list: Tags
788
- trashed: Trashed
789
797
  alchemy/essence_file:
790
798
  css_class: Style
791
799
  alchemy/essence_picture: