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
@@ -77,7 +77,7 @@ SimpleForm.setup do |config|
77
77
  config.boolean_style = :inline
78
78
 
79
79
  # Default class for buttons
80
- config.button_class = 'button'
80
+ config.button_class = "button"
81
81
 
82
82
  # Method used to tidy up errors. Specify any Rails Array method.
83
83
  # :first lists the first message for each field.
@@ -88,7 +88,7 @@ SimpleForm.setup do |config|
88
88
  config.error_notification_tag = :div
89
89
 
90
90
  # CSS class to add for error notification helper.
91
- config.error_notification_class = 'field_with_errors'
91
+ config.error_notification_class = "field_with_errors"
92
92
 
93
93
  # ID to add for error notification helper.
94
94
  # config.error_notification_id = nil
@@ -103,7 +103,7 @@ SimpleForm.setup do |config|
103
103
  config.collection_wrapper_tag = :div
104
104
 
105
105
  # You can define the class to use on all collection wrappers. Defaulting to none.
106
- config.collection_wrapper_class = 'control_group'
106
+ config.collection_wrapper_class = "control_group"
107
107
 
108
108
  # You can wrap each item in a collection of radio/check boxes with a tag,
109
109
  # defaulting to :span.
@@ -116,7 +116,7 @@ SimpleForm.setup do |config|
116
116
  config.label_text = proc { |label, required| "#{label}#{required}" }
117
117
 
118
118
  # You can define the class to use on all labels. Default is nil.
119
- config.label_class = 'control-label'
119
+ config.label_class = "control-label"
120
120
 
121
121
  # You can define the default class to be used on forms. Can be overriden
122
122
  # with `html: { :class }`. Defaulting to none.
@@ -170,12 +170,12 @@ SimpleForm.setup do |config|
170
170
  # config.input_class = nil
171
171
 
172
172
  # Define the default class of the input wrapper of the boolean input.
173
- config.boolean_label_class = 'checkbox'
173
+ config.boolean_label_class = "checkbox"
174
174
 
175
175
  # Defines if the default input wrapper class should be included in radio
176
176
  # collection wrappers.
177
177
  # config.include_default_input_wrapper_class = true
178
178
 
179
179
  # Defines which i18n scope will be used in Simple Form.
180
- config.i18n_scope = 'alchemy.forms'
180
+ config.i18n_scope = "alchemy.forms"
181
181
  end
@@ -49,6 +49,14 @@ en:
49
49
  #
50
50
  content_names:
51
51
 
52
+
53
+ # === Translations for menu names
54
+ # Used for the translations of the names of root menu nodes.
55
+ #
56
+ menu_names:
57
+ main_menu: Main Menu
58
+ footer_menu: Footer Menu
59
+
52
60
  # === Translations for content validations
53
61
  # Used when a user did not enter (correct) values to the content field.
54
62
  #
@@ -155,7 +163,8 @@ en:
155
163
 
156
164
  resource_help_texts:
157
165
  site:
158
- aliases: Please separate additional domains with spaces or new lines.
166
+ host: Either enter a <a href="https://en.wikipedia.org/wiki/Fully_qualified_domain_name" target="_blank">FQDN</a> or use a asterisk (*) to allow all domains to access this site.
167
+ aliases: Enter additional domains this site should be accessible by. Please separate them by space or new line.
159
168
 
160
169
  add_nested_element: "Add %{name}"
161
170
  anchor: 'Anchor'
@@ -455,7 +464,11 @@ en:
455
464
  no_files_in_archive: "You do not have any files in your archive."
456
465
  no_images_in_archive: "You don't have any images in your archive."
457
466
  no_more_elements_to_add: "No more elements available."
458
- no_resource_found: "No %{resource} found. Please add your first one below."
467
+ no_resource_found:
468
+ default: "No %{resource} found. Please add your first one below."
469
+ alchemy/language: "<h2>Your website does not have any languages yet.</h2><p>You need at least one language to work with. Please create one below.</p>"
470
+ alchemy/node: "<h2>You do not have any menus yet.</h2><p>With menus your users can navigate your website. You can have multiple menus on your website. How many depends on your website template.</p><p>Please chose which menu you want to create first.</p>"
471
+ alchemy/site: "<h2>You do not have any websites yet.</h2><p>In order to serve requests you need to create a website first.</p><p>This form has been filled with sensible defaults that work in most cases.</p>"
459
472
  no_search_results: "Your search did not return any results."
460
473
  "not a valid image": "This is not an valid image."
461
474
  "or": 'or'
@@ -468,9 +481,6 @@ en:
468
481
  page_published: "Published page"
469
482
  page_restricted: "restricted"
470
483
  page_states:
471
- visible:
472
- "true": "Page is visible in navigation."
473
- "false": "Page is not visible in navigation."
474
484
  public:
475
485
  "true": "Page is published."
476
486
  "false": "Page is unpublished."
@@ -565,8 +575,6 @@ en:
565
575
  button_label: Upload image(s)
566
576
  upload_success: "Picture %{name} uploaded successfully"
567
577
  upload_failure: "Error while uploading %{name}: %{error}"
568
- url_name: "URL-Name"
569
- visible: "visible"
570
578
  want_to_create_new_language: "Do you want to create a new empty language tree?"
571
579
  want_to_make_copy_of_existing_language: "Do you want to copy an existing language tree?"
572
580
  "We need at least one default.": "A default language must exist."
@@ -629,7 +637,7 @@ en:
629
637
  time:
630
638
  formats:
631
639
  alchemy:
632
- default: "%a, %d %b %Y %H:%M:%S %z"
640
+ default: "%m.%d.%Y %H:%M"
633
641
  essence_date: "%Y-%m-%d"
634
642
  page_status: "%m.%d.%Y %H:%M"
635
643
  short_datetime: "%d %b %H:%M"
@@ -662,9 +670,9 @@ en:
662
670
  page_layout:
663
671
  blank: "^Please choose a page layout."
664
672
  urlname:
665
- too_short: "^The pages urlname is too short (minimum of 3 characters)."
666
- taken: "^URL-Name already taken."
667
- exclusion: "^URL-Name reserved."
673
+ too_short: "^URL-Path is too short (minimum of 3 characters)."
674
+ taken: "^URL-Path already taken."
675
+ exclusion: "^URL-Path reserved."
668
676
  alchemy/picture:
669
677
  attributes:
670
678
  image_file:
@@ -696,6 +704,20 @@ en:
696
704
 
697
705
  # Translations for Alchemy database models
698
706
  activerecord:
707
+ errors:
708
+ models:
709
+ alchemy/node:
710
+ attributes:
711
+ base:
712
+ essence_nodes_present: "This menu item is in use inside an Alchemy element on the following pages: %{page_names}."
713
+ alchemy/site:
714
+ attributes:
715
+ languages:
716
+ still_present: "are still attached to this site. Please remove them first."
717
+ alchemy/language:
718
+ attributes:
719
+ pages:
720
+ still_present: "are still attached to this language. Please remove them first."
699
721
  models:
700
722
  gutentag/tag:
701
723
  one: Tag
@@ -772,8 +794,9 @@ en:
772
794
  locale: Localization
773
795
  code: ISO Code
774
796
  alchemy/legacy_page_url:
775
- urlname: "URL path"
797
+ urlname: "URL-Path"
776
798
  alchemy/node:
799
+ menu_type: Menu Type
777
800
  name: "Name"
778
801
  title: "Title"
779
802
  nofollow: "Search engine must not follow"
@@ -797,8 +820,8 @@ en:
797
820
  tag_list: Tags
798
821
  title: "Title"
799
822
  updated_at: "Updated at"
800
- urlname: "Urlname"
801
- visible: "visible in navigation"
823
+ urlname: "URL-Path"
824
+ slug: "Slug"
802
825
  alchemy/picture:
803
826
  image_file_name: "Filename"
804
827
  image_file_height: "Height"
@@ -1,27 +1,24 @@
1
- require 'alchemy/routing_constraints'
1
+ # frozen_string_literal: true
2
+ require "alchemy/routing_constraints"
2
3
 
3
4
  Alchemy::Engine.routes.draw do
4
- root to: 'pages#index'
5
+ root to: "pages#index"
5
6
 
6
- get '/sitemap.xml' => 'pages#sitemap', format: 'xml'
7
+ get "/sitemap.xml" => "pages#sitemap", format: "xml"
7
8
 
8
9
  scope Alchemy.admin_path, {constraints: Alchemy.admin_constraints} do
9
- get '/' => redirect("#{Alchemy.admin_path}/dashboard"), as: :admin
10
- get '/dashboard' => 'admin/dashboard#index', as: :admin_dashboard
11
- get '/dashboard/info' => 'admin/dashboard#info', as: :dashboard_info
12
- get '/help' => 'admin/dashboard#help', as: :help
13
- get '/dashboard/update_check' => 'admin/dashboard#update_check', as: :update_check
14
- get '/leave' => 'admin/base#leave', as: :leave_admin
10
+ get "/" => redirect("#{Alchemy.admin_path}/dashboard"), as: :admin
11
+ get "/dashboard" => "admin/dashboard#index", as: :admin_dashboard
12
+ get "/dashboard/info" => "admin/dashboard#info", as: :dashboard_info
13
+ get "/help" => "admin/dashboard#help", as: :help
14
+ get "/dashboard/update_check" => "admin/dashboard#update_check", as: :update_check
15
+ get "/leave" => "admin/base#leave", as: :leave_admin
15
16
  end
16
17
 
17
18
  namespace :admin, {path: Alchemy.admin_path, constraints: Alchemy.admin_constraints} do
18
19
  resources :contents, only: [:create]
19
20
 
20
- resources :nodes do
21
- member do
22
- patch :toggle
23
- end
24
- end
21
+ resources :nodes
25
22
 
26
23
  resources :pages do
27
24
  resources :elements
@@ -98,7 +95,7 @@ Alchemy::Engine.routes.draw do
98
95
  end
99
96
  end
100
97
 
101
- resource :clipboard, only: :index, controller: 'clipboard' do
98
+ resource :clipboard, only: :index, controller: "clipboard" do
102
99
  collection do
103
100
  get :index
104
101
  delete :clear
@@ -107,7 +104,7 @@ Alchemy::Engine.routes.draw do
107
104
  end
108
105
  end
109
106
 
110
- resource :trash, only: :index, controller: 'trash' do
107
+ resource :trash, only: :index, controller: "trash" do
111
108
  collection do
112
109
  get :index
113
110
  delete :clear
@@ -122,45 +119,52 @@ Alchemy::Engine.routes.draw do
122
119
 
123
120
  resources :sites
124
121
 
125
- get '/styleguide' => 'styleguide#index'
122
+ get "/styleguide" => "styleguide#index"
126
123
  end
127
124
 
128
- get '/attachment/:id/download(/:name)' => 'attachments#download',
125
+ get "/attachment/:id/download(/:name)" => "attachments#download",
129
126
  as: :download_attachment
130
- get '/attachment/:id/show' => 'attachments#show',
127
+ get "/attachment/:id/show" => "attachments#show",
131
128
  as: :show_attachment
132
129
 
133
130
  resources :messages, only: [:index, :new, :create]
134
131
  resources :elements, only: :show
135
132
  resources :contents, only: :show
136
133
 
137
- namespace :api, defaults: {format: 'json'} do
134
+ namespace :api, defaults: {format: "json"} do
138
135
  resources :contents, only: [:index, :show]
139
136
 
140
137
  resources :elements, only: [:index, :show] do
141
- get '/contents' => 'contents#index', as: 'contents'
142
- get '/contents/:name' => 'contents#show', as: 'content'
138
+ get "/contents" => "contents#index", as: "contents"
139
+ get "/contents/:name" => "contents#show", as: "content"
143
140
  end
144
141
 
145
142
  resources :pages, only: [:index] do
146
- get 'elements' => 'elements#index', as: 'elements'
147
- get 'elements/:named' => 'elements#index', as: 'named_elements'
143
+ get "elements" => "elements#index", as: "elements"
144
+ get "elements/:named" => "elements#index", as: "named_elements"
148
145
  collection do
149
146
  get :nested
150
147
  end
151
148
  end
152
149
 
153
- get '/pages/*urlname(.:format)' => 'pages#show', as: 'page'
154
- get '/admin/pages/:id(.:format)' => 'pages#show', as: 'preview_page'
150
+ get "/pages/*urlname(.:format)" => "pages#show", as: "page"
151
+ get "/admin/pages/:id(.:format)" => "pages#show", as: "preview_page"
152
+
153
+ resources :nodes, only: [:index] do
154
+ member do
155
+ patch :move
156
+ patch :toggle_folded
157
+ end
158
+ end
155
159
  end
156
160
 
157
- get '/:locale' => 'pages#index',
161
+ get "/:locale" => "pages#index",
158
162
  constraints: {locale: Alchemy::RoutingConstraints::LOCALE_REGEXP},
159
163
  as: :show_language_root
160
164
 
161
165
  # The page show action has to be last route
162
166
  constraints(locale: Alchemy::RoutingConstraints::LOCALE_REGEXP) do
163
- get '(/:locale)/*urlname(.:format)' => 'pages#show',
167
+ get "(/:locale)/*urlname(.:format)" => "pages#show",
164
168
  constraints: Alchemy::RoutingConstraints.new,
165
169
  as: :show_page
166
170
  end
@@ -1,2 +1,3 @@
1
- Spring.application_root = './spec/dummy'
2
- Spring.watch 'lib/**/*'
1
+ # frozen_string_literal: true
2
+ Spring.application_root = "./spec/dummy"
3
+ Spring.watch "lib/**/*"
@@ -0,0 +1,313 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AlchemyFourPointFour < ActiveRecord::Migration[5.2]
4
+ def up
5
+ unless table_exists?("alchemy_attachments")
6
+ create_table "alchemy_attachments", force: :cascade do |t|
7
+ t.string "name"
8
+ t.string "file_name"
9
+ t.string "file_mime_type"
10
+ t.integer "file_size"
11
+ t.references "creator"
12
+ t.references "updater"
13
+ t.timestamps null: false
14
+ t.string "file_uid"
15
+ t.index ["file_uid"], name: "index_alchemy_attachments_on_file_uid"
16
+ end
17
+ end
18
+
19
+ unless table_exists?("alchemy_contents")
20
+ create_table "alchemy_contents", force: :cascade do |t|
21
+ t.string "name"
22
+ t.references "essence", null: false, polymorphic: true, index: { unique: true }
23
+ t.references "element", null: false
24
+ end
25
+ end
26
+
27
+ unless table_exists?("alchemy_elements")
28
+ create_table "alchemy_elements", force: :cascade do |t|
29
+ t.string "name"
30
+ t.integer "position"
31
+ t.references "page", null: false, index: false
32
+ t.boolean "public", default: true
33
+ t.boolean "folded", default: false
34
+ t.boolean "unique", default: false
35
+ t.timestamps null: false
36
+ t.references "creator"
37
+ t.references "updater"
38
+ t.references "parent_element", index: false
39
+ t.boolean "fixed", default: false, null: false
40
+ t.index ["fixed"], name: "index_alchemy_elements_on_fixed"
41
+ t.index ["page_id", "parent_element_id"], name: "index_alchemy_elements_on_page_id_and_parent_element_id"
42
+ t.index ["page_id", "position"], name: "index_elements_on_page_id_and_position"
43
+ end
44
+ end
45
+
46
+ unless table_exists?("alchemy_elements_alchemy_pages")
47
+ create_table "alchemy_elements_alchemy_pages", id: false, force: :cascade do |t|
48
+ t.references "element"
49
+ t.references "page"
50
+ end
51
+ end
52
+
53
+ unless table_exists?("alchemy_essence_booleans")
54
+ create_table "alchemy_essence_booleans", force: :cascade do |t|
55
+ t.boolean "value"
56
+ t.index ["value"], name: "index_alchemy_essence_booleans_on_value"
57
+ end
58
+ end
59
+
60
+ unless table_exists?("alchemy_essence_dates")
61
+ create_table "alchemy_essence_dates", force: :cascade do |t|
62
+ t.datetime "date"
63
+ end
64
+ end
65
+
66
+ unless table_exists?("alchemy_essence_files")
67
+ create_table "alchemy_essence_files", force: :cascade do |t|
68
+ t.references "attachment"
69
+ t.string "title"
70
+ t.string "css_class"
71
+ t.string "link_text"
72
+ end
73
+ end
74
+
75
+ unless table_exists?("alchemy_essence_htmls")
76
+ create_table "alchemy_essence_htmls", force: :cascade do |t|
77
+ t.text "source"
78
+ end
79
+ end
80
+
81
+ unless table_exists?("alchemy_essence_links")
82
+ create_table "alchemy_essence_links", force: :cascade do |t|
83
+ t.string "link"
84
+ t.string "link_title"
85
+ t.string "link_target"
86
+ t.string "link_class_name"
87
+ end
88
+ end
89
+
90
+ unless table_exists?("alchemy_essence_pages")
91
+ create_table "alchemy_essence_pages", force: :cascade do |t|
92
+ t.references "page"
93
+ end
94
+ end
95
+
96
+ unless table_exists?("alchemy_essence_pictures")
97
+ create_table "alchemy_essence_pictures", force: :cascade do |t|
98
+ t.references "picture"
99
+ t.string "caption"
100
+ t.string "title"
101
+ t.string "alt_tag"
102
+ t.string "link"
103
+ t.string "link_class_name"
104
+ t.string "link_title"
105
+ t.string "css_class"
106
+ t.string "link_target"
107
+ t.string "crop_from"
108
+ t.string "crop_size"
109
+ t.string "render_size"
110
+ end
111
+ end
112
+
113
+ unless table_exists?("alchemy_essence_richtexts")
114
+ create_table "alchemy_essence_richtexts", force: :cascade do |t|
115
+ t.text "body"
116
+ t.text "stripped_body"
117
+ t.boolean "public"
118
+ end
119
+ end
120
+
121
+ unless table_exists?("alchemy_essence_selects")
122
+ create_table "alchemy_essence_selects", force: :cascade do |t|
123
+ t.string "value"
124
+ t.index ["value"], name: "index_alchemy_essence_selects_on_value"
125
+ end
126
+ end
127
+
128
+ unless table_exists?("alchemy_essence_texts")
129
+ create_table "alchemy_essence_texts", force: :cascade do |t|
130
+ t.text "body"
131
+ t.string "link"
132
+ t.string "link_title"
133
+ t.string "link_class_name"
134
+ t.boolean "public", default: false
135
+ t.string "link_target"
136
+ end
137
+ end
138
+
139
+ unless table_exists?("alchemy_folded_pages")
140
+ create_table "alchemy_folded_pages", force: :cascade do |t|
141
+ t.references "page", null: false, index: false
142
+ t.references "user", null: false, index: false
143
+ t.boolean "folded", default: false
144
+ t.index ["page_id", "user_id"], name: "index_alchemy_folded_pages_on_page_id_and_user_id", unique: true
145
+ end
146
+ end
147
+
148
+ unless table_exists?("alchemy_languages")
149
+ create_table "alchemy_languages", force: :cascade do |t|
150
+ t.string "name"
151
+ t.string "language_code"
152
+ t.string "frontpage_name"
153
+ t.string "page_layout", default: "intro"
154
+ t.boolean "public", default: false
155
+ t.timestamps null: false
156
+ t.references "creator"
157
+ t.references "updater"
158
+ t.boolean "default", default: false
159
+ t.string "country_code", default: "", null: false
160
+ t.references "site", null: false
161
+ t.string "locale"
162
+ t.index ["language_code", "country_code"], name: "index_alchemy_languages_on_language_code_and_country_code"
163
+ t.index ["language_code"], name: "index_alchemy_languages_on_language_code"
164
+ end
165
+ end
166
+
167
+ unless table_exists?("alchemy_legacy_page_urls")
168
+ create_table "alchemy_legacy_page_urls", force: :cascade do |t|
169
+ t.string "urlname", null: false
170
+ t.references "page", null: false
171
+ t.timestamps null: false
172
+ t.index ["urlname"], name: "index_alchemy_legacy_page_urls_on_urlname"
173
+ end
174
+ end
175
+
176
+ unless table_exists?("alchemy_nodes")
177
+ create_table "alchemy_nodes", force: :cascade do |t|
178
+ t.string "name"
179
+ t.string "title"
180
+ t.string "url"
181
+ t.boolean "nofollow", default: false, null: false
182
+ t.boolean "external", default: false, null: false
183
+ t.boolean "folded", default: false, null: false
184
+ t.references "parent"
185
+ t.integer "lft", null: false
186
+ t.integer "rgt", null: false
187
+ t.integer "depth", default: 0, null: false
188
+ t.references "page"
189
+ t.references "language", null: false
190
+ t.references "creator"
191
+ t.references "updater"
192
+ t.timestamps null: false
193
+ t.references "site", null: false
194
+ t.index ["lft"], name: "index_alchemy_nodes_on_lft"
195
+ t.index ["rgt"], name: "index_alchemy_nodes_on_rgt"
196
+ end
197
+ end
198
+
199
+ unless table_exists?("alchemy_pages")
200
+ create_table "alchemy_pages", force: :cascade do |t|
201
+ t.string "name"
202
+ t.string "urlname"
203
+ t.string "title"
204
+ t.string "language_code"
205
+ t.boolean "language_root"
206
+ t.string "page_layout"
207
+ t.text "meta_keywords"
208
+ t.text "meta_description"
209
+ t.integer "lft"
210
+ t.integer "rgt"
211
+ t.references "parent", index: false
212
+ t.integer "depth"
213
+ t.boolean "visible", default: false
214
+ t.integer "locked_by"
215
+ t.boolean "restricted", default: false
216
+ t.boolean "robot_index", default: true
217
+ t.boolean "robot_follow", default: true
218
+ t.boolean "sitemap", default: true
219
+ t.boolean "layoutpage", default: false
220
+ t.timestamps null: false
221
+ t.references "creator"
222
+ t.references "updater"
223
+ t.references "language"
224
+ t.datetime "published_at"
225
+ t.datetime "public_on"
226
+ t.datetime "public_until"
227
+ t.datetime "locked_at"
228
+ t.index ["locked_at", "locked_by"], name: "index_alchemy_pages_on_locked_at_and_locked_by"
229
+ t.index ["parent_id", "lft"], name: "index_pages_on_parent_id_and_lft"
230
+ t.index ["public_on", "public_until"], name: "index_alchemy_pages_on_public_on_and_public_until"
231
+ t.index ["rgt"], name: "index_alchemy_pages_on_rgt"
232
+ t.index ["urlname"], name: "index_pages_on_urlname"
233
+ end
234
+ end
235
+
236
+ unless table_exists?("alchemy_pictures")
237
+ create_table "alchemy_pictures", force: :cascade do |t|
238
+ t.string "name"
239
+ t.string "image_file_name"
240
+ t.integer "image_file_width"
241
+ t.integer "image_file_height"
242
+ t.timestamps null: false
243
+ t.references "creator"
244
+ t.references "updater"
245
+ t.string "upload_hash"
246
+ t.string "image_file_uid"
247
+ t.integer "image_file_size"
248
+ t.string "image_file_format"
249
+ end
250
+ end
251
+
252
+ unless table_exists?("alchemy_sites")
253
+ create_table "alchemy_sites", force: :cascade do |t|
254
+ t.string "host"
255
+ t.string "name"
256
+ t.timestamps null: false
257
+ t.boolean "public", default: false
258
+ t.text "aliases"
259
+ t.boolean "redirect_to_primary_host"
260
+ t.index ["host", "public"], name: "alchemy_sites_public_hosts_idx"
261
+ t.index ["host"], name: "index_alchemy_sites_on_host"
262
+ end
263
+ end
264
+
265
+ unless foreign_key_exists?("alchemy_contents", column: "element_id")
266
+ add_foreign_key "alchemy_contents", "alchemy_elements", column: "element_id", on_update: :cascade, on_delete: :cascade
267
+ end
268
+
269
+ unless foreign_key_exists?("alchemy_elements", column: "page_id")
270
+ add_foreign_key "alchemy_elements", "alchemy_pages", column: "page_id", on_update: :cascade, on_delete: :cascade
271
+ end
272
+
273
+ unless foreign_key_exists?("alchemy_essence_pages", column: "page_id")
274
+ add_foreign_key "alchemy_essence_pages", "alchemy_pages", column: "page_id"
275
+ end
276
+
277
+ unless foreign_key_exists?("alchemy_nodes", column: "language_id")
278
+ add_foreign_key "alchemy_nodes", "alchemy_languages", column: "language_id"
279
+ end
280
+
281
+ unless foreign_key_exists?("alchemy_nodes", column: "page_id")
282
+ add_foreign_key "alchemy_nodes", "alchemy_pages", column: "page_id", on_delete: :cascade
283
+ end
284
+
285
+ unless foreign_key_exists?("alchemy_nodes", column: "site_id")
286
+ add_foreign_key "alchemy_nodes", "alchemy_sites", column: "site_id", on_delete: :cascade
287
+ end
288
+ end
289
+
290
+ def down
291
+ drop_table "alchemy_attachments" if table_exists?("alchemy_attachments")
292
+ drop_table "alchemy_contents" if table_exists?("alchemy_contents")
293
+ drop_table "alchemy_elements" if table_exists?("alchemy_elements")
294
+ drop_table "alchemy_elements_alchemy_pages" if table_exists?("alchemy_elements_alchemy_pages")
295
+ drop_table "alchemy_essence_booleans" if table_exists?("alchemy_essence_booleans")
296
+ drop_table "alchemy_essence_dates" if table_exists?("alchemy_essence_dates")
297
+ drop_table "alchemy_essence_files" if table_exists?("alchemy_essence_files")
298
+ drop_table "alchemy_essence_htmls" if table_exists?("alchemy_essence_htmls")
299
+ drop_table "alchemy_essence_links" if table_exists?("alchemy_essence_links")
300
+ drop_table "alchemy_essence_pages" if table_exists?("alchemy_essence_pages")
301
+ drop_table "alchemy_essence_pictures" if table_exists?("alchemy_essence_pictures")
302
+ drop_table "alchemy_essence_richtexts" if table_exists?("alchemy_essence_richtexts")
303
+ drop_table "alchemy_essence_selects" if table_exists?("alchemy_essence_selects")
304
+ drop_table "alchemy_essence_texts" if table_exists?("alchemy_essence_texts")
305
+ drop_table "alchemy_folded_pages" if table_exists?("alchemy_folded_pages")
306
+ drop_table "alchemy_languages" if table_exists?("alchemy_languages")
307
+ drop_table "alchemy_legacy_page_urls" if table_exists?("alchemy_legacy_page_urls")
308
+ drop_table "alchemy_nodes" if table_exists?("alchemy_nodes")
309
+ drop_table "alchemy_pages" if table_exists?("alchemy_pages")
310
+ drop_table "alchemy_pictures" if table_exists?("alchemy_pictures")
311
+ drop_table "alchemy_sites" if table_exists?("alchemy_sites")
312
+ end
313
+ end