alchemy_cms 4.4.3 → 5.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (384) 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 +34 -21
  8. data/CHANGELOG.md +120 -0
  9. data/Gemfile +24 -22
  10. data/README.md +31 -19
  11. data/Rakefile +10 -8
  12. data/alchemy_cms.gemspec +6 -4
  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 +3 -3
  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 +18 -27
  121. data/app/models/alchemy/picture/transformations.rb +9 -7
  122. data/app/models/alchemy/picture/url.rb +5 -5
  123. data/app/models/alchemy/site.rb +6 -36
  124. data/app/models/alchemy/site/layout.rb +2 -2
  125. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  126. data/app/serializers/alchemy/content_serializer.rb +0 -3
  127. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  128. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  129. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  130. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  131. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  132. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  133. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  134. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  135. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  136. data/app/serializers/alchemy/node_serializer.rb +14 -0
  137. data/app/serializers/alchemy/page_serializer.rb +2 -1
  138. data/app/serializers/alchemy/page_tree_serializer.rb +11 -14
  139. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  140. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  141. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  142. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  143. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  144. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  145. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  146. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  147. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  148. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  149. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  150. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  151. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  152. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  153. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  154. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  155. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  156. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  157. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  158. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -2
  159. data/app/views/alchemy/admin/nodes/_form.html.erb +23 -15
  160. data/app/views/alchemy/admin/nodes/_node.html.erb +5 -19
  161. data/app/views/alchemy/admin/nodes/index.html.erb +8 -19
  162. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  163. data/app/views/alchemy/admin/pages/_form.html.erb +1 -2
  164. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  165. data/app/views/alchemy/admin/pages/_page.html.erb +14 -25
  166. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  167. data/app/views/alchemy/admin/pages/_sitemap.html.erb +6 -0
  168. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  169. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  170. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  171. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  172. data/app/views/alchemy/admin/partials/_routes.html.erb +8 -0
  173. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  174. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  175. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  176. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  177. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  178. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  179. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  180. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  181. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  182. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  183. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  184. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  185. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  186. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  187. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  188. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  189. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  190. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  191. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  192. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  193. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  194. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  195. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  196. data/app/views/alchemy/pages/show.rss.builder +3 -2
  197. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  198. data/babel.config.js +12 -0
  199. data/bin/rails +5 -4
  200. data/config/alchemy/config.yml +15 -24
  201. data/config/brakeman.ignore +1 -1
  202. data/config/initializers/assets.rb +2 -1
  203. data/config/initializers/dragonfly.rb +2 -1
  204. data/config/initializers/mime_types.rb +1 -0
  205. data/config/initializers/mini_profiler.rb +3 -2
  206. data/config/initializers/simple_form.rb +6 -6
  207. data/config/locales/alchemy.en.yml +37 -14
  208. data/config/routes.rb +32 -28
  209. data/config/spring.rb +3 -2
  210. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  211. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  212. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  213. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  214. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  215. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  216. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  217. data/lib/alchemy/admin/locale.rb +3 -1
  218. data/lib/alchemy/admin/preview_url.rb +64 -0
  219. data/lib/alchemy/auth_accessors.rb +8 -7
  220. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  221. data/lib/alchemy/config.rb +26 -2
  222. data/lib/alchemy/configuration_methods.rb +3 -1
  223. data/lib/alchemy/controller_actions.rb +6 -5
  224. data/lib/alchemy/deprecation.rb +2 -1
  225. data/lib/alchemy/elements_finder.rb +5 -5
  226. data/lib/alchemy/engine.rb +23 -8
  227. data/lib/alchemy/errors.rb +0 -7
  228. data/lib/alchemy/essence.rb +17 -16
  229. data/lib/alchemy/filetypes.rb +5 -5
  230. data/lib/alchemy/forms/builder.rb +4 -4
  231. data/lib/alchemy/hints.rb +1 -1
  232. data/lib/alchemy/i18n.rb +2 -1
  233. data/lib/alchemy/modules.rb +12 -12
  234. data/lib/alchemy/name_conversions.rb +5 -5
  235. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  236. data/lib/alchemy/page_layout.rb +15 -12
  237. data/lib/alchemy/paths.rb +1 -1
  238. data/lib/alchemy/permissions.rb +7 -6
  239. data/lib/alchemy/resource.rb +23 -13
  240. data/lib/alchemy/resources_helper.rb +12 -18
  241. data/lib/alchemy/routing_constraints.rb +1 -1
  242. data/lib/alchemy/seeder.rb +42 -14
  243. data/lib/alchemy/shell.rb +13 -10
  244. data/lib/alchemy/taggable.rb +1 -0
  245. data/lib/alchemy/tasks/tidy.rb +4 -3
  246. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  247. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  248. data/lib/alchemy/test_support/factories.rb +1 -1
  249. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  250. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  251. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  252. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  253. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  254. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  255. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  256. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  257. data/lib/alchemy/test_support/factories/language_factory.rb +16 -14
  258. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  259. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  260. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  261. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  262. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  263. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  264. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  265. data/lib/alchemy/tinymce.rb +15 -13
  266. data/lib/alchemy/upgrader.rb +8 -7
  267. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  268. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  269. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  270. data/lib/alchemy/version.rb +1 -1
  271. data/lib/alchemy_cms.rb +52 -50
  272. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  273. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  274. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  275. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  276. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  277. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  278. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  279. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  280. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  281. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  283. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  285. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  286. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  287. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  288. data/lib/generators/alchemy/install/install_generator.rb +110 -0
  289. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  290. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  291. data/lib/generators/alchemy/install/templates/menus.yml.tt +8 -0
  292. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  293. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +5 -5
  294. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  295. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  296. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  297. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  298. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +2 -2
  299. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +2 -2
  300. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  301. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  302. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  303. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  305. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  306. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  307. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  308. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  309. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  310. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  311. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  312. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  313. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  314. data/lib/tasks/alchemy/db.rake +3 -19
  315. data/lib/tasks/alchemy/install.rake +3 -2
  316. data/lib/tasks/alchemy/tidy.rake +9 -8
  317. data/lib/tasks/alchemy/upgrade.rake +28 -105
  318. data/package.json +45 -0
  319. data/package/admin.js +14 -0
  320. data/package/src/__tests__/i18n.spec.js +70 -0
  321. data/package/src/i18n.js +48 -0
  322. data/package/src/node_tree.js +72 -0
  323. data/package/src/translations.js +32 -0
  324. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  325. data/package/src/utils/__tests__/events.spec.js +38 -0
  326. data/package/src/utils/ajax.js +48 -0
  327. data/package/src/utils/events.js +16 -0
  328. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  329. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  330. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  331. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  332. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  333. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  334. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  335. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  336. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  337. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  338. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  339. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  340. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  341. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  342. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  343. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  344. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  345. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  346. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  347. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  348. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  349. metadata +128 -81
  350. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  351. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  352. data/app/helpers/alchemy/essences_helper.rb +0 -119
  353. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  354. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  355. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  356. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -33
  357. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  358. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  359. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  360. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  361. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  362. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  363. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  364. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  365. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  366. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  367. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  368. data/lib/alchemy/ssl_protection.rb +0 -32
  369. data/lib/alchemy/tasks/helpers.rb +0 -81
  370. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  371. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  372. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  373. data/lib/alchemy/upgrader/four_point_two.rb +0 -85
  374. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -43
  375. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -148
  376. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -28
  377. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  378. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  379. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  380. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  381. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  382. data/lib/tasks/alchemy/convert.rake +0 -95
  383. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  384. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
data/README.md CHANGED
@@ -18,7 +18,7 @@ Alchemy is an open source CMS engine written in Ruby on Rails.
18
18
 
19
19
  Read more about Alchemy on the [website](https://alchemy-cms.com) and in the [guidelines](https://guides.alchemy-cms.com).
20
20
 
21
- **CAUTION: This master branch is a development branch that *can* contain bugs. For productive environments you should use the [current Ruby gem version](https://rubygems.org/gems/alchemy_cms), or the [latest stable branch (4.2-stable)](https://github.com/AlchemyCMS/alchemy_cms/tree/4.2-stable).**
21
+ **CAUTION: This master branch is a development branch that *can* contain bugs. For productive environments you should use the [current Ruby gem version](https://rubygems.org/gems/alchemy_cms), or the [latest stable branch (4.5-stable)](https://github.com/AlchemyCMS/alchemy_cms/tree/4.5-stable).**
22
22
 
23
23
 
24
24
  ## ✅ Features
@@ -51,8 +51,9 @@ or visit the existing demo at https://alchemy-demo.herokuapp.com
51
51
 
52
52
  ## 🚂 Rails Version
53
53
 
54
- **This version of AlchemyCMS runs with all versions of Rails 5 and Rails 6**
54
+ **This version of AlchemyCMS runs with Rails 5.2 and Rails 6.0**
55
55
 
56
+ * For a Rails 5.0 or 5.1 compatible version use the [`4.5-stable` branch](https://github.com/AlchemyCMS/alchemy_cms/tree/4.5-stable).
56
57
  * For a Rails 4.2 compatible version use the [`3.6-stable` branch](https://github.com/AlchemyCMS/alchemy_cms/tree/3.6-stable).
57
58
  * For a Rails 4.0/4.1 compatible version use the [`3.1-stable` branch](https://github.com/AlchemyCMS/alchemy_cms/tree/3.1-stable).
58
59
  * For a Rails 3.2 compatible version use the [`2.8-stable` branch](https://github.com/AlchemyCMS/alchemy_cms/tree/2.8-stable).
@@ -78,23 +79,37 @@ For a Ruby 1.8.7 compatible version use the [`2.3-stable` branch](https://github
78
79
 
79
80
  ## ⌨️ Installation
80
81
 
81
- #### 1. Add the Alchemy gem:
82
+ ### Stand Alone Installation
82
83
 
83
- Put this into your `Gemfile`:
84
+ If you do not have a Rails project yet or just want to check out Alchemy, then use this Rails template.
84
85
 
85
- ```ruby
86
- gem 'alchemy_cms', github: 'AlchemyCMS/alchemy_cms', branch: 'master'
86
+ Make sure you have Rails installed first:
87
+
88
+ ```
89
+ $ gem install rails
87
90
  ```
88
91
 
89
- **NOTE:** You normally want to use a stable branch, like `4.1-stable`.
92
+ Then create a new Rails project with:
90
93
 
91
- #### 2. Update your bundle:
94
+ ```
95
+ $ rails new -m https://raw.githubusercontent.com/AlchemyCMS/rails-templates/master/all.rb <MY-PROJECT-NAME>
96
+ ```
92
97
 
93
- ```bash
94
- $ bundle install
98
+ and follow the on screen instructions.
99
+
100
+ ### Manual Installation
101
+
102
+ If you want to manually install Alchemy into your Rails project follow these steps.
103
+
104
+ #### Add the Alchemy gem:
105
+
106
+ Put Alchemy into your `Gemfile` with:
107
+
108
+ ```
109
+ $ bundle add alchemy_cms
95
110
  ```
96
111
 
97
- #### 3. Set the authentication user
112
+ #### Set the authentication user
98
113
 
99
114
  Now you have to decide, if you want to use your own user model or if you want to use
100
115
  the Devise based user model that Alchemy provides and was extracted [into its own gem](https://github.com/AlchemyCMS/alchemy-devise).
@@ -103,17 +118,14 @@ the Devise based user model that Alchemy provides and was extracted [into its ow
103
118
 
104
119
  If you don't have your own user class, you can use the Alchemy user model. Just add the following gem into your `Gemfile`:
105
120
 
106
- ```ruby
107
- gem 'alchemy-devise', github: 'AlchemyCMS/alchemy-devise', branch: 'master'
121
+ ```
122
+ $ bundle add alchemy-devise
108
123
  ```
109
124
 
110
- **NOTE:** You normally want to use a stable branch, like `4.1-stable`.
111
-
112
- Then run:
125
+ Then run the `alchemy-devise` installer:
113
126
 
114
127
  ```bash
115
- $ bundle install
116
- $ bin/rake alchemy_devise:install:migrations
128
+ $ bin/rails g alchemy_devise:install
117
129
  ```
118
130
 
119
131
  ##### Use your User model
@@ -172,7 +184,7 @@ Alchemy has very flexible ways to organize and manage content. Please be sure to
172
184
 
173
185
  ### Custom Controllers
174
186
 
175
- Beginning with Alchemy 3.1 we do not patch the `ApplicationController` anymore. If you have controllers that loads Alchemy content or uses Alchemy helpers in the views (i.e. `render_navigation` or `render_elements`) you can either inherit from `Alchemy::BaseController` or you `include Alchemy::ControllerActions` in your controller (**that's the recommended way**).
187
+ Beginning with Alchemy 3.1 we do not patch the `ApplicationController` anymore. If you have controllers that loads Alchemy content or uses Alchemy helpers in the views (i.e. `render_menu` or `render_elements`) you can either inherit from `Alchemy::BaseController` or you `include Alchemy::ControllerActions` in your controller (**that's the recommended way**).
176
188
 
177
189
  ### Custom admin interface routing
178
190
 
data/Rakefile CHANGED
@@ -39,14 +39,16 @@ namespace :alchemy do
39
39
  namespace :spec do
40
40
  desc "Prepares database for testing Alchemy"
41
41
  task :prepare do
42
- system <<-BASH
43
- cd spec/dummy
44
- export RAILS_ENV=test
45
- bin/rake db:create
46
- bin/rake db:environment:set
47
- bin/rake db:migrate:reset
48
- cd -
49
- BASH
42
+ result = system <<~BASH
43
+ cd spec/dummy && \
44
+ export RAILS_ENV=test && \
45
+ bin/rake db:create && \
46
+ bin/rake db:environment:set && \
47
+ bin/rake db:migrate:reset && \
48
+ bin/rails g alchemy:install --skip --skip-demo-files && \
49
+ cd -
50
+ BASH
51
+ result || fail
50
52
  end
51
53
  end
52
54
 
@@ -8,10 +8,10 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Alchemy::VERSION
9
9
  gem.platform = Gem::Platform::RUBY
10
10
  gem.authors = ['Thomas von Deyen', 'Robin Boening', 'Marc Schettke', 'Hendrik Mans', 'Carsten Fregin', 'Martin Meyerhoff']
11
- gem.email = ['alchemy@magiclabs.de']
11
+ gem.email = ['hello@alchemy-cms.com']
12
12
  gem.homepage = 'https://alchemy-cms.com'
13
- gem.summary = 'A powerful, userfriendly and flexible CMS for Rails 5'
14
- gem.description = 'Alchemy is a powerful, userfriendly and flexible Rails 5 CMS.'
13
+ gem.summary = 'A powerful, userfriendly and flexible CMS for Rails'
14
+ gem.description = 'Alchemy is a powerful, userfriendly and flexible Rails CMS.'
15
15
  gem.requirements << 'ImageMagick (libmagick), v6.6 or greater.'
16
16
  gem.required_ruby_version = '>= 2.3.0'
17
17
  gem.license = 'BSD New'
@@ -32,7 +32,7 @@ Gem::Specification.new do |gem|
32
32
  gem.add_runtime_dependency 'kaminari', ['~> 1.1']
33
33
  gem.add_runtime_dependency 'originator', ['~> 3.1']
34
34
  gem.add_runtime_dependency 'non-stupid-digest-assets', ['~> 1.0.8']
35
- gem.add_runtime_dependency 'rails', ['>= 5.0.0', '< 6.1']
35
+ gem.add_runtime_dependency 'rails', ['>= 5.2.0', '< 6.1']
36
36
  gem.add_runtime_dependency 'ransack', ['>= 1.8', '< 3.0']
37
37
  gem.add_runtime_dependency 'request_store', ['~> 1.2']
38
38
  gem.add_runtime_dependency 'responders', ['>= 2.0', '< 4.0']
@@ -41,6 +41,7 @@ Gem::Specification.new do |gem|
41
41
  gem.add_runtime_dependency 'simple_form', ['>= 4.0', '< 6']
42
42
  gem.add_runtime_dependency 'sprockets', ['>= 3.0', '< 5']
43
43
  gem.add_runtime_dependency 'turbolinks', ['>= 2.5']
44
+ gem.add_runtime_dependency 'webpacker', ['>= 4.0', '< 6']
44
45
 
45
46
  gem.add_development_dependency 'capybara', ['~> 3.0']
46
47
  gem.add_development_dependency 'capybara-screenshot', ['~> 1.0']
@@ -51,6 +52,7 @@ Gem::Specification.new do |gem|
51
52
  gem.add_development_dependency 'rspec-rails', ['>= 4.0.0.beta2']
52
53
  gem.add_development_dependency 'simplecov', ['~> 0.17.1']
53
54
  gem.add_development_dependency 'webdrivers', ['~> 4.0']
55
+ gem.add_development_dependency 'webmock', ['~> 3.3']
54
56
  gem.add_development_dependency 'shoulda-matchers', ['~> 4.0']
55
57
 
56
58
  gem.post_install_message = <<-MSG
@@ -32,7 +32,6 @@
32
32
  //= require alchemy/alchemy.growler
33
33
  //= require alchemy/alchemy.gui
34
34
  //= require alchemy/alchemy.hotkeys
35
- //= require alchemy/alchemy.i18n
36
35
  //= require alchemy/alchemy.image_cropper
37
36
  //= require alchemy/alchemy.image_overlay
38
37
  //= require alchemy/alchemy.string_extension
@@ -46,6 +45,6 @@
46
45
  //= require alchemy/alchemy.spinner
47
46
  //= require alchemy/alchemy.tinymce
48
47
  //= require alchemy/alchemy.tooltips
49
- //= require alchemy/alchemy.translations
50
48
  //= require alchemy/alchemy.trash_window
51
49
  //= require alchemy/page_select
50
+ //= require alchemy/node_select
@@ -62,9 +62,10 @@ $.extend Alchemy,
62
62
  removePicture: (selector) ->
63
63
  $form_field = $(selector)
64
64
  $element = $form_field.closest(".element-editor")
65
+ $content = $form_field.closest(".content_editor")
65
66
  if $form_field[0]
66
67
  $form_field.val ""
67
- $element.find(".thumbnail_background").html('<i class="icon far fa-image fa-fw"/>')
68
+ $content.find(".thumbnail_background").html('<i class="icon far fa-image fa-fw"/>')
68
69
  Alchemy.setElementDirty $element
69
70
  false
70
71
 
@@ -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]
@@ -76,16 +76,16 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
76
76
  meta = data.meta
77
77
  results:
78
78
  data.pages.map (page) ->
79
- id: "/#{page.urlname}"
79
+ id: page.url_path
80
80
  name: page.name
81
- urlname: page.urlname
81
+ url_path: page.url_path
82
82
  page_id: page.id
83
83
  more: meta.page * meta.per_page < meta.total_count
84
84
  initSelection: ($element, callback) =>
85
85
  urlname = $element.val()
86
86
  $.get Alchemy.routes.api_pages_path,
87
87
  q:
88
- urlname_eq: urlname.replace(/^\//, '')
88
+ urlname_eq: urlname.replace(/^\/([a-z]{2}(-[A-Z]{2})?\/)?/, '')
89
89
  page: 1
90
90
  per_page: 1,
91
91
  (data) =>
@@ -93,9 +93,9 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
93
93
  if page
94
94
  @initElementSelect(page.id)
95
95
  callback
96
- id: "/#{page.urlname}"
96
+ id: page.url_path
97
97
  name: page.name
98
- urlname: page.name
98
+ url_path: page.url_path
99
99
  page_id: page.id
100
100
  formatSelection: (page) ->
101
101
  page.name
@@ -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,2 +1,4 @@
1
1
  //= require alchemy/templates/spinner
2
2
  //= require alchemy/templates/page
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>
@@ -0,0 +1,3 @@
1
+ <a class="node_folder" data-node-id="{{ node.id }}">
2
+ <i class="far fa-{{#if node.folded }}plus{{else}}minus{{/if}}-square fa-fw"></i>
3
+ </a>
@@ -4,6 +4,6 @@
4
4
  {{ page.name }}
5
5
  </span>
6
6
  <span class="page-select--page-urlname">
7
- /{{ page.urlname }}
7
+ {{ page.url_path }}
8
8
  </span>
9
9
  </div>
@@ -49,9 +49,8 @@
49
49
  border-color: $hover-border-color;
50
50
  }
51
51
 
52
- &:active, &:active:focus {
53
- border-color: $hover-border-color;
54
- box-shadow: none;
52
+ &:active, &.active {
53
+ box-shadow: inset $button-box-shadow;
55
54
  }
56
55
 
57
56
  &:focus {
@@ -76,7 +76,7 @@ $button-text-shadow: none !default;
76
76
  $button-box-shadow: 0px 1px 1px -1px #333 !default;
77
77
  $button-focus-box-shadow: 0px 1px 1px 0px $button-focus-border-color !default;
78
78
  $button-padding: 0.55em 2em !default;
79
- $small-button-padding: 0.4em 1.25em !default;
79
+ $small-button-padding: 0.4em 0.8em !default;
80
80
  $button-margin: $form-field-margin !default;
81
81
 
82
82
  $secondary-button-bg-color: transparent !default;
@@ -108,7 +108,7 @@ $form-right-width: 65% !default;
108
108
  $sitemap-line-height: 32px !default;
109
109
  $sitemap-page-background-color: rgba($white, 0.75) !default;
110
110
  $sitemap-page-hover-color: rgba($light_yellow, 0.5) !default;
111
- $sitemap-info-background-color: rgba($linked-color, 0.5) !default;
111
+ $sitemap-info-background-color: rgba($white, 0.5) !default;
112
112
  $sitemap-highlight-color: rgba(#fffba5, 0.5) !default;
113
113
 
114
114
  $main-menu-width: 150px !default;
@@ -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 {
@@ -13,14 +13,6 @@ ul.list {
13
13
  padding: 0;
14
14
  list-style-type: none;
15
15
 
16
- &#layoutpages {
17
- margin-top: 16px;
18
-
19
- li {
20
- margin-left: 8px;
21
- }
22
- }
23
-
24
16
  li {
25
17
  list-style-type: none;
26
18
  display: block;