alchemy_cms 5.2.0.rc1 → 6.0.0.b2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (286) 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 +105 -2
  7. data/Gemfile +8 -1
  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 +18 -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 +8 -4
  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 +7 -22
  39. data/app/controllers/alchemy/admin/pictures_controller.rb +56 -17
  40. data/app/controllers/alchemy/admin/resources_controller.rb +84 -10
  41. data/app/controllers/alchemy/api/elements_controller.rb +13 -4
  42. data/app/controllers/alchemy/api/pages_controller.rb +4 -3
  43. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +13 -3
  44. data/app/controllers/concerns/alchemy/admin/crop_action.rb +26 -0
  45. data/app/decorators/alchemy/element_editor.rb +48 -1
  46. data/app/decorators/alchemy/ingredient_editor.rb +154 -0
  47. data/app/helpers/alchemy/admin/elements_helper.rb +1 -0
  48. data/app/helpers/alchemy/admin/essences_helper.rb +1 -1
  49. data/app/helpers/alchemy/admin/ingredients_helper.rb +42 -0
  50. data/app/helpers/alchemy/elements_block_helper.rb +22 -7
  51. data/app/helpers/alchemy/elements_helper.rb +12 -5
  52. data/app/helpers/alchemy/pages_helper.rb +3 -9
  53. data/app/jobs/alchemy/base_job.rb +11 -0
  54. data/app/jobs/alchemy/publish_page_job.rb +11 -0
  55. data/app/models/alchemy/attachment.rb +24 -7
  56. data/app/models/alchemy/content.rb +1 -6
  57. data/app/models/alchemy/content/factory.rb +23 -27
  58. data/app/models/alchemy/element.rb +39 -72
  59. data/app/models/alchemy/element/definitions.rb +29 -27
  60. data/app/models/alchemy/element/element_contents.rb +131 -122
  61. data/app/models/alchemy/element/element_essences.rb +100 -98
  62. data/app/models/alchemy/element/element_ingredients.rb +176 -0
  63. data/app/models/alchemy/element/presenters.rb +104 -85
  64. data/app/models/alchemy/elements_repository.rb +126 -0
  65. data/app/models/alchemy/essence_audio.rb +12 -0
  66. data/app/models/alchemy/essence_headline.rb +40 -0
  67. data/app/models/alchemy/essence_picture.rb +4 -116
  68. data/app/models/alchemy/essence_richtext.rb +12 -0
  69. data/app/models/alchemy/essence_video.rb +12 -0
  70. data/app/models/alchemy/image_cropper_settings.rb +87 -0
  71. data/app/models/alchemy/ingredient.rb +224 -0
  72. data/app/models/alchemy/ingredient_validator.rb +97 -0
  73. data/app/models/alchemy/ingredients/audio.rb +29 -0
  74. data/app/models/alchemy/ingredients/boolean.rb +21 -0
  75. data/app/models/alchemy/ingredients/datetime.rb +20 -0
  76. data/app/models/alchemy/ingredients/file.rb +30 -0
  77. data/app/models/alchemy/ingredients/headline.rb +42 -0
  78. data/app/models/alchemy/ingredients/html.rb +19 -0
  79. data/app/models/alchemy/ingredients/link.rb +16 -0
  80. data/app/models/alchemy/ingredients/node.rb +23 -0
  81. data/app/models/alchemy/ingredients/page.rb +23 -0
  82. data/app/models/alchemy/ingredients/picture.rb +41 -0
  83. data/app/models/alchemy/ingredients/richtext.rb +57 -0
  84. data/app/models/alchemy/ingredients/select.rb +10 -0
  85. data/app/models/alchemy/ingredients/text.rb +17 -0
  86. data/app/models/alchemy/ingredients/video.rb +33 -0
  87. data/app/models/alchemy/language.rb +0 -11
  88. data/app/models/alchemy/page.rb +76 -33
  89. data/app/models/alchemy/page/fixed_attributes.rb +53 -51
  90. data/app/models/alchemy/page/page_elements.rb +186 -205
  91. data/app/models/alchemy/page/page_naming.rb +66 -64
  92. data/app/models/alchemy/page/page_natures.rb +139 -142
  93. data/app/models/alchemy/page/page_scopes.rb +117 -102
  94. data/app/models/alchemy/page/publisher.rb +50 -0
  95. data/app/models/alchemy/page/url_path.rb +1 -1
  96. data/app/models/alchemy/page_version.rb +58 -0
  97. data/app/models/alchemy/picture.rb +18 -40
  98. data/app/models/alchemy/picture/calculations.rb +2 -8
  99. data/app/models/alchemy/picture/preprocessor.rb +2 -0
  100. data/app/models/alchemy/picture/transformations.rb +24 -96
  101. data/app/models/concerns/alchemy/picture_thumbnails.rb +181 -0
  102. data/app/models/concerns/alchemy/touch_elements.rb +2 -2
  103. data/app/presenters/alchemy/picture_view.rb +88 -0
  104. data/app/serializers/alchemy/element_serializer.rb +5 -0
  105. data/app/serializers/alchemy/page_tree_serializer.rb +3 -2
  106. data/app/services/alchemy/delete_elements.rb +44 -0
  107. data/app/services/alchemy/duplicate_element.rb +56 -0
  108. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +2 -3
  109. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +3 -3
  110. data/app/views/alchemy/admin/attachments/assign.js.erb +11 -0
  111. data/app/views/alchemy/admin/attachments/index.html.erb +2 -3
  112. data/app/views/alchemy/admin/crop.html.erb +36 -0
  113. data/app/views/alchemy/admin/elements/_element.html.erb +14 -10
  114. data/app/views/alchemy/admin/elements/{_element_footer.html.erb → _footer.html.erb} +0 -0
  115. data/app/views/alchemy/admin/elements/{_new_element_form.html.erb → _form.html.erb} +1 -1
  116. data/app/views/alchemy/admin/elements/{_element_header.html.erb → _header.html.erb} +1 -1
  117. data/app/views/alchemy/admin/elements/{_element_toolbar.html.erb → _toolbar.html.erb} +5 -6
  118. data/app/views/alchemy/admin/elements/{trash.js.erb → destroy.js.erb} +1 -3
  119. data/app/views/alchemy/admin/elements/new.html.erb +3 -3
  120. data/app/views/alchemy/admin/elements/order.js.erb +0 -17
  121. data/app/views/alchemy/admin/elements/update.js.erb +3 -2
  122. data/app/views/alchemy/admin/essence_audios/edit.html.erb +7 -0
  123. data/app/views/alchemy/admin/essence_pictures/update.js.erb +0 -1
  124. data/app/views/alchemy/admin/essence_videos/edit.html.erb +11 -0
  125. data/app/views/alchemy/admin/ingredients/_audio_fields.html.erb +4 -0
  126. data/app/views/alchemy/admin/ingredients/_file_fields.html.erb +18 -0
  127. data/app/views/alchemy/admin/ingredients/_picture_fields.html.erb +25 -0
  128. data/app/views/alchemy/admin/ingredients/_video_fields.html.erb +8 -0
  129. data/app/views/alchemy/admin/ingredients/edit.html.erb +4 -0
  130. data/app/views/alchemy/admin/layoutpages/edit.html.erb +0 -5
  131. data/app/views/alchemy/admin/nodes/_node.html.erb +2 -2
  132. data/app/views/alchemy/admin/pages/_anchor_link.html.erb +1 -1
  133. data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
  134. data/app/views/alchemy/admin/pages/_file_link.html.erb +1 -1
  135. data/app/views/alchemy/admin/pages/_form.html.erb +0 -6
  136. data/app/views/alchemy/admin/pages/_internal_link.html.erb +1 -1
  137. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +5 -2
  138. data/app/views/alchemy/admin/pages/_toolbar.html.erb +1 -1
  139. data/app/views/alchemy/admin/pages/edit.html.erb +36 -24
  140. data/app/views/alchemy/admin/pages/index.html.erb +2 -9
  141. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -4
  142. data/app/views/alchemy/admin/partials/_routes.html.erb +7 -11
  143. data/app/views/alchemy/admin/partials/_search_form.html.erb +9 -0
  144. data/app/views/alchemy/admin/pictures/_archive.html.erb +1 -1
  145. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  146. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +5 -7
  147. data/app/views/alchemy/admin/pictures/_infos.html.erb +0 -1
  148. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +4 -4
  149. data/app/views/alchemy/admin/pictures/assign.js.erb +10 -0
  150. data/app/views/alchemy/admin/pictures/index.html.erb +8 -3
  151. data/app/views/alchemy/admin/resources/_filter.html.erb +12 -0
  152. data/app/views/alchemy/admin/resources/_filter_bar.html.erb +14 -17
  153. data/app/views/alchemy/admin/resources/_form.html.erb +3 -0
  154. data/app/views/alchemy/admin/resources/_table_header.html.erb +15 -0
  155. data/app/views/alchemy/admin/resources/index.html.erb +3 -11
  156. data/app/views/alchemy/essences/_essence_audio_editor.html.erb +4 -0
  157. data/app/views/alchemy/essences/_essence_audio_view.html.erb +15 -0
  158. data/app/views/alchemy/essences/_essence_file_editor.html.erb +15 -6
  159. data/app/views/alchemy/essences/_essence_headline_editor.html.erb +36 -0
  160. data/app/views/alchemy/essences/_essence_headline_view.html.erb +10 -0
  161. data/app/views/alchemy/essences/_essence_link_editor.html.erb +8 -4
  162. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +27 -12
  163. data/app/views/alchemy/essences/_essence_picture_view.html.erb +3 -3
  164. data/app/views/alchemy/essences/_essence_text_editor.html.erb +12 -4
  165. data/app/views/alchemy/essences/_essence_video_editor.html.erb +4 -0
  166. data/app/views/alchemy/essences/_essence_video_view.html.erb +18 -0
  167. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +21 -16
  168. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +2 -2
  169. data/app/views/alchemy/ingredients/_audio_editor.html.erb +5 -0
  170. data/app/views/alchemy/ingredients/_audio_view.html.erb +14 -0
  171. data/app/views/alchemy/ingredients/_boolean_editor.html.erb +11 -0
  172. data/app/views/alchemy/ingredients/_boolean_view.html.erb +1 -0
  173. data/app/views/alchemy/ingredients/_datetime_editor.html.erb +17 -0
  174. data/app/views/alchemy/ingredients/_datetime_view.html.erb +9 -0
  175. data/app/views/alchemy/ingredients/_file_editor.html.erb +50 -0
  176. data/app/views/alchemy/ingredients/_file_view.html.erb +17 -0
  177. data/app/views/alchemy/ingredients/_headline_editor.html.erb +30 -0
  178. data/app/views/alchemy/ingredients/_headline_view.html.erb +9 -0
  179. data/app/views/alchemy/ingredients/_html_editor.html.erb +8 -0
  180. data/app/views/alchemy/ingredients/_html_view.html.erb +1 -0
  181. data/app/views/alchemy/ingredients/_link_editor.html.erb +24 -0
  182. data/app/views/alchemy/ingredients/_link_view.html.erb +9 -0
  183. data/app/views/alchemy/ingredients/_node_editor.html.erb +25 -0
  184. data/app/views/alchemy/ingredients/_node_view.html.erb +1 -0
  185. data/app/views/alchemy/ingredients/_page_editor.html.erb +24 -0
  186. data/app/views/alchemy/ingredients/_page_view.html.erb +4 -0
  187. data/app/views/alchemy/ingredients/_picture_editor.html.erb +59 -0
  188. data/app/views/alchemy/ingredients/_picture_view.html.erb +5 -0
  189. data/app/views/alchemy/ingredients/_richtext_editor.html.erb +12 -0
  190. data/app/views/alchemy/ingredients/_richtext_view.html.erb +3 -0
  191. data/app/views/alchemy/ingredients/_select_editor.html.erb +29 -0
  192. data/app/views/alchemy/ingredients/_select_view.html.erb +1 -0
  193. data/app/views/alchemy/ingredients/_text_editor.html.erb +19 -0
  194. data/app/views/alchemy/ingredients/_text_view.html.erb +16 -0
  195. data/app/views/alchemy/ingredients/_video_editor.html.erb +5 -0
  196. data/app/views/alchemy/ingredients/_video_view.html.erb +17 -0
  197. data/app/views/alchemy/ingredients/shared/_link_tools.html.erb +20 -0
  198. data/app/views/alchemy/ingredients/shared/_picture_tools.html.erb +57 -0
  199. data/config/brakeman.ignore +66 -159
  200. data/config/initializers/dragonfly.rb +10 -0
  201. data/config/locales/alchemy.en.yml +108 -64
  202. data/config/routes.rb +17 -22
  203. data/db/migrate/20201207131309_create_page_versions.rb +19 -0
  204. data/db/migrate/20201207135820_add_page_version_id_to_alchemy_elements.rb +76 -0
  205. data/db/migrate/20210205143548_rename_public_on_and_public_until_on_alchemy_pages.rb +10 -0
  206. data/db/migrate/20210326105046_add_sanitized_body_to_alchemy_essence_richtexts.rb +7 -0
  207. data/db/migrate/20210406093436_add_alchemy_essence_headlines.rb +12 -0
  208. data/db/migrate/20210506135919_create_essence_audios.rb +19 -0
  209. data/db/migrate/20210506140258_create_essence_videos.rb +23 -0
  210. data/db/migrate/20210508091432_create_alchemy_ingredients.rb +22 -0
  211. data/lib/alchemy/admin/preview_url.rb +2 -0
  212. data/lib/alchemy/deprecation.rb +1 -1
  213. data/lib/alchemy/dragonfly/processors/auto_orient.rb +18 -0
  214. data/lib/alchemy/dragonfly/processors/crop_resize.rb +35 -0
  215. data/lib/alchemy/elements_finder.rb +14 -60
  216. data/lib/alchemy/essence.rb +1 -2
  217. data/lib/alchemy/forms/builder.rb +21 -1
  218. data/lib/alchemy/hints.rb +8 -4
  219. data/lib/alchemy/page_layout.rb +0 -13
  220. data/lib/alchemy/permissions.rb +30 -29
  221. data/lib/alchemy/resource.rb +18 -6
  222. data/lib/alchemy/resource_filter.rb +40 -0
  223. data/lib/alchemy/resources_helper.rb +1 -16
  224. data/lib/alchemy/tasks/tidy.rb +29 -0
  225. data/lib/alchemy/test_support.rb +2 -4
  226. data/lib/alchemy/test_support/essence_shared_examples.rb +0 -1
  227. data/lib/alchemy/test_support/factories/element_factory.rb +8 -8
  228. data/lib/alchemy/test_support/factories/essence_audio_factory.rb +7 -0
  229. data/lib/alchemy/test_support/factories/essence_video_factory.rb +7 -0
  230. data/lib/alchemy/test_support/factories/ingredient_factory.rb +25 -0
  231. data/lib/alchemy/test_support/factories/page_factory.rb +20 -1
  232. data/lib/alchemy/test_support/factories/page_version_factory.rb +23 -0
  233. data/lib/alchemy/test_support/having_crop_action_examples.rb +170 -0
  234. data/lib/alchemy/test_support/having_picture_thumbnails_examples.rb +646 -0
  235. data/lib/alchemy/test_support/shared_ingredient_editor_examples.rb +21 -0
  236. data/lib/alchemy/test_support/shared_ingredient_examples.rb +75 -0
  237. data/lib/alchemy/tinymce.rb +17 -0
  238. data/lib/alchemy/upgrader/six_point_zero.rb +21 -0
  239. data/lib/alchemy/upgrader/tasks/add_page_versions.rb +33 -0
  240. data/lib/alchemy/upgrader/tasks/ingredients_migrator.rb +59 -0
  241. data/lib/alchemy/version.rb +1 -1
  242. data/lib/alchemy_cms.rb +1 -0
  243. data/lib/generators/alchemy/elements/elements_generator.rb +1 -0
  244. data/lib/generators/alchemy/elements/templates/view.html.erb +9 -0
  245. data/lib/generators/alchemy/elements/templates/view.html.haml +9 -0
  246. data/lib/generators/alchemy/elements/templates/view.html.slim +9 -0
  247. data/lib/generators/alchemy/ingredient/ingredient_generator.rb +38 -0
  248. data/lib/generators/alchemy/ingredient/templates/editor.html.erb +14 -0
  249. data/lib/generators/alchemy/ingredient/templates/model.rb.tt +13 -0
  250. data/lib/generators/alchemy/ingredient/templates/view.html.erb +1 -0
  251. data/lib/generators/alchemy/install/templates/dragonfly.rb.tt +1 -1
  252. data/lib/generators/alchemy/menus/templates/node.html.erb +1 -1
  253. data/lib/generators/alchemy/menus/templates/node.html.haml +1 -1
  254. data/lib/generators/alchemy/menus/templates/node.html.slim +1 -1
  255. data/lib/generators/alchemy/menus/templates/wrapper.html.erb +1 -1
  256. data/lib/generators/alchemy/menus/templates/wrapper.html.haml +1 -1
  257. data/lib/generators/alchemy/menus/templates/wrapper.html.slim +1 -1
  258. data/lib/tasks/alchemy/thumbnails.rake +4 -2
  259. data/lib/tasks/alchemy/tidy.rake +12 -0
  260. data/lib/tasks/alchemy/upgrade.rake +26 -0
  261. data/package.json +3 -2
  262. data/package/admin.js +11 -1
  263. data/package/src/__tests__/i18n.spec.js +23 -0
  264. data/package/src/file_editors.js +28 -0
  265. data/package/src/i18n.js +1 -3
  266. data/package/src/image_cropper.js +103 -0
  267. data/package/src/image_loader.js +58 -0
  268. data/package/src/node_tree.js +5 -5
  269. data/package/src/picture_editors.js +169 -0
  270. data/package/src/utils/__tests__/ajax.spec.js +20 -12
  271. data/package/src/utils/ajax.js +8 -3
  272. data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +3 -18
  273. data/vendor/assets/stylesheets/jquery.Jcrop.min.scss +2 -28
  274. metadata +290 -53
  275. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +0 -44
  276. data/app/assets/javascripts/alchemy/alchemy.trash_window.js.coffee +0 -30
  277. data/app/assets/stylesheets/alchemy/trash.scss +0 -8
  278. data/app/controllers/alchemy/admin/trash_controller.rb +0 -44
  279. data/app/views/alchemy/admin/attachments/_filter_bar.html.erb +0 -29
  280. data/app/views/alchemy/admin/essence_files/assign.js.erb +0 -3
  281. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +0 -4
  282. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +0 -48
  283. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +0 -30
  284. data/app/views/alchemy/admin/trash/clear.js.erb +0 -4
  285. data/app/views/alchemy/admin/trash/index.html.erb +0 -31
  286. data/lib/alchemy/test_support/factories.rb +0 -16
@@ -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
@@ -57,6 +57,90 @@ en:
57
57
  main_menu: Main Menu
58
58
  footer_menu: Footer Menu
59
59
 
60
+ # == Mime Types translations
61
+ # These are human readable mime types used for the document-type row in archive files.
62
+ #
63
+ mime_types: &mime_types
64
+ application/msexcel: Excel Spreadsheet
65
+ application/mspowerpoint: PowerPoint Presentation
66
+ application/msword: Word Document
67
+ application/pdf: PDF Document
68
+ application/rtf: RTF Document
69
+ application/vcard: vCard
70
+ application/vnd:
71
+ ms-excel: Excel Spreadsheet
72
+ ms-powerpoint: PowerPoint Presentation
73
+ ms-word: Word Document
74
+ openxmlformats-officedocument:
75
+ presentationml:
76
+ presentation: PowerPoint 2007 Presentation
77
+ spreadsheetml:
78
+ sheet: Excel 2007 Spreadsheet
79
+ wordprocessingml:
80
+ document: Word 2007 Document
81
+ application/x-flash-video: Flash Video
82
+ application/x-rar: RAR Archive
83
+ application/x-shockwave-flash: Flash Movie
84
+ application/zip: ZIP Archive
85
+ audio/mp4: MPEG-4 Audio
86
+ audio/mpeg: MP3 Audio
87
+ audio/wav: WAV Audio
88
+ audio/x-wav: WAV Audio
89
+ image/gif: GIF Image
90
+ image/jpeg: JPG Image
91
+ image/png: PNG Image
92
+ image/tiff: TIFF Image
93
+ image/x-psd: Photoshop File
94
+ image/svg+xml: SVG Image
95
+ text/plain: Plain Text Document
96
+ text/x-vcard: vCard
97
+ video/mp4: MPEG-4 Video
98
+ video/mpeg: MPEG Video
99
+ video/quicktime: Quicktime Video
100
+ video/x-flv: Flash Video
101
+ video/x-ms-wmv: Windows Media Video
102
+ video/x-msvideo: AVI Video
103
+
104
+ # === Translations for filter names and values
105
+ # Used in the right filter column in case the model has `alchemy_resource_filters` defined.
106
+ #
107
+ filters:
108
+ page:
109
+ by_page_layout:
110
+ name: Page Type
111
+ status:
112
+ name: Status
113
+ values:
114
+ not_public: Unpublished
115
+ published: Published
116
+ restricted: Restricted
117
+ picture:
118
+ by_file_format:
119
+ name: File Type
120
+ values:
121
+ gif: GIF Image
122
+ jpeg: JPG Image
123
+ png: PNG Image
124
+ tiff: TIFF Image
125
+ misc:
126
+ name: Miscellaneous
127
+ values:
128
+ last_upload: Last upload only
129
+ recent: Recently uploaded only
130
+ without_tag: Without tag
131
+ attachment:
132
+ by_file_type:
133
+ name: File Type
134
+ values:
135
+ <<: *mime_types
136
+ misc:
137
+ name: Miscellaneous
138
+ values:
139
+ last_upload: Last upload only
140
+ recent: Recently uploaded only
141
+ without_tag: Without tag
142
+ deletable: Not linked by file content
143
+
60
144
  # === Translations for content validations
61
145
  # Used when a user did not enter (correct) values to the content field.
62
146
  #
@@ -89,6 +173,11 @@ en:
89
173
  right: 'Right from text'
90
174
  no_float: 'Above the text'
91
175
 
176
+ ingredient_values:
177
+ boolean:
178
+ true: "True"
179
+ false: "False"
180
+
92
181
  # == Contactform translations
93
182
  contactform:
94
183
  labels:
@@ -127,49 +216,6 @@ en:
127
216
  editor: "Editor"
128
217
  admin: "Administrator"
129
218
 
130
- # == Mime Types translations
131
- # These are human readable mime types used for the document-type row in archive files.
132
- mime_types:
133
- application/msexcel: Excel Spreadsheet
134
- application/mspowerpoint: PowerPoint Presentation
135
- application/msword: Word Document
136
- application/pdf: PDF Document
137
- application/rtf: RTF Document
138
- application/vcard: vCard
139
- application/vnd:
140
- ms-excel: Excel Spreadsheet
141
- ms-powerpoint: PowerPoint Presentation
142
- ms-word: Word Document
143
- openxmlformats-officedocument:
144
- presentationml:
145
- presentation: PowerPoint 2007 Presentation
146
- spreadsheetml:
147
- sheet: Excel 2007 Spreadsheet
148
- wordprocessingml:
149
- document: Word 2007 Document
150
- application/x-flash-video: Flash Video
151
- application/x-rar: RAR Archive
152
- application/x-shockwave-flash: Flash Movie
153
- application/zip: ZIP Archive
154
- audio/mp4: MPEG-4 Audio
155
- audio/mpeg: MP3 Audio
156
- audio/wav: WAV Audio
157
- audio/x-wav: WAV Audio
158
- image/gif: GIF Image
159
- image/jpeg: JPG Image
160
- image/png: PNG Image
161
- image/tiff: TIFF Image
162
- image/x-psd: Photoshop File
163
- image/svg+xml: SVG Image
164
- text/plain: Plain Text Document
165
- text/x-vcard: vCard
166
- video/mp4: MPEG-4 Video
167
- video/mpeg: MPEG Video
168
- video/quicktime: Quicktime Video
169
- video/x-flv: Flash Video
170
- video/x-ms-wmv: Windows Media Video
171
- video/x-msvideo: AVI Video
172
-
173
219
  link_target_options:
174
220
  default: Same Window
175
221
  blank: New Window/Tab
@@ -194,7 +240,6 @@ en:
194
240
  'An error happened': 'An error happened'
195
241
  "Change password": "Change password"
196
242
  "Choose page": "Choose page"
197
- "Cleared trash": "Cleared trash"
198
243
  "Clear selection": "Clear selection"
199
244
  "Forgot your password?": "Forgot your password?"
200
245
  "Clipboard": "Clipboard"
@@ -204,15 +249,14 @@ en:
204
249
  "Currently locked pages": "Currently locked pages"
205
250
  "Default language has to be public": "Default language has to be public"
206
251
  "Delete image": "Delete image"
252
+ "Delete element": "Delete element"
207
253
  "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
254
  "Do you really want to delete this content?": "Do you really want to delete this content?"
210
255
  "Drag an element over to the element window to restore it": "Drag an element over to the element window to restore it"
211
256
  "Edit Picturemask": "Edit picturemask"
212
257
  "Edit image": "Edit image"
213
258
  "Edit multiple pictures": "Edit multiple pictures"
214
259
  "Elements": "Elements"
215
- "Element trashed": "Element trashed"
216
260
  "Error with the Flash® Uploader!": "Error with the Flash® Uploader!"
217
261
  "Excerpt": "Excerpt"
218
262
  "File successfully updated": "File successfully updated"
@@ -268,7 +312,6 @@ en:
268
312
  "Please log in": "Please log in."
269
313
  "Please seperate the tags with commata": "* Please seperate the tags with commas."
270
314
  "Properties": "Properties"
271
- "Publish page": "Publish page"
272
315
  "Read the License": "Read the License"
273
316
  "Redirects to": "Redirects to"
274
317
  "Reload Preview": "Reload Preview"
@@ -287,7 +330,6 @@ en:
287
330
  "Show clipboard": "Show clipboard"
288
331
  "Copied to clipboard": "Copied to clipboard"
289
332
  "Show picture infos": "Show picture infos"
290
- "Show trash": "Show trash"
291
333
  "Site successfully created": "Website successfully created."
292
334
  "Site successfully removed": "Website successfully removed."
293
335
  "Site successfully updated": "Website successfully updated."
@@ -295,6 +337,7 @@ en:
295
337
  "Sort pages": "Reorder pages"
296
338
  "Successfully added content": "Successfully added %{content}"
297
339
  "Successfully deleted content": "Successfully deleted %{content}"
340
+ "Successfully deleted element": "Successfully deleted %{element}"
298
341
  "Tags": "Tags"
299
342
  "These pictures could not be deleted, because they were in use": "These pictures could not be deleted, because they were in use: %{names}"
300
343
  "This page is locked": "This page is currently locked by %{name}"
@@ -310,6 +353,7 @@ en:
310
353
  "Warning!": "Warning!"
311
354
  content_definition_missing: "Warning: Content is missing its definition. Please check the elements.yml"
312
355
  content_deprecated: "WARNING! This content is deprecated and will be removed soon. Please do not use it anymore."
356
+ ingredient_deprecated: "WARNING! This content is deprecated and will be removed soon. Please do not use it anymore."
313
357
  element_definition_missing: "WARNING! Missing element definition. Please check your elements.yml file."
314
358
  element_deprecated: "WARNING! This element is deprecated and will be removed soon. Please do not use it anymore."
315
359
  page_definition_missing: "WARNING! Missing page layout definition. Please check your page_layouts.yml file."
@@ -321,7 +365,6 @@ en:
321
365
  element_dirty_close_window_notice: "You have unsaved elements. Do you really want to close the elements window?"
322
366
  "Your last login was on": "Your last login was on %{time}."
323
367
  "Your last updated pages": "Your last updated pages"
324
- "Your trash is empty": "Your trash is empty"
325
368
  above: "above"
326
369
  add: "Add"
327
370
  align_in_text: "Alignment in text"
@@ -329,7 +372,6 @@ en:
329
372
  all_pictures: "All pictures"
330
373
  apply: "apply"
331
374
  assign_file: "Assign a file"
332
- assign_file_from_archive: "assign a file from your archive"
333
375
  assign_image: "Assign an image"
334
376
  attached_to: "attached to"
335
377
  attachment_filename_notice: "* Please do not use any special characters for the filename."
@@ -337,17 +379,18 @@ en:
337
379
  big_thumbnails: "Big thumbnails"
338
380
  cancel: "cancel"
339
381
  cannot_delete_picture_notice: "Cannot delete Picture %{name}, because it's still in use."
382
+ cannot_visit_unpublic_page: "Publish page before visiting it."
340
383
  choose_file_to_link: "Please choose a file to link"
341
384
  "clear clipboard": "clear clipboard"
342
- "clear trash": "clear trash"
343
385
  click_to_show_all: "Click to show all again."
386
+ confirm_to_delete_element: "Do you really want to delete this element? It cannot be restored!"
344
387
  confirm_to_delete_file: "Do you really want to delete this file from the server?"
345
388
  confirm_to_delete_image: "Do you really want to delete this image from server?"
346
389
  confirm_to_delete_image_from_server: "Do you really want to delete this image from the server?"
347
390
  confirm_to_delete_images_from_server: "Do you really want to delete these images from the server?"
348
391
  confirm_to_delete_menu: "Do you really want to delete this menu?"
349
392
  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!"
393
+ confirm_to_delete_page: "Do you really want to delete this page?"
351
394
  content_essence_not_found: "Content essence not found"
352
395
  content_not_found: "Field for content not present."
353
396
  content_validations_headline: "Please check marked fields below"
@@ -393,7 +436,7 @@ en:
393
436
  element_saved: "Saved element."
394
437
  enter_external_link: "Please enter the URL you want to link with"
395
438
  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."
439
+ explain_publishing: "Publish current page content"
397
440
  explain_sitemap_dragndrop_sorting: "Tip: Drag the pages at the icon in order to sort them."
398
441
  explain_unlocking: "Leave page and unlock it for other users."
399
442
  external_link_notice_1: "Please enter the complete url with http:// or a similar protocol."
@@ -401,6 +444,7 @@ en:
401
444
  female: "Female"
402
445
  file: "File"
403
446
  file_rename_error: "Error renaming file."
447
+ filtered_by: "Filtered by"
404
448
  from_at: "from %{by} at %{at}"
405
449
  height: "Height"
406
450
  help:
@@ -422,7 +466,7 @@ en:
422
466
  dashboard: "Dashboard"
423
467
  image_alt_tag: "Alt-tag"
424
468
  image_caption: "Caption"
425
- image_name: "Name"
469
+ image_name: "Name: %{name}"
426
470
  image_title: "Title-tag"
427
471
  internal_link_headline: "Search for a page to link to by entering its name into the Page select."
428
472
  internal_link_page_elements_explanation: "Additionally you can choose an anchor to an element from selected page."
@@ -433,7 +477,6 @@ en:
433
477
  javascript_disabled_text: "Alchemy needs Javascript to run smoothly. Please enable it in your browser settings."
434
478
  language_code_placeholder: 'i.e. en'
435
479
  language_pages_copied: "Language tree successfully copied."
436
- last_upload_only: "Last upload only"
437
480
  left: "left"
438
481
  legacy_url_info_text: "A link is a redirect from an old URL to the current URL of this page. This redirect happens with a <a href='https://support.google.com/webmasters/answer/93633' target='_blank'>301 status code</a>."
439
482
  link_image: "Link this image."
@@ -491,7 +534,7 @@ en:
491
534
  or_replace_it_with_an_existing_tag: 'Or replace it with an existing tag'
492
535
  "Page created": "Page: '%{name}' created."
493
536
  page_infos: 'Page info'
494
- page_layout_changed_notice: "Page type was changed. Elements not usable anymore have been moved into the trash."
537
+ page_layout_changed_notice: "Page type was changed. Elements not usable anymore have been hided."
495
538
  page_properties: "Page properties"
496
539
  page_public: "published"
497
540
  page_published: "Published page"
@@ -517,11 +560,6 @@ en:
517
560
  comma_seperated: "Separate by comma"
518
561
  password: "Password"
519
562
  paste: "paste"
520
- picture_library:
521
- filter:
522
- last_upload: "from last upload"
523
- recent: "that where recently uploaded"
524
- without_tag: "without tag"
525
563
  pictures_in_page: "%{page} in %{pictures}"
526
564
  place_link: "Link text"
527
565
  player_version: "Flash Player version"
@@ -538,6 +576,8 @@ en:
538
576
  '1024': '1024px (iPad - Landscape)'
539
577
  '1280': '1280px (Desktop)'
540
578
  preview_url: Preview
579
+ publish_page_language_not_public: Cannot publish page if language is not public
580
+ publish_page_not_allowed: You have not the permission to publish this page
541
581
  recently_uploaded_only: 'Recently uploaded only'
542
582
  "regular method": "Regular method"
543
583
  remove: "Remove"
@@ -568,7 +608,6 @@ en:
568
608
  subject: "Subject"
569
609
  successfully_added_element: "Successfully added new element."
570
610
  successfully_deleted_tag: "Successfully deleted tag"
571
- successfully_restored_element: "Element restored successfully."
572
611
  successfully_saved_element_position: "Element position updated successfully."
573
612
  successfully_updated_tag: "Successfully updated tag"
574
613
  swap_image: "Change image"
@@ -578,7 +617,6 @@ en:
578
617
  this_picture_is_used_on_these_pages: "This picture is used on following pages"
579
618
  title: "Title"
580
619
  to_alchemy: "To Alchemy"
581
- "trash element": "Put element into trash"
582
620
  unknown: "unknown"
583
621
  unlink: "Remove link from this image."
584
622
  unlock_page: "Leave page"
@@ -704,11 +742,18 @@ en:
704
742
  # Translations for Alchemy models
705
743
  activemodel:
706
744
  models:
745
+ alchemy/essence_headline:
746
+ one: Headline
747
+ other: Headline
707
748
  alchemy/message:
708
749
  one: Message
709
750
  other: Messages
710
751
  alchemy/admin/preview_url: Internal
711
752
  attributes:
753
+ alchemy/essence_headline:
754
+ body: Headline
755
+ level: Level
756
+ size: Size
712
757
  alchemy/message:
713
758
  salutation: 'Salutation'
714
759
  firstname: 'Firstname'
@@ -785,7 +830,6 @@ en:
785
830
  name: "Name"
786
831
  public: "visible"
787
832
  tag_list: Tags
788
- trashed: Trashed
789
833
  alchemy/essence_file:
790
834
  css_class: Style
791
835
  alchemy/essence_picture: