alchemy_cms 4.4.4 → 5.0.0.beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +56 -18
  3. data/.github/workflows/stale.yml +1 -1
  4. data/.gitignore +20 -2
  5. data/.hound.yml +2 -1
  6. data/.prettierrc +6 -0
  7. data/.rubocop.yml +33 -20
  8. data/CHANGELOG.md +121 -0
  9. data/Gemfile +24 -22
  10. data/README.md +31 -19
  11. data/Rakefile +10 -8
  12. data/alchemy_cms.gemspec +7 -5
  13. data/app/assets/javascripts/alchemy/admin.js +1 -2
  14. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +2 -1
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -2
  16. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +5 -5
  17. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +17 -17
  18. data/app/assets/javascripts/alchemy/node_select.js +39 -0
  19. data/app/assets/javascripts/alchemy/templates/index.js +2 -0
  20. data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
  21. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +3 -0
  22. data/app/assets/javascripts/alchemy/templates/page.hbs +1 -1
  23. data/app/assets/stylesheets/alchemy/_mixins.scss +2 -3
  24. data/app/assets/stylesheets/alchemy/_variables.scss +2 -2
  25. data/app/assets/stylesheets/alchemy/admin.scss +3 -2
  26. data/app/assets/stylesheets/alchemy/base.scss +0 -1
  27. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  28. data/app/assets/stylesheets/alchemy/forms.scss +5 -0
  29. data/app/assets/stylesheets/alchemy/lists.scss +0 -8
  30. data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
  31. data/app/assets/stylesheets/alchemy/nodes.scss +6 -1
  32. data/app/assets/stylesheets/alchemy/sitemap.scss +63 -21
  33. data/app/assets/stylesheets/alchemy/tables.scss +1 -24
  34. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
  35. data/app/controllers/alchemy/admin/base_controller.rb +13 -33
  36. data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
  37. data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
  38. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
  39. data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
  40. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
  41. data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
  42. data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
  43. data/app/controllers/alchemy/admin/nodes_controller.rb +5 -14
  44. data/app/controllers/alchemy/admin/pages_controller.rb +50 -63
  45. data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
  46. data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
  47. data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
  48. data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
  49. data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
  50. data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
  51. data/app/controllers/alchemy/api/base_controller.rb +2 -2
  52. data/app/controllers/alchemy/api/contents_controller.rb +4 -4
  53. data/app/controllers/alchemy/api/elements_controller.rb +8 -8
  54. data/app/controllers/alchemy/api/nodes_controller.rb +65 -0
  55. data/app/controllers/alchemy/api/pages_controller.rb +15 -22
  56. data/app/controllers/alchemy/attachments_controller.rb +5 -5
  57. data/app/controllers/alchemy/base_controller.rb +10 -9
  58. data/app/controllers/alchemy/messages_controller.rb +16 -23
  59. data/app/controllers/alchemy/pages_controller.rb +13 -11
  60. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
  61. data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
  62. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
  63. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
  64. data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
  65. data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
  66. data/app/decorators/alchemy/content_editor.rb +55 -0
  67. data/app/decorators/alchemy/element_editor.rb +39 -0
  68. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
  69. data/app/helpers/alchemy/admin/base_helper.rb +36 -35
  70. data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
  71. data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
  72. data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
  73. data/app/helpers/alchemy/admin/form_helper.rb +1 -1
  74. data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
  75. data/app/helpers/alchemy/admin/pages_helper.rb +12 -12
  76. data/app/helpers/alchemy/admin/pictures_helper.rb +4 -6
  77. data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
  78. data/app/helpers/alchemy/base_helper.rb +13 -8
  79. data/app/helpers/alchemy/elements_block_helper.rb +2 -31
  80. data/app/helpers/alchemy/elements_helper.rb +12 -58
  81. data/app/helpers/alchemy/pages_helper.rb +24 -174
  82. data/app/helpers/alchemy/url_helper.rb +2 -1
  83. data/app/mailers/alchemy/base_mailer.rb +1 -1
  84. data/app/mailers/alchemy/messages_mailer.rb +1 -1
  85. data/app/models/alchemy/attachment.rb +20 -18
  86. data/app/models/alchemy/base_record.rb +2 -5
  87. data/app/models/alchemy/content.rb +33 -52
  88. data/app/models/alchemy/content/factory.rb +24 -31
  89. data/app/models/alchemy/element.rb +45 -53
  90. data/app/models/alchemy/element/definitions.rb +4 -4
  91. data/app/models/alchemy/element/element_contents.rb +9 -6
  92. data/app/models/alchemy/element/element_essences.rb +4 -3
  93. data/app/models/alchemy/element/presenters.rb +3 -2
  94. data/app/models/alchemy/element_to_page.rb +1 -1
  95. data/app/models/alchemy/essence_boolean.rb +1 -3
  96. data/app/models/alchemy/essence_date.rb +2 -3
  97. data/app/models/alchemy/essence_file.rb +4 -4
  98. data/app/models/alchemy/essence_html.rb +1 -3
  99. data/app/models/alchemy/essence_link.rb +1 -3
  100. data/app/models/alchemy/essence_node.rb +18 -0
  101. data/app/models/alchemy/essence_page.rb +3 -16
  102. data/app/models/alchemy/essence_picture.rb +17 -16
  103. data/app/models/alchemy/essence_picture_view.rb +7 -6
  104. data/app/models/alchemy/essence_richtext.rb +1 -3
  105. data/app/models/alchemy/essence_select.rb +1 -3
  106. data/app/models/alchemy/essence_text.rb +0 -2
  107. data/app/models/alchemy/folded_page.rb +1 -0
  108. data/app/models/alchemy/language.rb +21 -35
  109. data/app/models/alchemy/language/code.rb +4 -4
  110. data/app/models/alchemy/legacy_page_url.rb +1 -1
  111. data/app/models/alchemy/message.rb +3 -3
  112. data/app/models/alchemy/node.rb +55 -9
  113. data/app/models/alchemy/page.rb +53 -123
  114. data/app/models/alchemy/page/fixed_attributes.rb +3 -2
  115. data/app/models/alchemy/page/page_elements.rb +35 -44
  116. data/app/models/alchemy/page/page_naming.rb +20 -70
  117. data/app/models/alchemy/page/page_natures.rb +7 -34
  118. data/app/models/alchemy/page/page_scopes.rb +23 -29
  119. data/app/models/alchemy/page/url_path.rb +64 -0
  120. data/app/models/alchemy/picture.rb +40 -30
  121. data/app/models/alchemy/picture/preprocessor.rb +26 -0
  122. data/app/models/alchemy/picture/transformations.rb +9 -7
  123. data/app/models/alchemy/picture/url.rb +5 -5
  124. data/app/models/alchemy/site.rb +6 -36
  125. data/app/models/alchemy/site/layout.rb +2 -2
  126. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  127. data/app/serializers/alchemy/content_serializer.rb +0 -3
  128. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  129. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  130. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  131. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  132. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  133. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  134. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  135. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  136. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  137. data/app/serializers/alchemy/node_serializer.rb +14 -0
  138. data/app/serializers/alchemy/page_serializer.rb +2 -1
  139. data/app/serializers/alchemy/page_tree_serializer.rb +11 -14
  140. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  141. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  142. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  143. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  144. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  145. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  146. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  147. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  148. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  149. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  150. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  151. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  152. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  153. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  154. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  155. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  156. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  157. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  158. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  159. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -2
  160. data/app/views/alchemy/admin/nodes/_form.html.erb +23 -15
  161. data/app/views/alchemy/admin/nodes/_node.html.erb +5 -19
  162. data/app/views/alchemy/admin/nodes/index.html.erb +3 -18
  163. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  164. data/app/views/alchemy/admin/pages/_form.html.erb +1 -2
  165. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  166. data/app/views/alchemy/admin/pages/_page.html.erb +14 -25
  167. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  168. data/app/views/alchemy/admin/pages/_sitemap.html.erb +6 -0
  169. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  170. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  171. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  172. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  173. data/app/views/alchemy/admin/partials/_routes.html.erb +8 -0
  174. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  175. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  176. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  177. data/app/views/alchemy/admin/pictures/index.html.erb +18 -3
  178. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  179. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  180. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  181. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  182. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  183. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  184. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  185. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  186. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  187. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  188. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  189. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  190. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  191. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  192. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  193. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  194. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  195. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  196. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  197. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  198. data/app/views/alchemy/pages/show.rss.builder +3 -2
  199. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  200. data/babel.config.js +12 -0
  201. data/bin/rails +5 -4
  202. data/config/alchemy/config.yml +23 -22
  203. data/config/brakeman.ignore +1 -1
  204. data/config/initializers/assets.rb +2 -1
  205. data/config/initializers/dragonfly.rb +2 -1
  206. data/config/initializers/mime_types.rb +1 -0
  207. data/config/initializers/mini_profiler.rb +3 -2
  208. data/config/initializers/simple_form.rb +6 -6
  209. data/config/locales/alchemy.en.yml +37 -14
  210. data/config/routes.rb +32 -28
  211. data/config/spring.rb +3 -2
  212. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  213. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  214. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  215. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  216. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  217. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  218. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  219. data/lib/alchemy/admin/locale.rb +3 -1
  220. data/lib/alchemy/admin/preview_url.rb +85 -0
  221. data/lib/alchemy/auth_accessors.rb +8 -7
  222. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  223. data/lib/alchemy/config.rb +26 -2
  224. data/lib/alchemy/configuration_methods.rb +3 -1
  225. data/lib/alchemy/controller_actions.rb +6 -5
  226. data/lib/alchemy/deprecation.rb +2 -1
  227. data/lib/alchemy/elements_finder.rb +5 -5
  228. data/lib/alchemy/engine.rb +23 -8
  229. data/lib/alchemy/errors.rb +0 -7
  230. data/lib/alchemy/essence.rb +17 -16
  231. data/lib/alchemy/filetypes.rb +5 -5
  232. data/lib/alchemy/forms/builder.rb +4 -4
  233. data/lib/alchemy/hints.rb +1 -1
  234. data/lib/alchemy/i18n.rb +2 -1
  235. data/lib/alchemy/modules.rb +12 -12
  236. data/lib/alchemy/name_conversions.rb +5 -5
  237. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  238. data/lib/alchemy/page_layout.rb +15 -12
  239. data/lib/alchemy/paths.rb +1 -1
  240. data/lib/alchemy/permissions.rb +7 -6
  241. data/lib/alchemy/resource.rb +23 -13
  242. data/lib/alchemy/resources_helper.rb +12 -18
  243. data/lib/alchemy/routing_constraints.rb +1 -1
  244. data/lib/alchemy/seeder.rb +42 -14
  245. data/lib/alchemy/shell.rb +13 -10
  246. data/lib/alchemy/taggable.rb +1 -0
  247. data/lib/alchemy/tasks/tidy.rb +4 -3
  248. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  249. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  250. data/lib/alchemy/test_support/factories.rb +1 -1
  251. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  252. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  253. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  254. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  255. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  256. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  257. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  258. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  259. data/lib/alchemy/test_support/factories/language_factory.rb +21 -14
  260. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  261. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  262. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  263. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  264. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  265. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  266. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  267. data/lib/alchemy/tinymce.rb +15 -13
  268. data/lib/alchemy/upgrader.rb +8 -7
  269. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  270. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  271. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  272. data/lib/alchemy/version.rb +1 -1
  273. data/lib/alchemy_cms.rb +52 -50
  274. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  275. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  276. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  277. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  278. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  279. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  280. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  281. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  283. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  285. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  286. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  287. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  288. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  289. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  290. data/lib/generators/alchemy/install/install_generator.rb +110 -0
  291. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  292. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  293. data/lib/generators/alchemy/install/templates/menus.yml.tt +8 -0
  294. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  295. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +5 -5
  296. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  297. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  298. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  299. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  300. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +2 -2
  301. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +2 -2
  302. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  303. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  305. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  306. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  307. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  308. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  309. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  310. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  311. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  312. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  313. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  314. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  315. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  316. data/lib/tasks/alchemy/db.rake +3 -19
  317. data/lib/tasks/alchemy/install.rake +3 -2
  318. data/lib/tasks/alchemy/tidy.rake +9 -8
  319. data/lib/tasks/alchemy/upgrade.rake +28 -105
  320. data/package.json +45 -0
  321. data/package/admin.js +14 -0
  322. data/package/src/__tests__/i18n.spec.js +70 -0
  323. data/package/src/i18n.js +48 -0
  324. data/package/src/node_tree.js +72 -0
  325. data/package/src/translations.js +32 -0
  326. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  327. data/package/src/utils/__tests__/events.spec.js +38 -0
  328. data/package/src/utils/ajax.js +48 -0
  329. data/package/src/utils/events.js +16 -0
  330. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  331. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  332. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  333. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  334. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  335. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  336. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  337. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  338. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  339. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  340. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  341. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  342. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  343. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  344. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  345. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  346. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  347. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  348. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  349. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  350. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  351. metadata +131 -83
  352. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  353. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  354. data/app/helpers/alchemy/essences_helper.rb +0 -119
  355. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  356. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  357. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  358. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -33
  359. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  360. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  361. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  362. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  363. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  364. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  365. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  366. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  367. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  368. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  369. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  370. data/lib/alchemy/ssl_protection.rb +0 -32
  371. data/lib/alchemy/tasks/helpers.rb +0 -81
  372. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  373. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  374. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  375. data/lib/alchemy/upgrader/four_point_two.rb +0 -85
  376. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -43
  377. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -148
  378. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -28
  379. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  380. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  381. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  382. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  383. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  384. data/lib/tasks/alchemy/convert.rake +0 -95
  385. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  386. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
@@ -1,43 +0,0 @@
1
- module Alchemy::Upgrader::Tasks
2
- class CellsMigration
3
- class Cell < ActiveRecord::Base
4
- self.table_name = 'alchemy_cells'
5
- belongs_to :page, class_name: 'Alchemy::Page'
6
- end
7
-
8
- def migrate_cells
9
- if ActiveRecord::Base.connection.data_source_exists?('alchemy_cells')
10
- cells = Cell.all
11
-
12
- if cells.any?
13
- cells.each do |cell|
14
- migrate_cell!(cell)
15
- end
16
- else
17
- puts "No cells found. Skip"
18
- end
19
- else
20
- puts "Cells table does not exist. Skip"
21
- end
22
- end
23
-
24
- private
25
-
26
- def migrate_cell!(cell)
27
- # bust element definitions insta cache
28
- Alchemy::Element.instance_variable_set('@definitions', nil)
29
- fixed_element = Alchemy::Element.find_or_initialize_by(fixed: true, name: cell.name, page: cell.page)
30
- elements = Alchemy::Element.where(cell_id: cell.id).order(position: :asc)
31
-
32
- if fixed_element.new_record?
33
- fixed_element.save!
34
- Alchemy::Element.acts_as_list_no_update do
35
- elements.update_all(parent_element_id: fixed_element.id)
36
- end
37
- puts "Created new fixed element '#{fixed_element.name}' for cell '#{cell.name}'."
38
- else
39
- puts "Element for cell '#{cell.name}' already present. Skip"
40
- end
41
- end
42
- end
43
- end
@@ -1,148 +0,0 @@
1
- require 'alchemy/upgrader'
2
- require 'rails/generators'
3
-
4
- module Alchemy::Upgrader::Tasks
5
- class CellsUpgrader < Thor
6
- include Thor::Actions
7
-
8
- no_tasks do
9
- def convert_cells
10
- if File.exist?(page_layouts_config_file)
11
- backup_config
12
- convert_page_layouts_config
13
- else
14
- puts "\nNo page layouts config found. Skipping."
15
- end
16
- if File.exist?(cells_config_file)
17
- convert_cell_config
18
- delete_cells_config
19
- else
20
- puts "\nNo cells config found. Skipping."
21
- end
22
- update_cell_views
23
- update_render_cell_calls
24
- move_cell_views
25
- generate_editor_partials
26
- puts 'Done ✔'
27
- end
28
- end
29
-
30
- private
31
-
32
- def backup_config
33
- print "-- Copy existing config file to `config/alchemy/page_layouts.yml.old` ... "
34
-
35
- FileUtils.copy Rails.root.join('config', 'alchemy', 'page_layouts.yml'),
36
- Rails.root.join('config', 'alchemy', 'page_layouts.yml.old')
37
-
38
- puts "done ✔\n"
39
- end
40
-
41
- def write_config(config)
42
- print '-- Writing new `config/alchemy/page_layouts.yml` ... '
43
-
44
- File.open(Rails.root.join('config', 'alchemy', 'page_layouts.yml'), "w") do |f|
45
- f.write config.to_yaml.sub("---\n", "").gsub("\n-", "\n\n-")
46
- end
47
-
48
- puts "done ✔\n"
49
- end
50
-
51
- def convert_page_layouts_config
52
- print '-- Moving `cells` from page layouts definition into autogenerated `elements` ... '
53
- page_layouts = YAML.load_file(page_layouts_config_file)
54
- page_layouts.select { |p| p['cells'].present? }.map do |page_layout|
55
- elements = page_layout['elements'] || []
56
- autogenerate_elements = page_layout['autogenerate'] || []
57
- cell_elements = page_layout.delete('cells')
58
- page_layout['elements'] = (elements + cell_elements).uniq
59
- page_layout['autogenerate'] = (autogenerate_elements + cell_elements).uniq
60
- end
61
- puts "done ✔\n"
62
- write_config(page_layouts)
63
- end
64
-
65
- def page_layouts_config_file
66
- Rails.root.join('config', 'alchemy', 'page_layouts.yml')
67
- end
68
-
69
- def cells_config_file
70
- Rails.root.join('config', 'alchemy', 'cells.yml')
71
- end
72
-
73
- def convert_cell_config
74
- puts '-- Converting cells into unique fixed nestable elements.'
75
-
76
- YAML.load_file(cells_config_file).each do |cell|
77
- append_to_file Rails.root.join('config', 'alchemy', 'elements.yml') do
78
- <<-CELL.strip_heredoc
79
-
80
- - name: #{cell['name']}
81
- fixed: true
82
- unique: true
83
- nestable_elements: [#{cell['elements'].join(', ')}]
84
- CELL
85
- end
86
- end
87
- end
88
-
89
- def delete_cells_config
90
- puts '-- Deleting cells config file.'
91
- FileUtils.rm(cells_config_file)
92
- end
93
-
94
- def move_cell_views
95
- if Dir.exist? cells_view_folder
96
- puts "-- Move cell views into elements view folder"
97
- Dir.glob("#{cells_view_folder}/*").each do |view|
98
- filename = File.basename(view).gsub(/(_\w+)\.(\w*\.)?(erb|haml|slim)/, '\1_view.\2\3')
99
- FileUtils.mv(view, "#{elements_view_folder}/#{filename}")
100
- puts " Moved #{File.basename(view)} into `app/views/alchemy/elements/` folder"
101
- end
102
- FileUtils.rm_rf(cells_view_folder)
103
- else
104
- puts "No cell views found. Skip"
105
- end
106
- end
107
-
108
- def generate_editor_partials
109
- puts "-- Generate editor partials"
110
- Rails::Generators.invoke('alchemy:elements', ['--skip'])
111
- end
112
-
113
- def update_cell_views
114
- if Dir.exist? cells_view_folder
115
- puts "-- Update cell views"
116
- Dir.glob("#{cells_view_folder}/*").each do |view|
117
- gsub_file(view, /elements\.published/, 'elements')
118
- gsub_file(view, /cell\.elements(.+)/, 'element.nested_elements\1')
119
- gsub_file(view, /render_elements[\(\s]?:?from_cell:?\s?(=>)?\s?cell\)?/, 'render element.nested_elements')
120
- gsub_file(view, /cell/, 'element')
121
- end
122
- else
123
- puts "No cell views found. Skip"
124
- end
125
- end
126
-
127
- def update_render_cell_calls
128
- puts "-- Update render_cell calls"
129
- Dir.glob("#{alchemy_views_folder}/**/*").each do |view|
130
- next if File.directory?(view)
131
- gsub_file(view, /render_cell[\(\s]?([:'"]?[a-z_]+['"]?)\)?/, 'render_elements(only: \1, fixed: true)')
132
- gsub_file(view, /render_elements[\(\s](.*):?from_cell:?\s?(=>)?\s?(['"][a-z_]+['"])\)?/, 'render_elements(\1only: \3, fixed: true)')
133
- end
134
- end
135
-
136
- def elements_view_folder
137
- Rails.root.join('app', 'views', 'alchemy', 'elements')
138
- end
139
-
140
- def cells_view_folder
141
- Rails.root.join('app', 'views', 'alchemy', 'cells')
142
- end
143
-
144
- def alchemy_views_folder
145
- Rails.root.join('app', 'views', 'alchemy')
146
- end
147
- end
148
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'alchemy/upgrader'
4
-
5
- module Alchemy::Upgrader::Tasks
6
- class ElementPartialNameVariableUpdater < Thor
7
- include Thor::Actions
8
-
9
- no_tasks do
10
- def update_element_views
11
- puts "-- Update element views local variable to partial name"
12
- Dir.glob("#{elements_view_folder}/*_view.*").each do |view|
13
- variable_name = File.basename(view).gsub(/^_([\w-]*)\..*$/, '\1')
14
- gsub_file(view, /cache\(?element([,\s\w:\-,=>'"\?\/]*)\)?/, "cache(#{variable_name}\\1)")
15
- gsub_file(view, /render_essence_view_by_name\(?element([,\s\w:\-,=>'"\?\/]*)\)?/, "render_essence_view_by_name(#{variable_name}\\1)")
16
- gsub_file(view, /element_view_for\(?element([,\s\w:\-,=>'"\?\/]*)\)?/, "element_view_for(#{variable_name}\\1)")
17
- gsub_file(view, /element\.([\w\?]+)/, "#{variable_name}.\\1")
18
- end
19
- end
20
- end
21
-
22
- private
23
-
24
- def elements_view_folder
25
- Rails.root.join('app', 'views', 'alchemy', 'elements')
26
- end
27
- end
28
- end
@@ -1,27 +0,0 @@
1
- require 'thor'
2
-
3
- module Alchemy::Upgrader::Tasks
4
- class HardenActsAsTaggableOnMigrations < Thor
5
- include Thor::Actions
6
-
7
- no_tasks do
8
- def patch_migrations
9
- sentinel = /add_column.*/
10
- aato_file = Dir.glob('db/migrate/*_add_taggings_counter_cache_to_tags.*.rb').first
11
- if aato_file
12
- inject_into_file aato_file,
13
- "\n\n # inserted by Alchemy CMS upgrader\n return unless defined?(ActsAsTaggableOn)",
14
- { after: sentinel, verbose: true }
15
- end
16
-
17
- sentinel = /def up/
18
- aato_file = Dir.glob('db/migrate/*_change_collation_for_tag_names.*.rb').first
19
- if aato_file
20
- inject_into_file aato_file,
21
- "\n # inserted by Alchemy CMS upgrader\n return unless defined?(ActsAsTaggableOn)\n",
22
- { after: sentinel, verbose: true }
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,65 +0,0 @@
1
- module Alchemy
2
- class Upgrader::Tasks::PictureGalleryMigration
3
- def migrate_picture_galleries
4
- if picture_gallery_elements.present?
5
- picture_gallery_elements.each do |el|
6
- migrate_element(el)
7
- end
8
- else
9
- puts "No `picture_gallery` elements found. Skip"
10
- end
11
- end
12
-
13
- private
14
-
15
- def picture_gallery_elements
16
- Element.distinct.joins(:contents).where("#{Content.table_name}.name LIKE 'essence_picture_%'")
17
- end
18
-
19
- def migrate_element(element)
20
- gallery_contents = element.contents.where("#{Content.table_name}.name LIKE 'essence_picture_%'").order("#{Content.table_name}.position ASC")
21
-
22
- if gallery_contents.any?
23
- if element.nestable_elements.any? { |el| el != "#{element.name}_picture" }
24
- parent = create_gallery_element(element)
25
- else
26
- parent = element
27
- end
28
- gallery_contents.each do |content|
29
- create_element_for_content(content, parent)
30
- end
31
- else
32
- puts "No gallery contents found for #{element.dom_id}. Skip"
33
- end
34
- end
35
-
36
- def create_gallery_element(parent)
37
- new_element = parent.nested_elements.create!(
38
- name: "#{parent.name}_picture_gallery",
39
- public: parent.public,
40
- folded: parent.folded,
41
- creator: parent.creator,
42
- updater: parent.updater,
43
- page: parent.page,
44
- autogenerate_contents: false
45
- )
46
- puts "Created new `#{new_element.name}` for `#{parent.name}`"
47
- new_element
48
- end
49
-
50
- def create_element_for_content(content, parent)
51
- new_element = parent.nested_elements.create!(
52
- name: "#{parent.name}_picture",
53
- public: parent.public,
54
- folded: parent.folded,
55
- creator: parent.creator,
56
- updater: parent.updater,
57
- page: parent.page,
58
- autogenerate_contents: false
59
- )
60
-
61
- content.update_columns(element_id: new_element.id, name: 'picture')
62
- puts "Created new `#{new_element.name}` for `#{parent.name}`"
63
- end
64
- end
65
- end
@@ -1,210 +0,0 @@
1
- require 'thor'
2
- require 'alchemy/upgrader'
3
-
4
- module Alchemy::Upgrader::Tasks
5
- class PictureGalleryUpgrader < Thor
6
- include Thor::Actions
7
-
8
- GALLERY_PICTURES_ERB_REGEXP = /<%.*element.contents.gallery_pictures.*/
9
- GALLERY_PICTURES_HAML_REGEXP = /-.*element.contents.gallery_pictures.*/
10
- GALLERY_PICTURES_EDITOR_REGEXP = /.*render_picture_gallery_editor.*/
11
-
12
- no_tasks do
13
- def convert_picture_galleries
14
- config = read_config
15
- unless config
16
- puts "\nNo elements config found. Skipping."
17
- return
18
- end
19
-
20
- elements_with_picture_gallery, all_other_elements = config.partition do |e|
21
- e['picture_gallery']
22
- end
23
-
24
- if elements_with_picture_gallery.empty?
25
- puts "No elements with `picture_gallery` found. Skipping."
26
- return
27
- end
28
-
29
- convert_to_nestable_elements(elements_with_picture_gallery, all_other_elements)
30
- backup_config
31
- write_config(all_other_elements)
32
- find_gallery_pictures_rendering
33
- remove_gallery_pictures_editor
34
-
35
- puts "Generate new element partials for nestable elements"
36
- system "rails g alchemy:elements --skip"
37
- end
38
- end
39
-
40
- private
41
-
42
- def read_config
43
- print "1. Reading `config/alchemy/elements.yml` ... "
44
-
45
- old_config_file = Rails.root.join('config', 'alchemy', 'elements.yml')
46
- config = YAML.load_file(old_config_file)
47
-
48
- if config
49
- puts "done.\n"
50
- end
51
-
52
- config
53
- end
54
-
55
- def convert_to_nestable_elements(elements_with_picture_gallery, all_other_elements)
56
- print '2. Converting picture gallery elements into `nestable_elements` ... '
57
-
58
- elements_with_picture_gallery.inject(all_other_elements) do |elements, old_element|
59
- if old_element.fetch('nestable_elements', []).any?
60
- elements << modify_old_element(old_element.dup, gallery_element: true)
61
- elements << add_picture_gallery_for(old_element["name"])
62
- elements << build_new_picture_element_for(old_element["name"], 'picture_gallery')
63
- else
64
- elements << modify_old_element(old_element.dup, gallery_element: false)
65
- elements << build_new_picture_element_for(old_element["name"])
66
- end
67
- end
68
-
69
- puts 'done.'
70
- end
71
-
72
- def backup_config
73
- print "3. Copy existing config file to `config/alchemy/elements.yml.old` ... "
74
-
75
- FileUtils.copy Rails.root.join('config', 'alchemy', 'elements.yml'),
76
- Rails.root.join('config', 'alchemy', 'elements.yml.old')
77
-
78
- puts "done.\n"
79
- end
80
-
81
- def write_config(config)
82
- print '4. Writing new `config/alchemy/elements.yml` ... '
83
-
84
- File.open(Rails.root.join('config', 'alchemy', 'elements.yml'), "w") do |f|
85
- f.write config.to_yaml.sub("---\n", "").gsub("\n-", "\n\n-")
86
- end
87
-
88
- puts "done.\n"
89
- end
90
-
91
- def find_gallery_pictures_rendering
92
- puts '5. Find element views that use gallery pictures:'
93
-
94
- erb_snippet = ' <%= render element.nested_elements %>'
95
- erb_views = erb_element_partials(:view).select do |view|
96
- next if File.read(view).match(GALLERY_PICTURES_ERB_REGEXP).nil?
97
-
98
- inject_into_file view,
99
- "<%# TODO: Move the content of next block into its nestable element view and `render element.nested_elements` instead %>\n",
100
- before: GALLERY_PICTURES_ERB_REGEXP
101
- true
102
- end
103
-
104
- haml_slim_snippet = ' = element.nested_elements'
105
- haml_views = haml_slim_element_partials(:view).select do |view|
106
- next if File.read(view).match(GALLERY_PICTURES_HAML_REGEXP).nil?
107
-
108
- inject_into_file view,
109
- "-# TODO: Move the content of next block into its nestable element view and `render element.nested_elements` instead\n",
110
- before: GALLERY_PICTURES_HAML_REGEXP
111
- true
112
- end
113
-
114
- if erb_views.any? || haml_views.any?
115
- puts ""
116
- puts "⚠️ Found element views that render gallery pictures!\n"
117
- puts ""
118
- if erb_views.any?
119
- puts " Please replace `element.contents.gallery_pictures` with:"
120
- puts ""
121
- puts erb_snippet
122
- puts ""
123
- puts " In these files:"
124
- puts ""
125
- erb_views.each_with_index do |view, index|
126
- puts " #{index + 1}. #{view}"
127
- end
128
- puts ""
129
- end
130
- if haml_views.any?
131
- puts " Please replace `element.contents.gallery_pictures` with:"
132
- puts ""
133
- puts haml_slim_snippet
134
- puts ""
135
- puts " In these files:"
136
- puts ""
137
- haml_views.each_with_index do |view, index|
138
- puts " #{index + 1}. #{view}"
139
- end
140
- puts ""
141
- end
142
- else
143
- puts "- No element views found that render gallery pictures.\n"
144
- end
145
- end
146
-
147
- def remove_gallery_pictures_editor
148
- puts '6. Remove gallery pictures editor from your element editors:'
149
-
150
- (erb_element_partials(:editor) + haml_slim_element_partials(:editor)).each do |editor|
151
- next if File.read(editor).match(GALLERY_PICTURES_EDITOR_REGEXP).nil?
152
- gsub_file editor, GALLERY_PICTURES_EDITOR_REGEXP, ''
153
- end
154
- end
155
-
156
- def modify_old_element(element, gallery_element:)
157
- if gallery_element
158
- nestable_element = "#{element['name']}_picture_gallery"
159
- else
160
- nestable_element = "#{element['name']}_picture"
161
- end
162
- element.delete('picture_gallery')
163
- element['nestable_elements'] ||= []
164
- element['nestable_elements'] << nestable_element
165
- element
166
- end
167
-
168
- def add_picture_gallery_for(element_name)
169
- {
170
- "name" => "#{element_name}_picture_gallery",
171
- "nestable_elements" => ["#{element_name}_picture_gallery_picture"]
172
- }
173
- end
174
-
175
- def build_new_picture_element_for(element_name, gallery_element_name = nil)
176
- image_options = parse_image_options_from_editor_view(element_name)
177
- settings = {}
178
- if image_options[0]
179
- settings["crop"] = image_options[0] == 'true'
180
- end
181
- settings["size"] = image_options[1] if image_options[1]
182
- element = {
183
- 'name' => [element_name, gallery_element_name, 'picture'].compact.join('_'),
184
- 'compact' => true,
185
- 'contents' => [{
186
- 'name' => 'picture',
187
- 'type' => 'EssencePicture'
188
- }]
189
- }
190
- element['contents'][0]['settings'] = settings if settings.present?
191
- element
192
- end
193
-
194
- def parse_image_options_from_editor_view(element_name)
195
- partial_path = Dir.glob(Rails.root.join('app', 'views', 'alchemy', 'elements', "_#{element_name}_editor.html.*")).first
196
- partial = File.read(partial_path)
197
- crop_option = partial.match(/.*render_picture_gallery_editor.*crop(\:|\s?=>)\s?(true|false).*/).try(:[], 2)
198
- size_option = partial.match(/.*render_picture_gallery_editor.*size(\:|\s?=>)\s?["'](\d*x\d*)["'].*/).try(:[], 2)
199
- [crop_option, size_option]
200
- end
201
-
202
- def erb_element_partials(kind)
203
- Dir.glob(Rails.root.join('app', 'views', 'alchemy', 'elements', "*_#{kind}.html.erb"))
204
- end
205
-
206
- def haml_slim_element_partials(kind)
207
- Dir.glob(Rails.root.join('app', 'views', 'alchemy', 'elements', "*_#{kind}.html.{haml,slim}"))
208
- end
209
- end
210
- end