alchemy_cms 4.6.7 → 5.0.0.beta1

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 (384) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +33 -1
  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 +31 -10
  8. data/CHANGELOG.md +89 -32
  9. data/Gemfile +24 -22
  10. data/README.md +31 -19
  11. data/Rakefile +10 -8
  12. data/alchemy_cms.gemspec +6 -5
  13. data/app/assets/javascripts/alchemy/admin.js +1 -5
  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.page_sorter.js +17 -17
  17. data/app/assets/javascripts/alchemy/node_select.js +39 -0
  18. data/app/assets/javascripts/alchemy/templates/index.js +1 -0
  19. data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
  20. data/app/assets/stylesheets/alchemy/admin.scss +3 -2
  21. data/app/assets/stylesheets/alchemy/base.scss +0 -1
  22. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  23. data/app/assets/stylesheets/alchemy/forms.scss +5 -0
  24. data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
  25. data/app/assets/stylesheets/alchemy/nodes.scss +1 -1
  26. data/app/assets/stylesheets/alchemy/sitemap.scss +5 -1
  27. data/app/assets/stylesheets/alchemy/tables.scss +1 -24
  28. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +3 -3
  29. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +7 -7
  30. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
  31. data/app/controllers/alchemy/admin/base_controller.rb +16 -42
  32. data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
  33. data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
  34. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
  35. data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
  36. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
  37. data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
  38. data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
  39. data/app/controllers/alchemy/admin/nodes_controller.rb +5 -4
  40. data/app/controllers/alchemy/admin/pages_controller.rb +50 -62
  41. data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
  42. data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
  43. data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
  44. data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
  45. data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
  46. data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
  47. data/app/controllers/alchemy/api/base_controller.rb +2 -2
  48. data/app/controllers/alchemy/api/contents_controller.rb +4 -4
  49. data/app/controllers/alchemy/api/elements_controller.rb +8 -8
  50. data/app/controllers/alchemy/api/nodes_controller.rb +37 -1
  51. data/app/controllers/alchemy/api/pages_controller.rb +14 -23
  52. data/app/controllers/alchemy/attachments_controller.rb +5 -5
  53. data/app/controllers/alchemy/base_controller.rb +10 -9
  54. data/app/controllers/alchemy/messages_controller.rb +16 -23
  55. data/app/controllers/alchemy/pages_controller.rb +13 -11
  56. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
  57. data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
  58. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
  59. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
  60. data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
  61. data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
  62. data/app/decorators/alchemy/element_editor.rb +39 -0
  63. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
  64. data/app/helpers/alchemy/admin/base_helper.rb +36 -35
  65. data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
  66. data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
  67. data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
  68. data/app/helpers/alchemy/admin/form_helper.rb +1 -1
  69. data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
  70. data/app/helpers/alchemy/admin/pages_helper.rb +4 -4
  71. data/app/helpers/alchemy/admin/pictures_helper.rb +3 -3
  72. data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
  73. data/app/helpers/alchemy/base_helper.rb +13 -8
  74. data/app/helpers/alchemy/elements_block_helper.rb +2 -31
  75. data/app/helpers/alchemy/elements_helper.rb +12 -58
  76. data/app/helpers/alchemy/pages_helper.rb +24 -174
  77. data/app/helpers/alchemy/url_helper.rb +2 -1
  78. data/app/mailers/alchemy/base_mailer.rb +1 -1
  79. data/app/mailers/alchemy/messages_mailer.rb +1 -1
  80. data/app/models/alchemy/attachment.rb +21 -19
  81. data/app/models/alchemy/base_record.rb +2 -5
  82. data/app/models/alchemy/content/factory.rb +24 -31
  83. data/app/models/alchemy/content.rb +33 -38
  84. data/app/models/alchemy/element/definitions.rb +4 -4
  85. data/app/models/alchemy/element/element_contents.rb +9 -6
  86. data/app/models/alchemy/element/element_essences.rb +4 -3
  87. data/app/models/alchemy/element/presenters.rb +3 -2
  88. data/app/models/alchemy/element.rb +46 -54
  89. data/app/models/alchemy/element_to_page.rb +1 -1
  90. data/app/models/alchemy/essence_boolean.rb +1 -3
  91. data/app/models/alchemy/essence_date.rb +2 -3
  92. data/app/models/alchemy/essence_file.rb +4 -4
  93. data/app/models/alchemy/essence_html.rb +1 -3
  94. data/app/models/alchemy/essence_link.rb +1 -3
  95. data/app/models/alchemy/essence_node.rb +18 -0
  96. data/app/models/alchemy/essence_page.rb +3 -16
  97. data/app/models/alchemy/essence_picture.rb +17 -16
  98. data/app/models/alchemy/essence_picture_view.rb +7 -6
  99. data/app/models/alchemy/essence_richtext.rb +1 -3
  100. data/app/models/alchemy/essence_select.rb +1 -3
  101. data/app/models/alchemy/essence_text.rb +0 -2
  102. data/app/models/alchemy/folded_page.rb +1 -0
  103. data/app/models/alchemy/language/code.rb +4 -4
  104. data/app/models/alchemy/language.rb +21 -35
  105. data/app/models/alchemy/legacy_page_url.rb +1 -1
  106. data/app/models/alchemy/message.rb +3 -3
  107. data/app/models/alchemy/node.rb +28 -5
  108. data/app/models/alchemy/page/fixed_attributes.rb +3 -2
  109. data/app/models/alchemy/page/page_elements.rb +35 -44
  110. data/app/models/alchemy/page/page_naming.rb +20 -70
  111. data/app/models/alchemy/page/page_natures.rb +7 -34
  112. data/app/models/alchemy/page/page_scopes.rb +23 -29
  113. data/app/models/alchemy/page/url_path.rb +0 -2
  114. data/app/models/alchemy/page.rb +47 -128
  115. data/app/models/alchemy/picture/transformations.rb +9 -7
  116. data/app/models/alchemy/picture/url.rb +5 -5
  117. data/app/models/alchemy/picture.rb +19 -28
  118. data/app/models/alchemy/site/layout.rb +2 -2
  119. data/app/models/alchemy/site.rb +6 -36
  120. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  121. data/app/serializers/alchemy/content_serializer.rb +0 -3
  122. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  123. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  124. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  125. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  126. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  127. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  128. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  129. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  130. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  131. data/app/serializers/alchemy/node_serializer.rb +2 -0
  132. data/app/serializers/alchemy/page_tree_serializer.rb +9 -13
  133. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  134. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  135. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  136. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  137. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  138. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  139. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  140. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  141. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  142. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  143. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  144. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  145. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  146. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  147. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  148. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  149. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  150. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  151. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  152. data/app/views/alchemy/admin/layoutpages/index.html.erb +3 -3
  153. data/app/views/alchemy/admin/nodes/_form.html.erb +18 -15
  154. data/app/views/alchemy/admin/nodes/_node.html.erb +1 -5
  155. data/app/views/alchemy/admin/nodes/index.html.erb +3 -4
  156. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  157. data/app/views/alchemy/admin/pages/_form.html.erb +0 -1
  158. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  159. data/app/views/alchemy/admin/pages/_page.html.erb +11 -19
  160. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  161. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  162. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  163. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  164. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  165. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  166. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  167. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  168. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  169. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  170. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  171. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  172. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  173. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  174. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  175. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  176. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  177. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  178. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  179. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  180. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  181. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  182. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  183. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  184. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  185. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  186. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  187. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  188. data/app/views/alchemy/pages/show.rss.builder +3 -2
  189. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  190. data/babel.config.js +12 -0
  191. data/bin/rails +5 -4
  192. data/config/alchemy/config.yml +15 -18
  193. data/config/brakeman.ignore +1 -1
  194. data/config/initializers/assets.rb +2 -1
  195. data/config/initializers/dragonfly.rb +2 -1
  196. data/config/initializers/mime_types.rb +1 -0
  197. data/config/initializers/mini_profiler.rb +3 -2
  198. data/config/initializers/simple_form.rb +6 -6
  199. data/config/locales/alchemy.en.yml +23 -8
  200. data/config/routes.rb +25 -24
  201. data/config/spring.rb +3 -2
  202. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  203. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  204. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  205. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  206. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  207. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  208. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  209. data/lib/alchemy/admin/locale.rb +3 -1
  210. data/lib/alchemy/admin/preview_url.rb +64 -0
  211. data/lib/alchemy/auth_accessors.rb +8 -7
  212. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  213. data/lib/alchemy/config.rb +1 -5
  214. data/lib/alchemy/configuration_methods.rb +3 -1
  215. data/lib/alchemy/controller_actions.rb +6 -5
  216. data/lib/alchemy/deprecation.rb +2 -1
  217. data/lib/alchemy/elements_finder.rb +5 -5
  218. data/lib/alchemy/engine.rb +22 -14
  219. data/lib/alchemy/errors.rb +0 -7
  220. data/lib/alchemy/essence.rb +17 -16
  221. data/lib/alchemy/filetypes.rb +5 -5
  222. data/lib/alchemy/forms/builder.rb +4 -4
  223. data/lib/alchemy/hints.rb +1 -1
  224. data/lib/alchemy/i18n.rb +2 -1
  225. data/lib/alchemy/modules.rb +12 -12
  226. data/lib/alchemy/name_conversions.rb +5 -5
  227. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  228. data/lib/alchemy/page_layout.rb +15 -12
  229. data/lib/alchemy/paths.rb +1 -1
  230. data/lib/alchemy/permissions.rb +7 -6
  231. data/lib/alchemy/resource.rb +25 -17
  232. data/lib/alchemy/resources_helper.rb +12 -18
  233. data/lib/alchemy/routing_constraints.rb +1 -1
  234. data/lib/alchemy/seeder.rb +42 -14
  235. data/lib/alchemy/shell.rb +13 -10
  236. data/lib/alchemy/taggable.rb +1 -0
  237. data/lib/alchemy/tasks/tidy.rb +4 -3
  238. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  239. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  240. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  241. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  242. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  243. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  244. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  245. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  246. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  247. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  248. data/lib/alchemy/test_support/factories/language_factory.rb +16 -14
  249. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  250. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  251. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  252. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  253. data/lib/alchemy/test_support/factories.rb +1 -1
  254. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  255. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  256. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  257. data/lib/alchemy/tinymce.rb +15 -13
  258. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  259. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  260. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  261. data/lib/alchemy/upgrader.rb +8 -7
  262. data/lib/alchemy/userstamp.rb +1 -1
  263. data/lib/alchemy/version.rb +1 -1
  264. data/lib/alchemy_cms.rb +52 -51
  265. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  266. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  267. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  268. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  269. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  270. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  271. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  272. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  273. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  274. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  275. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  276. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  277. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  278. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  279. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  280. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  281. data/lib/generators/alchemy/install/install_generator.rb +110 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  283. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/templates/menus.yml.tt +0 -0
  285. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  286. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +2 -2
  287. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  288. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  289. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  290. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  291. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +1 -1
  292. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +1 -1
  293. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  294. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  295. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  296. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  297. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  298. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  299. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  300. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  301. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  302. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  303. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  305. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  306. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  307. data/lib/tasks/alchemy/db.rake +3 -19
  308. data/lib/tasks/alchemy/install.rake +3 -2
  309. data/lib/tasks/alchemy/tidy.rake +9 -8
  310. data/lib/tasks/alchemy/upgrade.rake +18 -120
  311. data/package/admin.js +14 -0
  312. data/package/src/__tests__/i18n.spec.js +70 -0
  313. data/package/src/i18n.js +48 -0
  314. data/package/src/node_tree.js +72 -0
  315. data/package/src/translations.js +32 -0
  316. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  317. data/package/src/utils/__tests__/events.spec.js +38 -0
  318. data/package/src/utils/ajax.js +48 -0
  319. data/package/src/utils/events.js +16 -0
  320. data/package.json +45 -0
  321. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  322. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  323. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  324. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  325. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  326. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  327. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  328. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  329. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  330. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  331. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  332. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  333. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  334. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  335. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  336. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  337. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  338. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  339. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  340. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  341. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  342. metadata +117 -98
  343. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  344. data/app/assets/javascripts/alchemy/alchemy.node_tree.js +0 -66
  345. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  346. data/app/assets/javascripts/alchemy/alchemy.utils.js +0 -45
  347. data/app/helpers/alchemy/essences_helper.rb +0 -119
  348. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  349. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  350. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  351. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -37
  352. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  353. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  354. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  355. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  356. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  357. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  358. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  359. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  360. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  361. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  362. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  363. data/lib/alchemy/error_tracking/airbrake_handler.rb +0 -13
  364. data/lib/alchemy/error_tracking.rb +0 -14
  365. data/lib/alchemy/ssl_protection.rb +0 -34
  366. data/lib/alchemy/tasks/helpers.rb +0 -81
  367. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  368. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  369. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  370. data/lib/alchemy/upgrader/four_point_six.rb +0 -50
  371. data/lib/alchemy/upgrader/four_point_two.rb +0 -86
  372. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -45
  373. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -166
  374. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -32
  375. data/lib/alchemy/upgrader/tasks/fixed_element_name_finder.rb +0 -31
  376. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  377. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  378. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  379. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  380. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  381. data/lib/tasks/alchemy/convert.rake +0 -98
  382. data/vendor/assets/javascripts/sortable/Sortable.min.js +0 -2
  383. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  384. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
@@ -179,8 +179,6 @@ Alchemy.ElementEditors =
179
179
  if data.message == 'Alchemy.focusElementEditor'
180
180
  $element = $("#element_#{data.element_id}")
181
181
  Alchemy.ElementEditors.focusElement($element)
182
- else
183
- console.warn 'Unknown message received!', data
184
182
 
185
183
  onClickBody: (e) ->
186
184
  element = $(e.target).parents('.element-editor')[0]
@@ -1,24 +1,24 @@
1
- Alchemy.PageSorter = function() {
2
- var $sortables = $('ul#sitemap').find('ul.level_1_children');
1
+ Alchemy.PageSorter = function () {
2
+ var $sortables = $("ul#sitemap").find("ul.level_0_children")
3
3
 
4
4
  $sortables.nestedSortable({
5
- disableNesting: 'no-nest',
5
+ disableNesting: "no-nest",
6
6
  forcePlaceholderSize: true,
7
- handle: '.handle',
8
- items: 'li',
9
- listType: 'ul',
7
+ handle: ".handle",
8
+ items: "li",
9
+ listType: "ul",
10
10
  opacity: 0.5,
11
- placeholder: 'placeholder',
11
+ placeholder: "placeholder",
12
12
  tabSize: 16,
13
- tolerance: 'pointer',
14
- toleranceElement: '> div'
15
- });
13
+ tolerance: "pointer",
14
+ toleranceElement: "> div"
15
+ })
16
16
 
17
- $('#save_page_order').click(function(e) {
18
- e.preventDefault();
19
- Alchemy.Buttons.disable(this);
17
+ $("#save_page_order").click(function (e) {
18
+ e.preventDefault()
19
+ Alchemy.Buttons.disable(this)
20
20
  $.post(Alchemy.routes.order_admin_pages_path, {
21
- set: JSON.stringify($sortables.nestedSortable('toHierarchy'))
22
- });
23
- });
24
- };
21
+ set: JSON.stringify($sortables.nestedSortable("toHierarchy"))
22
+ })
23
+ })
24
+ }
@@ -0,0 +1,39 @@
1
+ $.fn.alchemyNodeSelect = function (options) {
2
+ var renderNodeTemplate = function (node) {
3
+ return HandlebarsTemplates.node({ node: node })
4
+ }
5
+ var queryParamsFromTerm = function (term) {
6
+ return {
7
+ filter: Object.assign(
8
+ { name_or_page_name_cont: term },
9
+ options.query_params
10
+ )
11
+ }
12
+ }
13
+ var resultsFromResponse = function (response) {
14
+ var meta = response.meta
15
+ var data = response.data
16
+ var more = meta.page * meta.per_page < meta.total_count
17
+ return { results: data, more: more }
18
+ }
19
+
20
+ return this.select2({
21
+ placeholder: options.placeholder,
22
+ allowClear: true,
23
+ minimumInputLength: 3,
24
+ initSelection: function (_$el, callback) {
25
+ if (options.initialSelection) {
26
+ callback(options.initialSelection)
27
+ }
28
+ },
29
+ ajax: {
30
+ url: options.url,
31
+ datatype: "json",
32
+ quietMillis: 300,
33
+ data: queryParamsFromTerm,
34
+ results: resultsFromResponse
35
+ },
36
+ formatSelection: renderNodeTemplate,
37
+ formatResult: renderNodeTemplate
38
+ })
39
+ }
@@ -1,3 +1,4 @@
1
1
  //= require alchemy/templates/spinner
2
2
  //= require alchemy/templates/page
3
3
  //= require alchemy/templates/node_folder
4
+ //= require alchemy/templates/node
@@ -0,0 +1,16 @@
1
+ <div class="node-select--node">
2
+ <i class="icon fas fa-list fa-lg"></i>
3
+ <div class="node-select--node-display_name">
4
+ <span class="node-select--node-ancestors">
5
+ {{#each node.ancestors}}
6
+ {{ this.name }} /&nbsp;
7
+ {{/each}}
8
+ </span>
9
+ <span class="node-select--node-name">
10
+ {{ node.name }}
11
+ </span>
12
+ </div>
13
+ <div class="node-select--node-url">
14
+ {{ node.url }}
15
+ </div>
16
+ </div>
@@ -5,8 +5,8 @@
5
5
  */
6
6
 
7
7
  @import "fontawesome/fontawesome";
8
- @import "fontawesome/fa-regular";
9
- @import "fontawesome/fa-solid";
8
+ @import "fontawesome/regular";
9
+ @import "fontawesome/solid";
10
10
  @import "alchemy/defaults";
11
11
  @import "alchemy/archive";
12
12
  @import "alchemy/navigation";
@@ -31,6 +31,7 @@
31
31
  @import "alchemy/image_library";
32
32
  @import "alchemy/labels";
33
33
  @import "alchemy/nodes";
34
+ @import "alchemy/node-select";
34
35
  @import "alchemy/notices";
35
36
  @import "alchemy/page-select";
36
37
  @import "alchemy/pagination";
@@ -83,7 +83,6 @@ hr {
83
83
  max-width: 500px;
84
84
  margin: 2em auto;
85
85
  padding: 4*$default-padding;
86
- border: $default-border;
87
86
  background: $medium-gray;
88
87
  border-radius: $default-border-radius;
89
88
  }
@@ -718,7 +718,7 @@ textarea.has_tinymce {
718
718
  visibility: hidden;
719
719
  }
720
720
 
721
- .essence_html_editor textarea {
721
+ .essence_html textarea {
722
722
  font-family: $mono-font-family;
723
723
  resize: vertical;
724
724
  font-size: $form-field-font-size;
@@ -173,6 +173,11 @@ form {
173
173
  .input .hint {
174
174
  @include form-hint;
175
175
  margin-left: $form-left-width;
176
+
177
+ a[href] {
178
+ color: $very-dark-gray;
179
+ text-decoration: underline;
180
+ }
176
181
  }
177
182
 
178
183
  .submit {
@@ -0,0 +1,43 @@
1
+ .node-select--node,
2
+ .node-select--node-url {
3
+ text-overflow: ellipsis;
4
+ overflow: hidden;
5
+ white-space: nowrap;
6
+ }
7
+
8
+ .node-select--node {
9
+ display: flex;
10
+ align-items: center;
11
+
12
+ .icon {
13
+ margin: 0 8px 0 4px;
14
+
15
+ .select2-highlighted & {
16
+ color: $white
17
+ }
18
+ }
19
+ }
20
+
21
+ .node-select--node-name {
22
+ font-weight: bold;
23
+ }
24
+
25
+ .node-select--node-url {
26
+ margin-left: auto;
27
+ padding: $default-padding 2*$default-padding;
28
+ color: $dark-gray;
29
+ font-size: $small-font-size;
30
+
31
+ .select2-highlighted & {
32
+ color: $white
33
+ }
34
+ }
35
+
36
+ // The container of the rendered node is slightly larger than other a line of
37
+ // text, as it would be for the Alchemy::EssencePage. Reducing the padding here from 0.6em
38
+ // to 0.4em centers the content nicely.
39
+ .essence_node {
40
+ .select2-container.alchemy_selectbox .select2-choice {
41
+ padding: 0.4em 0.75em;
42
+ }
43
+ }
@@ -64,7 +64,7 @@
64
64
  margin: 0;
65
65
  padding: 0;
66
66
 
67
- .folded > li {
67
+ &.folded > li {
68
68
  display: none;
69
69
  }
70
70
  }
@@ -197,6 +197,10 @@ $sitemap-url-xlarge-width: 350px;
197
197
 
198
198
  .page_status {
199
199
  display: inline-block;
200
+
201
+ .alchemy-dialog & {
202
+ display: block;
203
+ }
200
204
  }
201
205
 
202
206
  #sitemap_heading {
@@ -226,7 +230,7 @@ $sitemap-url-xlarge-width: 350px;
226
230
 
227
231
  .page_status {
228
232
  padding-left: 2 * $default-padding;
229
- margin-right: 214px;
233
+ margin-right: 188px;
230
234
  margin-left: auto;
231
235
 
232
236
  @media screen and (min-width: $large-screen-break-point) {
@@ -57,29 +57,6 @@ th {
57
57
  vertical-align: top;
58
58
  border-bottom: 1px solid $medium-gray;
59
59
  font-weight: bold;
60
-
61
- i {
62
- font-style: normal;
63
- position: absolute;
64
- right: 2px;
65
- top: 4px;
66
- text-shadow: 1px 1px 1px #fff;
67
- }
68
-
69
- a {
70
-
71
- &.sortable {
72
- display: block;
73
- margin: -4px -8px;
74
- padding: 4px 18px 4px 8px;
75
- text-shadow: 1px 1px 1px #fff;
76
- }
77
-
78
- &.sorted {
79
- position: relative;
80
- background: $medium-gray;
81
- }
82
- }
83
60
  }
84
61
 
85
62
  tr.even td {
@@ -141,7 +118,7 @@ td {
141
118
  width: 80px;
142
119
  }
143
120
 
144
- &.date {
121
+ &.date, &.datetime {
145
122
  width: 150px;
146
123
  }
147
124
 
@@ -30,7 +30,7 @@ td,th {
30
30
 
31
31
  .mce-object {
32
32
  border: 1px dotted #3a3a3a;
33
- background: #d5d5d5 url('tinymce/skins/alchemy/fonts/img/object.gif') no-repeat center;
33
+ background: #d5d5d5 url(img/object.gif) no-repeat center;
34
34
  }
35
35
 
36
36
  .mce-pagebreak {
@@ -55,7 +55,7 @@ td,th {
55
55
  width: 9px!important;
56
56
  height: 9px!important;
57
57
  border: 1px dotted #3a3a3a;
58
- background: #d5d5d5 url('tinymce/skins/alchemy/fonts/img/anchor.gif') no-repeat center;
58
+ background: #d5d5d5 url(img/anchor.gif) no-repeat center;
59
59
  }
60
60
 
61
61
  .mce-nbsp {
@@ -77,7 +77,7 @@ hr {
77
77
  }
78
78
 
79
79
  .mce-spellchecker-word {
80
- background: url('tinymce/skins/alchemy/fonts/img/wline.gif') repeat-x bottom left;
80
+ background: url(img/wline.gif) repeat-x bottom left;
81
81
  cursor: default;
82
82
  }
83
83
 
@@ -1561,23 +1561,23 @@ i.mce-i-resize {
1561
1561
  opacity: 0.6;
1562
1562
  filter: alpha(opacity=60);
1563
1563
  zoom: 1;
1564
- background: #fff url('tinymce/skins/alchemy/fonts/img/loader.gif') no-repeat center center;
1564
+ background: #fff url('img/loader.gif') no-repeat center center;
1565
1565
  }
1566
1566
 
1567
1567
  @font-face {
1568
1568
  font-family: 'tinymce';
1569
- src: url('tinymce/skins/alchemy/fonts/tinymce.woff') format('woff'),
1570
- url('tinymce/skins/alchemy/fonts/tinymce.ttf') format('truetype'),
1571
- url('tinymce/skins/alchemy/fonts/tinymce.svg#tinymce') format('svg');
1569
+ src: url('fonts/tinymce.woff') format('woff'),
1570
+ url('fonts/tinymce.ttf') format('truetype'),
1571
+ url('fonts/tinymce.svg#tinymce') format('svg');
1572
1572
  font-weight: normal;
1573
1573
  font-style: normal;
1574
1574
  }
1575
1575
 
1576
1576
  @font-face {
1577
1577
  font-family: 'tinymce-small';
1578
- src: url('tinymce/skins/alchemy/fonts/tinymce-small.woff') format('woff'),
1579
- url('tinymce/skins/alchemy/fonts/tinymce-small.ttf') format('truetype'),
1580
- url('tinymce/skins/alchemy/fonts/tinymce-small.svg#tinymce') format('svg');
1578
+ src: url('fonts/tinymce-small.woff') format('woff'),
1579
+ url('fonts/tinymce-small.ttf') format('truetype'),
1580
+ url('fonts/tinymce-small.svg#tinymce') format('svg');
1581
1581
  font-weight: normal;
1582
1582
  font-style: normal;
1583
1583
  }
@@ -6,10 +6,11 @@ module Alchemy
6
6
  include UploaderResponses
7
7
  include ArchiveOverlay
8
8
 
9
- helper 'alchemy/admin/tags'
9
+ helper "alchemy/admin/tags"
10
10
 
11
11
  def index
12
12
  @query = Attachment.ransack(search_filter_params[:q])
13
+ @query.sorts = "name asc" if @query.sorts.empty?
13
14
  @attachments = @query.result
14
15
 
15
16
  if search_filter_params[:tagged_with].present?
@@ -41,13 +42,13 @@ module Alchemy
41
42
 
42
43
  def update
43
44
  @attachment.update(attachment_attributes)
44
- if attachment_attributes['file'].present?
45
+ if attachment_attributes["file"].present?
45
46
  handle_uploader_response(status: :accepted)
46
47
  else
47
48
  render_errors_or_redirect(
48
49
  @attachment,
49
50
  admin_attachments_path(search_filter_params),
50
- Alchemy.t("File successfully updated")
51
+ Alchemy.t("File successfully updated"),
51
52
  )
52
53
  end
53
54
  end
@@ -56,14 +57,14 @@ module Alchemy
56
57
  name = @attachment.name
57
58
  @attachment.destroy
58
59
  @url = admin_attachments_url(search_filter_params)
59
- flash[:notice] = Alchemy.t('File deleted successfully', name: name)
60
+ flash[:notice] = Alchemy.t("File deleted successfully", name: name)
60
61
  end
61
62
 
62
63
  def download
63
64
  @attachment = Attachment.find(params[:id])
64
65
  send_file @attachment.file.path, {
65
66
  filename: @attachment.file_name,
66
- type: @attachment.file_mime_type
67
+ type: @attachment.file_mime_type,
67
68
  }
68
69
  end
69
70
 
@@ -73,8 +74,8 @@ module Alchemy
73
74
  @_search_filter_params ||= params.except(*COMMON_SEARCH_FILTER_EXCLUDES + [:attachment]).permit(
74
75
  *common_search_filter_includes + [
75
76
  :file_type,
76
- :content_id
77
- ]
77
+ :content_id,
78
+ ],
78
79
  )
79
80
  end
80
81
 
@@ -6,11 +6,9 @@ module Alchemy
6
6
  include Userstamp
7
7
  include Locale
8
8
 
9
- before_action { enforce_ssl if ssl_required? && !request.ssl? }
10
9
  before_action :load_locked_pages
11
10
 
12
- helper_method :clipboard_empty?, :trash_empty?, :get_clipboard, :is_admin?,
13
- :options_from_params
11
+ helper_method :clipboard_empty?, :trash_empty?, :get_clipboard, :is_admin?
14
12
 
15
13
  check_authorization
16
14
 
@@ -28,21 +26,23 @@ module Alchemy
28
26
 
29
27
  def leave
30
28
  authorize! :leave, :alchemy_admin
31
- render template: '/alchemy/admin/leave', layout: !request.xhr?
29
+ render template: "/alchemy/admin/leave", layout: !request.xhr?
32
30
  end
33
31
 
34
32
  private
35
33
 
36
34
  # Disable layout rendering for xhr requests.
37
35
  def set_layout
38
- request.xhr? ? false : 'alchemy/admin'
36
+ request.xhr? ? false : "alchemy/admin"
39
37
  end
40
38
 
41
39
  # Handles exceptions
42
40
  def exception_handler(error)
43
41
  exception_logger(error)
44
42
  show_error_notice(error)
45
- notify_error_tracker(error)
43
+ if defined?(Airbrake)
44
+ notify_airbrake(error) unless Rails.env.development? || Rails.env.test?
45
+ end
46
46
  end
47
47
 
48
48
  # Displays an error notice in the Alchemy backend.
@@ -54,7 +54,7 @@ module Alchemy
54
54
  if request.xhr?
55
55
  render action: "error_notice"
56
56
  else
57
- render '500', status: 500
57
+ render "500", status: 500
58
58
  end
59
59
  end
60
60
 
@@ -88,6 +88,7 @@ module Alchemy
88
88
  # Returns true if the current_alchemy_user (The logged-in Alchemy User) has the admin role.
89
89
  def is_admin?
90
90
  return false if !current_alchemy_user
91
+
91
92
  current_alchemy_user.admin?
92
93
  end
93
94
 
@@ -103,22 +104,15 @@ module Alchemy
103
104
  flash[:notice] = Alchemy.t(flash_notice)
104
105
  do_redirect_to redirect_url
105
106
  else
106
- render action: (params[:action] == 'update' ? 'edit' : 'new')
107
+ render action: (params[:action] == "update" ? "edit" : "new")
107
108
  end
108
109
  end
109
110
 
110
- def per_page_value_for_screen_size
111
- Alchemy::Deprecation.warn("#per_page_value_for_screen_size is deprecated, please use #items_per_page instead")
112
- return items_per_page if session[:screen_size].blank?
113
- screen_height = session[:screen_size].split('x').last.to_i
114
- (screen_height / 50) - 12
115
- end
116
-
117
111
  # Does redirects for html and js requests
118
112
  #
119
113
  def do_redirect_to(url_or_path)
120
114
  respond_to do |format|
121
- format.js {
115
+ format.js {
122
116
  @redirect_url = url_or_path
123
117
  render :redirect
124
118
  }
@@ -126,18 +120,6 @@ module Alchemy
126
120
  end
127
121
  end
128
122
 
129
- # Extracts options from params and permits all keys
130
- #
131
- # If no options are present it returns an empty parameters hash.
132
- #
133
- # @returns [ActionController::Parameters]
134
- def options_from_params
135
- @_options_from_params ||= begin
136
- (params[:options] || ActionController::Parameters.new).permit!
137
- end
138
- end
139
- deprecate :options_from_params, deprecator: Alchemy::Deprecation
140
-
141
123
  # This method decides if we want to raise an exception or not.
142
124
  #
143
125
  # I.e. in test environment.
@@ -148,7 +130,7 @@ module Alchemy
148
130
 
149
131
  # Are we currently in the page edit mode page preview.
150
132
  def is_page_preview?
151
- controller_path == 'alchemy/admin/pages' && action_name == 'show'
133
+ controller_path == "alchemy/admin/pages" && action_name == "show"
152
134
  end
153
135
 
154
136
  def load_locked_pages
@@ -159,19 +141,11 @@ module Alchemy
159
141
  #
160
142
  def current_alchemy_site
161
143
  @current_alchemy_site ||= begin
162
- site_id = params[:site_id] || session[:alchemy_site_id]
163
- site = Site.find_by(id: site_id) || super
164
- session[:alchemy_site_id] = site.id
165
- site
166
- end
167
- end
168
-
169
- def notify_error_tracker(exception)
170
- if ::Alchemy::ErrorTracking.notification_handler.respond_to?(:call)
171
- ::Alchemy::ErrorTracking.notification_handler.call(exception)
172
- else
173
- Rails.logger.warn("To use the Alchemy::ErrorTracking.notification_handler, it must respond to #call.")
174
- end
144
+ site_id = params[:site_id] || session[:alchemy_site_id]
145
+ site = Site.find_by(id: site_id) || super
146
+ session[:alchemy_site_id] = site&.id
147
+ site
148
+ end
175
149
  end
176
150
  end
177
151
  end
@@ -17,10 +17,10 @@ module Alchemy
17
17
 
18
18
  def insert
19
19
  @item = model_class.find(remarkable_params[:remarkable_id])
20
- unless @clipboard.detect { |item| item['id'] == remarkable_params[:remarkable_id] }
20
+ unless @clipboard.detect { |item| item["id"] == remarkable_params[:remarkable_id] }
21
21
  @clipboard << {
22
- 'id' => remarkable_params[:remarkable_id],
23
- 'action' => params[:remove] ? 'cut' : 'copy'
22
+ "id" => remarkable_params[:remarkable_id],
23
+ "action" => params[:remove] ? "cut" : "copy",
24
24
  }
25
25
  end
26
26
  respond_to do |format|
@@ -30,7 +30,7 @@ module Alchemy
30
30
 
31
31
  def remove
32
32
  @item = model_class.find(remarkable_params[:remarkable_id])
33
- @clipboard.delete_if { |item| item['id'] == remarkable_params[:remarkable_id] }
33
+ @clipboard.delete_if { |item| item["id"] == remarkable_params[:remarkable_id] }
34
34
  respond_to do |format|
35
35
  format.js
36
36
  end
@@ -48,6 +48,7 @@ module Alchemy
48
48
 
49
49
  def model_class
50
50
  raise ActionController::BadRequest unless remarkable_type
51
+
51
52
  "alchemy/#{remarkable_type}".classify.constantize
52
53
  end
53
54
 
@@ -3,13 +3,12 @@
3
3
  module Alchemy
4
4
  module Admin
5
5
  class ContentsController < Alchemy::Admin::BaseController
6
- helper 'alchemy/admin/essences'
6
+ helper "alchemy/admin/essences"
7
7
 
8
8
  authorize_resource class: Alchemy::Content
9
9
 
10
10
  def create
11
11
  @content = Content.create(content_params)
12
- @html_options = params[:html_options] || {}
13
12
  end
14
13
 
15
14
  private
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'net/http'
4
- require 'alchemy/version'
3
+ require "net/http"
4
+ require "alchemy/version"
5
5
 
6
6
  module Alchemy
7
7
  module Admin
@@ -28,9 +28,9 @@ module Alchemy
28
28
  def update_check
29
29
  @alchemy_version = Alchemy.version
30
30
  if @alchemy_version < latest_alchemy_version
31
- render plain: 'true'
31
+ render plain: "true"
32
32
  else
33
- render plain: 'false'
33
+ render plain: "false"
34
34
  end
35
35
  rescue UpdateServiceUnavailable => e
36
36
  render plain: e, status: 503
@@ -41,7 +41,8 @@ module Alchemy
41
41
  # Returns latest alchemy version.
42
42
  def latest_alchemy_version
43
43
  versions = get_alchemy_versions
44
- return '' if versions.blank?
44
+ return "" if versions.blank?
45
+
45
46
  # reject any non release version
46
47
  versions.reject! { |v| v =~ /[a-z]/ }
47
48
  versions.max
@@ -53,14 +54,14 @@ module Alchemy
53
54
  response = query_rubygems
54
55
  if response.code == "200"
55
56
  alchemy_versions = JSON.parse(response.body)
56
- alchemy_versions.collect { |h| h['number'] }.sort
57
+ alchemy_versions.collect { |h| h["number"] }.sort
57
58
  else
58
59
  # rubygems.org not available?
59
60
  # then we try github
60
61
  response = query_github
61
62
  if response.code == "200"
62
63
  alchemy_tags = JSON.parse(response.body)
63
- alchemy_tags.collect { |h| h['name'].tr('v', '') }.sort
64
+ alchemy_tags.collect { |h| h["name"].tr("v", "") }.sort
64
65
  else
65
66
  # no luck at all?
66
67
  raise UpdateServiceUnavailable
@@ -70,12 +71,12 @@ module Alchemy
70
71
 
71
72
  # Query the RubyGems API for Alchemy versions.
72
73
  def query_rubygems
73
- make_api_request('https://rubygems.org/api/v1/versions/alchemy_cms.json')
74
+ make_api_request("https://rubygems.org/api/v1/versions/alchemy_cms.json")
74
75
  end
75
76
 
76
77
  # Query the GitHub API for Alchemy tags.
77
78
  def query_github
78
- make_api_request('https://api.github.com/repos/AlchemyCMS/alchemy_cms/tags')
79
+ make_api_request("https://api.github.com/repos/AlchemyCMS/alchemy_cms/tags")
79
80
  end
80
81
 
81
82
  # Make a HTTP API request for given request url.