alchemy_cms 4.4.4 → 5.0.0.beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +56 -18
  3. data/.github/workflows/stale.yml +1 -1
  4. data/.gitignore +20 -2
  5. data/.hound.yml +2 -1
  6. data/.prettierrc +6 -0
  7. data/.rubocop.yml +33 -20
  8. data/CHANGELOG.md +121 -0
  9. data/Gemfile +24 -22
  10. data/README.md +31 -19
  11. data/Rakefile +10 -8
  12. data/alchemy_cms.gemspec +7 -5
  13. data/app/assets/javascripts/alchemy/admin.js +1 -2
  14. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +2 -1
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +0 -2
  16. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +5 -5
  17. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +17 -17
  18. data/app/assets/javascripts/alchemy/node_select.js +39 -0
  19. data/app/assets/javascripts/alchemy/templates/index.js +2 -0
  20. data/app/assets/javascripts/alchemy/templates/node.hbs +16 -0
  21. data/app/assets/javascripts/alchemy/templates/node_folder.hbs +3 -0
  22. data/app/assets/javascripts/alchemy/templates/page.hbs +1 -1
  23. data/app/assets/stylesheets/alchemy/_mixins.scss +2 -3
  24. data/app/assets/stylesheets/alchemy/_variables.scss +2 -2
  25. data/app/assets/stylesheets/alchemy/admin.scss +3 -2
  26. data/app/assets/stylesheets/alchemy/base.scss +0 -1
  27. data/app/assets/stylesheets/alchemy/elements.scss +1 -1
  28. data/app/assets/stylesheets/alchemy/forms.scss +5 -0
  29. data/app/assets/stylesheets/alchemy/lists.scss +0 -8
  30. data/app/assets/stylesheets/alchemy/node-select.scss +43 -0
  31. data/app/assets/stylesheets/alchemy/nodes.scss +6 -1
  32. data/app/assets/stylesheets/alchemy/sitemap.scss +63 -21
  33. data/app/assets/stylesheets/alchemy/tables.scss +1 -24
  34. data/app/controllers/alchemy/admin/attachments_controller.rb +8 -7
  35. data/app/controllers/alchemy/admin/base_controller.rb +13 -33
  36. data/app/controllers/alchemy/admin/clipboard_controller.rb +5 -4
  37. data/app/controllers/alchemy/admin/contents_controller.rb +1 -2
  38. data/app/controllers/alchemy/admin/dashboard_controller.rb +10 -9
  39. data/app/controllers/alchemy/admin/elements_controller.rb +20 -20
  40. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +12 -14
  41. data/app/controllers/alchemy/admin/languages_controller.rb +35 -2
  42. data/app/controllers/alchemy/admin/layoutpages_controller.rb +5 -2
  43. data/app/controllers/alchemy/admin/nodes_controller.rb +5 -14
  44. data/app/controllers/alchemy/admin/pages_controller.rb +50 -63
  45. data/app/controllers/alchemy/admin/pictures_controller.rb +16 -16
  46. data/app/controllers/alchemy/admin/resources_controller.rb +21 -13
  47. data/app/controllers/alchemy/admin/sites_controller.rb +18 -0
  48. data/app/controllers/alchemy/admin/styleguide_controller.rb +1 -0
  49. data/app/controllers/alchemy/admin/tags_controller.rb +5 -3
  50. data/app/controllers/alchemy/admin/trash_controller.rb +6 -6
  51. data/app/controllers/alchemy/api/base_controller.rb +2 -2
  52. data/app/controllers/alchemy/api/contents_controller.rb +4 -4
  53. data/app/controllers/alchemy/api/elements_controller.rb +8 -8
  54. data/app/controllers/alchemy/api/nodes_controller.rb +65 -0
  55. data/app/controllers/alchemy/api/pages_controller.rb +15 -22
  56. data/app/controllers/alchemy/attachments_controller.rb +5 -5
  57. data/app/controllers/alchemy/base_controller.rb +10 -9
  58. data/app/controllers/alchemy/messages_controller.rb +16 -23
  59. data/app/controllers/alchemy/pages_controller.rb +13 -11
  60. data/app/controllers/concerns/alchemy/admin/archive_overlay.rb +3 -2
  61. data/app/controllers/concerns/alchemy/admin/current_language.rb +23 -0
  62. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +5 -5
  63. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +4 -4
  64. data/app/controllers/concerns/alchemy/page_redirects.rb +2 -9
  65. data/app/controllers/concerns/alchemy/site_redirects.rb +2 -2
  66. data/app/decorators/alchemy/content_editor.rb +55 -0
  67. data/app/decorators/alchemy/element_editor.rb +39 -0
  68. data/app/helpers/alchemy/admin/attachments_helper.rb +6 -6
  69. data/app/helpers/alchemy/admin/base_helper.rb +36 -35
  70. data/app/helpers/alchemy/admin/contents_helper.rb +3 -3
  71. data/app/helpers/alchemy/admin/elements_helper.rb +3 -88
  72. data/app/helpers/alchemy/admin/essences_helper.rb +8 -117
  73. data/app/helpers/alchemy/admin/form_helper.rb +1 -1
  74. data/app/helpers/alchemy/admin/navigation_helper.rb +24 -23
  75. data/app/helpers/alchemy/admin/pages_helper.rb +12 -12
  76. data/app/helpers/alchemy/admin/pictures_helper.rb +4 -6
  77. data/app/helpers/alchemy/admin/tags_helper.rb +8 -7
  78. data/app/helpers/alchemy/base_helper.rb +13 -8
  79. data/app/helpers/alchemy/elements_block_helper.rb +2 -31
  80. data/app/helpers/alchemy/elements_helper.rb +12 -58
  81. data/app/helpers/alchemy/pages_helper.rb +24 -174
  82. data/app/helpers/alchemy/url_helper.rb +2 -1
  83. data/app/mailers/alchemy/base_mailer.rb +1 -1
  84. data/app/mailers/alchemy/messages_mailer.rb +1 -1
  85. data/app/models/alchemy/attachment.rb +20 -18
  86. data/app/models/alchemy/base_record.rb +2 -5
  87. data/app/models/alchemy/content.rb +33 -52
  88. data/app/models/alchemy/content/factory.rb +24 -31
  89. data/app/models/alchemy/element.rb +45 -53
  90. data/app/models/alchemy/element/definitions.rb +4 -4
  91. data/app/models/alchemy/element/element_contents.rb +9 -6
  92. data/app/models/alchemy/element/element_essences.rb +4 -3
  93. data/app/models/alchemy/element/presenters.rb +3 -2
  94. data/app/models/alchemy/element_to_page.rb +1 -1
  95. data/app/models/alchemy/essence_boolean.rb +1 -3
  96. data/app/models/alchemy/essence_date.rb +2 -3
  97. data/app/models/alchemy/essence_file.rb +4 -4
  98. data/app/models/alchemy/essence_html.rb +1 -3
  99. data/app/models/alchemy/essence_link.rb +1 -3
  100. data/app/models/alchemy/essence_node.rb +18 -0
  101. data/app/models/alchemy/essence_page.rb +3 -16
  102. data/app/models/alchemy/essence_picture.rb +17 -16
  103. data/app/models/alchemy/essence_picture_view.rb +7 -6
  104. data/app/models/alchemy/essence_richtext.rb +1 -3
  105. data/app/models/alchemy/essence_select.rb +1 -3
  106. data/app/models/alchemy/essence_text.rb +0 -2
  107. data/app/models/alchemy/folded_page.rb +1 -0
  108. data/app/models/alchemy/language.rb +21 -35
  109. data/app/models/alchemy/language/code.rb +4 -4
  110. data/app/models/alchemy/legacy_page_url.rb +1 -1
  111. data/app/models/alchemy/message.rb +3 -3
  112. data/app/models/alchemy/node.rb +55 -9
  113. data/app/models/alchemy/page.rb +53 -123
  114. data/app/models/alchemy/page/fixed_attributes.rb +3 -2
  115. data/app/models/alchemy/page/page_elements.rb +35 -44
  116. data/app/models/alchemy/page/page_naming.rb +20 -70
  117. data/app/models/alchemy/page/page_natures.rb +7 -34
  118. data/app/models/alchemy/page/page_scopes.rb +23 -29
  119. data/app/models/alchemy/page/url_path.rb +64 -0
  120. data/app/models/alchemy/picture.rb +40 -30
  121. data/app/models/alchemy/picture/preprocessor.rb +26 -0
  122. data/app/models/alchemy/picture/transformations.rb +9 -7
  123. data/app/models/alchemy/picture/url.rb +5 -5
  124. data/app/models/alchemy/site.rb +6 -36
  125. data/app/models/alchemy/site/layout.rb +2 -2
  126. data/app/models/concerns/alchemy/touch_elements.rb +24 -0
  127. data/app/serializers/alchemy/content_serializer.rb +0 -3
  128. data/app/serializers/alchemy/essence_boolean_serializer.rb +3 -3
  129. data/app/serializers/alchemy/essence_date_serializer.rb +3 -3
  130. data/app/serializers/alchemy/essence_file_serializer.rb +4 -2
  131. data/app/serializers/alchemy/essence_html_serializer.rb +3 -3
  132. data/app/serializers/alchemy/essence_link_serializer.rb +3 -3
  133. data/app/serializers/alchemy/essence_picture_serializer.rb +5 -4
  134. data/app/serializers/alchemy/essence_richtext_serializer.rb +3 -3
  135. data/app/serializers/alchemy/essence_select_serializer.rb +3 -3
  136. data/app/serializers/alchemy/essence_text_serializer.rb +5 -4
  137. data/app/serializers/alchemy/node_serializer.rb +14 -0
  138. data/app/serializers/alchemy/page_serializer.rb +2 -1
  139. data/app/serializers/alchemy/page_tree_serializer.rb +11 -14
  140. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -2
  141. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -2
  142. data/app/views/alchemy/admin/attachments/_files_list.html.erb +4 -4
  143. data/app/views/alchemy/admin/contents/create.js.erb +1 -3
  144. data/app/views/alchemy/admin/elements/_element.html.erb +9 -18
  145. data/app/views/alchemy/admin/elements/create.js.erb +1 -1
  146. data/app/views/alchemy/admin/elements/fold.js.erb +1 -1
  147. data/app/views/alchemy/admin/elements/index.html.erb +3 -3
  148. data/app/views/alchemy/admin/essence_files/assign.js.erb +1 -6
  149. data/app/views/alchemy/admin/essence_files/edit.html.erb +1 -1
  150. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +1 -7
  151. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  152. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +7 -7
  153. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -1
  154. data/app/views/alchemy/admin/languages/_form.html.erb +5 -5
  155. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  156. data/app/views/alchemy/admin/languages/edit.html.erb +1 -0
  157. data/app/views/alchemy/admin/languages/index.html.erb +23 -4
  158. data/app/views/alchemy/admin/languages/new.html.erb +1 -0
  159. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -2
  160. data/app/views/alchemy/admin/nodes/_form.html.erb +23 -15
  161. data/app/views/alchemy/admin/nodes/_node.html.erb +5 -19
  162. data/app/views/alchemy/admin/nodes/index.html.erb +3 -18
  163. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +0 -8
  164. data/app/views/alchemy/admin/pages/_form.html.erb +1 -2
  165. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -0
  166. data/app/views/alchemy/admin/pages/_page.html.erb +14 -25
  167. data/app/views/alchemy/admin/pages/_page_infos.html.erb +0 -4
  168. data/app/views/alchemy/admin/pages/_sitemap.html.erb +6 -0
  169. data/app/views/alchemy/admin/pages/edit.html.erb +1 -1
  170. data/app/views/alchemy/admin/pages/info.html.erb +0 -9
  171. data/app/views/alchemy/admin/pages/unlock.js.erb +13 -6
  172. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +0 -2
  173. data/app/views/alchemy/admin/partials/_routes.html.erb +8 -0
  174. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -5
  175. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  176. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -2
  177. data/app/views/alchemy/admin/pictures/index.html.erb +18 -3
  178. data/app/views/alchemy/admin/resources/_resource.html.erb +1 -1
  179. data/app/views/alchemy/admin/resources/_table.html.erb +2 -2
  180. data/app/views/alchemy/admin/sites/_form.html.erb +8 -0
  181. data/app/views/alchemy/admin/sites/edit.html.erb +1 -0
  182. data/app/views/alchemy/admin/sites/index.html.erb +21 -9
  183. data/app/views/alchemy/admin/sites/new.html.erb +1 -0
  184. data/app/views/alchemy/admin/tags/index.html.erb +2 -2
  185. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +10 -12
  186. data/app/views/alchemy/essences/_essence_date_editor.html.erb +11 -8
  187. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -17
  188. data/app/views/alchemy/essences/_essence_html_editor.html.erb +8 -5
  189. data/app/views/alchemy/essences/_essence_link_editor.html.erb +18 -15
  190. data/app/views/alchemy/essences/_essence_node_editor.html.erb +27 -0
  191. data/app/views/alchemy/essences/_essence_node_view.html.erb +1 -0
  192. data/app/views/alchemy/essences/_essence_page_editor.html.erb +14 -11
  193. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +22 -20
  194. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +10 -7
  195. data/app/views/alchemy/essences/_essence_select_editor.html.erb +12 -16
  196. data/app/views/alchemy/essences/_essence_text_editor.html.erb +18 -17
  197. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +6 -11
  198. data/app/views/alchemy/pages/show.rss.builder +3 -2
  199. data/app/views/layouts/alchemy/admin.html.erb +1 -0
  200. data/babel.config.js +12 -0
  201. data/bin/rails +5 -4
  202. data/config/alchemy/config.yml +23 -22
  203. data/config/brakeman.ignore +1 -1
  204. data/config/initializers/assets.rb +2 -1
  205. data/config/initializers/dragonfly.rb +2 -1
  206. data/config/initializers/mime_types.rb +1 -0
  207. data/config/initializers/mini_profiler.rb +3 -2
  208. data/config/initializers/simple_form.rb +6 -6
  209. data/config/locales/alchemy.en.yml +37 -14
  210. data/config/routes.rb +32 -28
  211. data/config/spring.rb +3 -2
  212. data/db/migrate/20200226213334_alchemy_four_point_four.rb +313 -0
  213. data/db/migrate/20200423073425_create_alchemy_essence_nodes.rb +11 -0
  214. data/db/migrate/20200504210159_remove_site_id_from_nodes.rb +28 -0
  215. data/db/migrate/20200505215518_add_language_id_foreign_key_to_alchemy_pages.rb +8 -0
  216. data/db/migrate/20200511113603_add_menu_type_to_alchemy_nodes.rb +27 -0
  217. data/db/migrate/20200514091507_make_page_layoutpage_null_false.rb +6 -0
  218. data/db/migrate/20200519073500_remove_visible_from_alchemy_pages.rb +24 -0
  219. data/lib/alchemy/admin/locale.rb +3 -1
  220. data/lib/alchemy/admin/preview_url.rb +85 -0
  221. data/lib/alchemy/auth_accessors.rb +8 -7
  222. data/lib/alchemy/cache_digests/template_tracker.rb +5 -4
  223. data/lib/alchemy/config.rb +26 -2
  224. data/lib/alchemy/configuration_methods.rb +3 -1
  225. data/lib/alchemy/controller_actions.rb +6 -5
  226. data/lib/alchemy/deprecation.rb +2 -1
  227. data/lib/alchemy/elements_finder.rb +5 -5
  228. data/lib/alchemy/engine.rb +23 -8
  229. data/lib/alchemy/errors.rb +0 -7
  230. data/lib/alchemy/essence.rb +17 -16
  231. data/lib/alchemy/filetypes.rb +5 -5
  232. data/lib/alchemy/forms/builder.rb +4 -4
  233. data/lib/alchemy/hints.rb +1 -1
  234. data/lib/alchemy/i18n.rb +2 -1
  235. data/lib/alchemy/modules.rb +12 -12
  236. data/lib/alchemy/name_conversions.rb +5 -5
  237. data/lib/alchemy/on_page_layout/callbacks_runner.rb +1 -0
  238. data/lib/alchemy/page_layout.rb +15 -12
  239. data/lib/alchemy/paths.rb +1 -1
  240. data/lib/alchemy/permissions.rb +7 -6
  241. data/lib/alchemy/resource.rb +23 -13
  242. data/lib/alchemy/resources_helper.rb +12 -18
  243. data/lib/alchemy/routing_constraints.rb +1 -1
  244. data/lib/alchemy/seeder.rb +42 -14
  245. data/lib/alchemy/shell.rb +13 -10
  246. data/lib/alchemy/taggable.rb +1 -0
  247. data/lib/alchemy/tasks/tidy.rb +4 -3
  248. data/lib/alchemy/test_support/config_stubbing.rb +1 -0
  249. data/lib/alchemy/test_support/essence_shared_examples.rb +72 -72
  250. data/lib/alchemy/test_support/factories.rb +1 -1
  251. data/lib/alchemy/test_support/factories/attachment_factory.rb +5 -5
  252. data/lib/alchemy/test_support/factories/content_factory.rb +6 -6
  253. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +7 -7
  254. data/lib/alchemy/test_support/factories/element_factory.rb +9 -9
  255. data/lib/alchemy/test_support/factories/essence_file_factory.rb +3 -3
  256. data/lib/alchemy/test_support/factories/essence_page_factory.rb +3 -3
  257. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +4 -4
  258. data/lib/alchemy/test_support/factories/essence_text_factory.rb +3 -3
  259. data/lib/alchemy/test_support/factories/language_factory.rb +21 -14
  260. data/lib/alchemy/test_support/factories/node_factory.rb +8 -8
  261. data/lib/alchemy/test_support/factories/page_factory.rb +15 -27
  262. data/lib/alchemy/test_support/factories/picture_factory.rb +5 -5
  263. data/lib/alchemy/test_support/factories/site_factory.rb +7 -6
  264. data/lib/alchemy/test_support/integration_helpers.rb +1 -0
  265. data/lib/alchemy/test_support/shared_contexts.rb +5 -4
  266. data/lib/alchemy/test_support/shared_uploader_examples.rb +4 -3
  267. data/lib/alchemy/tinymce.rb +15 -13
  268. data/lib/alchemy/upgrader.rb +8 -7
  269. data/lib/alchemy/upgrader/five_point_zero.rb +41 -0
  270. data/lib/alchemy/upgrader/tasks/element_views_updater.rb +4 -4
  271. data/lib/alchemy/upgrader/tasks/harden_gutentag_migrations.rb +29 -0
  272. data/lib/alchemy/version.rb +1 -1
  273. data/lib/alchemy_cms.rb +52 -50
  274. data/lib/{rails/generators → generators}/alchemy/base.rb +5 -4
  275. data/lib/{rails/generators → generators}/alchemy/elements/elements_generator.rb +13 -9
  276. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.erb +0 -0
  277. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.haml +0 -0
  278. data/lib/{rails/generators → generators}/alchemy/elements/templates/view.html.slim +0 -0
  279. data/lib/{rails/generators → generators}/alchemy/essence/essence_generator.rb +15 -13
  280. data/lib/generators/alchemy/essence/templates/editor.html.erb +17 -0
  281. data/lib/{rails/generators → generators}/alchemy/essence/templates/view.html.erb +0 -0
  282. data/lib/{rails/generators → generators}/alchemy/install/files/_article.html.erb +0 -0
  283. data/lib/{rails/generators → generators}/alchemy/install/files/_standard.html.erb +0 -0
  284. data/lib/{rails/generators → generators}/alchemy/install/files/alchemy.en.yml +0 -0
  285. data/lib/generators/alchemy/install/files/alchemy_admin.js +1 -0
  286. data/lib/{rails/generators → generators}/alchemy/install/files/all.css +0 -0
  287. data/lib/{rails/generators → generators}/alchemy/install/files/all.js +0 -0
  288. data/lib/{rails/generators → generators}/alchemy/install/files/application.html.erb +0 -0
  289. data/lib/{rails/generators → generators}/alchemy/install/files/article.scss +0 -0
  290. data/lib/generators/alchemy/install/install_generator.rb +110 -0
  291. data/lib/{rails/generators → generators}/alchemy/install/templates/dragonfly.rb.tt +0 -0
  292. data/lib/{rails/generators → generators}/alchemy/install/templates/elements.yml.tt +0 -0
  293. data/lib/generators/alchemy/install/templates/menus.yml.tt +8 -0
  294. data/lib/{rails/generators → generators}/alchemy/install/templates/page_layouts.yml.tt +0 -0
  295. data/lib/{rails/generators → generators}/alchemy/menus/menus_generator.rb +5 -5
  296. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.erb +1 -4
  297. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.haml +1 -4
  298. data/lib/{rails/generators → generators}/alchemy/menus/templates/node.html.slim +1 -4
  299. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.erb +1 -1
  300. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.haml +2 -2
  301. data/lib/{rails/generators → generators}/alchemy/menus/templates/wrapper.html.slim +2 -2
  302. data/lib/{rails/generators → generators}/alchemy/module/module_generator.rb +3 -2
  303. data/lib/{rails/generators → generators}/alchemy/module/templates/ability.rb.tt +0 -0
  304. data/lib/{rails/generators → generators}/alchemy/module/templates/controller.rb.tt +0 -0
  305. data/lib/{rails/generators → generators}/alchemy/module/templates/module_config.rb.tt +0 -0
  306. data/lib/{rails/generators → generators}/alchemy/page_layouts/page_layouts_generator.rb +5 -4
  307. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.erb +0 -0
  308. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.haml +0 -0
  309. data/lib/{rails/generators → generators}/alchemy/page_layouts/templates/layout.html.slim +0 -0
  310. data/lib/{rails/generators → generators}/alchemy/site_layouts/site_layouts_generator.rb +4 -2
  311. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.erb +0 -0
  312. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.haml +0 -0
  313. data/lib/{rails/generators → generators}/alchemy/site_layouts/templates/layout.html.slim +0 -0
  314. data/lib/{rails/generators → generators}/alchemy/views/views_generator.rb +7 -6
  315. data/lib/kaminari/scoped_pagination_url_helper.rb +1 -0
  316. data/lib/tasks/alchemy/db.rake +3 -19
  317. data/lib/tasks/alchemy/install.rake +3 -2
  318. data/lib/tasks/alchemy/tidy.rake +9 -8
  319. data/lib/tasks/alchemy/upgrade.rake +28 -105
  320. data/package.json +45 -0
  321. data/package/admin.js +14 -0
  322. data/package/src/__tests__/i18n.spec.js +70 -0
  323. data/package/src/i18n.js +48 -0
  324. data/package/src/node_tree.js +72 -0
  325. data/package/src/translations.js +32 -0
  326. data/package/src/utils/__tests__/ajax.spec.js +124 -0
  327. data/package/src/utils/__tests__/events.spec.js +38 -0
  328. data/package/src/utils/ajax.js +48 -0
  329. data/package/src/utils/events.js +16 -0
  330. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  331. data/vendor/assets/fonts/fa-regular-400.svg +798 -358
  332. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  333. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  334. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  335. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  336. data/vendor/assets/fonts/fa-solid-900.svg +4933 -1408
  337. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  338. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  339. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  340. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +1 -2
  341. data/vendor/assets/stylesheets/fontawesome/_core.scss +5 -0
  342. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +1 -1
  343. data/vendor/assets/stylesheets/fontawesome/_icons.scss +651 -2
  344. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +0 -1
  345. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +3 -2
  346. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +1 -1
  347. data/vendor/assets/stylesheets/fontawesome/_variables.scss +662 -9
  348. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +2 -2
  349. data/vendor/assets/stylesheets/fontawesome/regular.scss +23 -0
  350. data/vendor/assets/stylesheets/fontawesome/solid.scss +24 -0
  351. metadata +131 -83
  352. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +0 -32
  353. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -29
  354. data/app/helpers/alchemy/essences_helper.rb +0 -119
  355. data/app/models/concerns/alchemy/content_touching.rb +0 -23
  356. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -15
  357. data/app/views/alchemy/admin/contents/_missing.html.erb +0 -17
  358. data/app/views/alchemy/admin/pages/_menu_fields.html.erb +0 -33
  359. data/app/views/alchemy/admin/pages/configure_external.html.erb +0 -32
  360. data/app/views/alchemy/elements/_editor_not_found.html.erb +0 -4
  361. data/app/views/alchemy/navigation/_image_link.html.erb +0 -14
  362. data/app/views/alchemy/navigation/_link.html.erb +0 -19
  363. data/app/views/alchemy/navigation/_renderer.html.erb +0 -29
  364. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +0 -363
  365. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +0 -41
  366. data/db/migrate/20180519204655_add_fixed_to_alchemy_elements.rb +0 -6
  367. data/db/migrate/20191016073858_create_alchemy_essence_pages.rb +0 -8
  368. data/db/migrate/20191029212236_create_alchemy_nodes.rb +0 -24
  369. data/db/migrate/20200226081535_add_site_id_to_alchemy_nodes.rb +0 -15
  370. data/lib/alchemy/ssl_protection.rb +0 -32
  371. data/lib/alchemy/tasks/helpers.rb +0 -81
  372. data/lib/alchemy/test_support/controller_requests.rb +0 -93
  373. data/lib/alchemy/upgrader/four_point_four.rb +0 -52
  374. data/lib/alchemy/upgrader/four_point_one.rb +0 -42
  375. data/lib/alchemy/upgrader/four_point_two.rb +0 -85
  376. data/lib/alchemy/upgrader/tasks/cells_migration.rb +0 -43
  377. data/lib/alchemy/upgrader/tasks/cells_upgrader.rb +0 -148
  378. data/lib/alchemy/upgrader/tasks/element_partial_name_variable_updater.rb +0 -28
  379. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +0 -27
  380. data/lib/alchemy/upgrader/tasks/picture_gallery_migration.rb +0 -65
  381. data/lib/alchemy/upgrader/tasks/picture_gallery_upgrader.rb +0 -210
  382. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +0 -15
  383. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -60
  384. data/lib/tasks/alchemy/convert.rake +0 -95
  385. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +0 -22
  386. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +0 -23
@@ -1,32 +0,0 @@
1
- #= require alchemy/alchemy.translations
2
-
3
- window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
4
-
5
- Alchemy.I18n =
6
-
7
- KEY_SEPARATOR: /\./
8
-
9
- # Translates given string
10
- #
11
- translate: (key, replacement) ->
12
- if !Alchemy.locale?
13
- throw 'Alchemy.locale is not set! Please set Alchemy.locale to a locale string in order to translate something.'
14
- translations = Alchemy.translations[Alchemy.locale]
15
- if translations
16
- if @KEY_SEPARATOR.test(key)
17
- keys = key.split(@KEY_SEPARATOR)
18
- translation = translations[keys[0]][keys[1]] || key
19
- else
20
- translation = translations[key] || key
21
- if replacement
22
- translation.replace(/%\{.+\}/, replacement)
23
- else
24
- translation
25
- else
26
- console.warn "Translations for locale #{Alchemy.locale} not found!"
27
- key
28
-
29
- # Global utility method for translating a given string
30
- #
31
- Alchemy.t = (key, replacement) ->
32
- Alchemy.I18n.translate(key, replacement)
@@ -1,29 +0,0 @@
1
- window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
2
-
3
- # Holds translations for javascripts
4
- #
5
- Alchemy.translations =
6
- en:
7
- allowed_chars: 'of %{count} chars'
8
- cancel: 'Cancel'
9
- cancelled: 'Cancelled'
10
- click_to_edit: 'click to edit'
11
- complete: 'Complete'
12
- element_dirty_notice: 'This element has unsaved changes. Do you really want to fold it?'
13
- help: 'Help'
14
- ok: 'Ok'
15
- page_dirty_notice: 'You have unsaved changes on this page. They will be lost if you continue.'
16
- page_found: 'Page found'
17
- pages_found: 'Pages found'
18
- url_validation_failed: 'The url has no valid format.'
19
- warning: 'Warning!'
20
- 'File is too large': 'File is too large'
21
- 'File is too small': 'File is too small'
22
- 'File type not allowed': 'File type not allowed'
23
- 'Maximum number of files exceeded': 'Maximum number of files exceeded.'
24
- 'Uploaded bytes exceed file size': 'Uploaded bytes exceed file size'
25
- formats:
26
- datetime: "Y-m-d H:i"
27
- date: "Y-m-d"
28
- time: "H:i"
29
- time_24hr: false
@@ -1,119 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Alchemy
4
- # This helper contains methods to render the +essence+ from an +Element+ +Content+.
5
- #
6
- # Essences have two kinds of partials. An +editor+ and a +view+ partial.
7
- #
8
- # They both resist in +'app/views/alchemy/essences'+
9
- #
10
- # The partials are suffixed with the type of part.
11
- #
12
- # == Example:
13
- #
14
- # For an EssenceText
15
- #
16
- # The view partial is:
17
- #
18
- # +_essence_text_view.html.erb+
19
- #
20
- # The editor partial is:
21
- #
22
- # +_essence_text_editor.html.erb+
23
- #
24
- # == Usage:
25
- #
26
- # For front end web development you should mostly use the +render_essence_view_by_name+ helper.
27
- #
28
- # And the +render_essence_editor_by_name+ helper for Alchemy backend views.
29
- #
30
- # @deprecated Use Rails' `render(content)` method directly instead
31
- module EssencesHelper
32
- # Renders the +Essence+ view partial from +Element+ by name.
33
- #
34
- # Pass the name of the +Content+ from +Element+ as second argument.
35
- #
36
- # == Example:
37
- #
38
- # This renders the +Content+ named "intro" from element.
39
- #
40
- # <%= render_essence_view_by_name(element, "intro") %>
41
- #
42
- # @deprecated Use Rails' `render(content)` method directly instead
43
- def render_essence_view_by_name(element, name, options = {}, html_options = {})
44
- if element.blank?
45
- warning('Element is nil') && return
46
- end
47
- content = element.content_by_name(name)
48
- return if content.nil?
49
-
50
- render content, {
51
- content: content,
52
- options: options,
53
- html_options: html_options
54
- }
55
- end
56
- deprecate render_essence_view_by_name: "Use Rails' `render(content)` method directly instead",
57
- deprecator: Alchemy::Deprecation
58
-
59
- # Renders the +Esssence+ partial for given +Content+.
60
- #
61
- # The helper renders the view partial as default.
62
- #
63
- # Pass +:editor+ as second argument to render the editor partial
64
- #
65
- # == Options:
66
- #
67
- # You can pass a options Hash to each type of essence partial as third argument.
68
- #
69
- # This Hash is available as +options+ local variable.
70
- #
71
- # for_view: {}
72
- # for_editor: {}
73
- #
74
- # @deprecated Use Rails' `render(content)` method directly instead
75
- def render_essence(content, part = :view, options = {}, html_options = {})
76
- options = {for_view: {}, for_editor: {}}.update(options)
77
- if content.nil?
78
- return part == :view ? "" : warning('Content is nil', Alchemy.t(:content_not_found))
79
- elsif content.essence.nil?
80
- return part == :view ? "" : warning('Essence is nil', Alchemy.t(:content_essence_not_found))
81
- end
82
- if part == :view
83
- render content, {
84
- content: content,
85
- options: options[:for_view],
86
- html_options: html_options
87
- }
88
- else
89
- render "alchemy/essences/#{content.essence_partial_name}_editor", {
90
- content: content,
91
- options: options,
92
- html_options: html_options
93
- }
94
- end
95
- end
96
- deprecate render_essence: "Use Rails' `render(content)` method directly instead",
97
- deprecator: Alchemy::Deprecation
98
-
99
- # Renders the +Esssence+ view partial for given +Content+.
100
- #
101
- # == Options:
102
- #
103
- # :size => "111x93" # Used by EssencePicture to resize the image to that size. [Default nil]
104
- # :date_format => "Am %d. %m. %Y, um %H:%Mh" # Especially for EssenceDate. See Rubys Date.strftime for date formatting options. [Default nil]
105
- # :show_caption => false # Pass Boolean to show/hide the caption of an EssencePicture. [Default true]
106
- # :disable_link => true # You can surpress the link of an EssencePicture. Default false
107
- #
108
- # @deprecated Use Rails' `render(content)` method directly instead
109
- def render_essence_view(content, options = {}, html_options = {})
110
- render content, {
111
- content: content,
112
- options: options,
113
- html_options: html_options
114
- }
115
- end
116
- deprecate render_essence_view: "Use Rails' `render(content)` method directly instead",
117
- deprecator: Alchemy::Deprecation
118
- end
119
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Alchemy
4
- module ContentTouching
5
- def self.included(base)
6
- base.after_update(:touch_contents)
7
- end
8
-
9
- private
10
-
11
- # If the model has a +contents+ association,
12
- # it updates all their timestamps.
13
- #
14
- # CAUTION: Only use on bottom to top releations,
15
- # e.g. +Alchemy::Picture+ or +Alchemy::Attachment+
16
- # not on top to bottom ones like +Alchemy::Element+.
17
- #
18
- def touch_contents
19
- return unless respond_to?(:contents)
20
- contents.update_all(updated_at: Time.current)
21
- end
22
- end
23
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Alchemy
4
- class LegacyElementSerializer < ActiveModel::Serializer
5
- attributes :id,
6
- :name,
7
- :position,
8
- :page_id,
9
- :tag_list,
10
- :created_at,
11
- :updated_at
12
-
13
- has_many :contents
14
- end
15
- end
@@ -1,17 +0,0 @@
1
- <div class="content_editor missing" data-element-<%= element.id %>-missing-content="<%= name %>">
2
- <label><%= Alchemy::Content.translated_label_for(name, element.name) %></label>
3
- <%= render_message :warning do %>
4
- <p><%= Alchemy.t(:content_not_found) %></p>
5
- <%= link_to Alchemy.t(:create),
6
- alchemy.admin_contents_path(
7
- content: {
8
- element_id: element.id,
9
- name: name
10
- },
11
- was_missing: true,
12
- options: options
13
- ),
14
- 'data-create-missing-content' => true,
15
- class: 'small button' %>
16
- <% end %>
17
- </div>
@@ -1,33 +0,0 @@
1
- <% if @page.menus.any? %>
2
- <label class="checkbox">
3
- <input type="checkbox" disabled checked>
4
- <%= Alchemy.t(:attached_to) %>
5
- </label>
6
- <% @page.menus.each do |menu| %>
7
- <span class="page-menu-name label">
8
- <%= menu.name %>
9
- </span>
10
- <% end %>
11
- <% elsif Alchemy::Node.roots.any? %>
12
- <%= page_status_checkbox(@page, :visible) %>
13
- <%= f.input :menu_id, collection: Alchemy::Node.roots.map { |n| [n.name, n.id] },
14
- prompt: Alchemy.t('Please choose a menu'),
15
- input_html: { class: 'alchemy_selectbox' },
16
- wrapper_html: { style: @page.visible? ? 'display: block' : 'display: none' },
17
- label: false %>
18
- <script>
19
- (function() {
20
- var $wrapper = $('.input.page_menu_id')
21
- $('#page_visible').click(function() {
22
- if ($(this).is(':checked')) {
23
- $wrapper.show()
24
- } else {
25
- $wrapper.find('select').val('')
26
- $wrapper.hide()
27
- }
28
- })
29
- })()
30
- </script>
31
- <% else %>
32
- <%= page_status_checkbox(@page, :visible) %>
33
- <% end %>
@@ -1,32 +0,0 @@
1
- <%= alchemy_form_for [:admin, @page] do |f| %>
2
- <%= f.input :page_layout,
3
- collection: @page_layouts,
4
- label: Alchemy.t(:page_type),
5
- include_blank: Alchemy.t('Please choose'),
6
- input_html: {class: 'alchemy_selectbox'} %>
7
- <div class="input check_boxes">
8
- <label class="control-label"><%= Alchemy.t(:page_status) %></label>
9
- <div class="control_group">
10
- <label class="checkbox">
11
- <%= f.check_box :visible %>
12
- <%= f.object.class.human_attribute_name :visible %>
13
- </label>
14
- <% if configuration(:sitemap)['show_flag'] %>
15
- <label class="checkbox">
16
- <%= f.check_box :sitemap %>
17
- <%= f.object.class.human_attribute_name :sitemap %>
18
- </label>
19
- <% end %>
20
- </div>
21
- </div>
22
- <%= f.input :name, autofocus: true %>
23
- <%= f.input :urlname, as: 'string' %>
24
- <%= f.input :title %>
25
- <% if @page.taggable? %>
26
- <div class="input string">
27
- <%= f.label :tag_list %>
28
- <%= render 'alchemy/admin/partials/autocomplete_tag_list', f: f %>
29
- </div>
30
- <% end %>
31
- <%= f.submit Alchemy.t(:save) %>
32
- <% end %>
@@ -1,4 +0,0 @@
1
- <%= render_message :warning do %>
2
- <h2><%= Alchemy.t(:element_editor_not_found) %>:</h2>
3
- <p><%== local_assigns[:error] %></p>
4
- <% end %>
@@ -1,14 +0,0 @@
1
- <%= link_to(
2
- "",
3
- {
4
- :urlname => navigation_image_link.urlname
5
- }.merge(
6
- {
7
- :controller => 'pages',
8
- :action => 'show'
9
- }
10
- ),
11
- {
12
- :class => page_active?(navigation_image_link) ? "active #{navigation_image_link.urlname}" : navigation_image_link.urlname
13
- }
14
- )%>
@@ -1,19 +0,0 @@
1
- <% if page.definition['redirects_to_external'] %>
2
- <%= link_to(
3
- h(page.name),
4
- page.external_urlname,
5
- title: options[:show_title] == true ? page.title : nil,
6
- target: configuration(:open_external_links_in_new_tab) ? '_blank' : nil,
7
- class: external_page_css_class(page)
8
- ) %>
9
- <% else %>
10
- <%= link_to(
11
- h(page.name),
12
- @preview_mode ? 'javascript: void(0)' : show_alchemy_page_path(page),
13
- {
14
- class: (page_active?(page) ? 'active' : nil),
15
- title: (options[:show_title] ? page.title : nil),
16
- data: {'page-id' => page.id}
17
- }
18
- ) %>
19
- <% end %>
@@ -1,29 +0,0 @@
1
- <% if pages.present? %>
2
- <%= content_tag(
3
- 'ul',
4
- html_options.reverse_merge(class: "navigation level_#{pages.first.level - 1}")
5
- ) do %>
6
- <% pages.each do |page| %>
7
- <% position = 'first' if page == pages.first %>
8
- <% position = 'last' if page == pages.last %>
9
- <%= content_tag(
10
- 'li',
11
- :class => [page.slug, position, page_active?(page) ? 'active' : nil].compact.join(' ')
12
- ) do %>
13
- <%= render options[:navigation_link_partial], :page => page, :options => options %>
14
- <% options[:from_page] = page %>
15
- <% if options[:reverse_children] %>
16
- <% options[:reverse] = true %>
17
- <% end %>
18
- <% if options[:show_nonactive] %>
19
- <%= render_navigation(options) if options[:submenu] %>
20
- <% else %>
21
- <%= render_navigation(options) if (options[:submenu] && page_active?(page)) || options[:all_sub_menues] %>
22
- <% end %>
23
- <% end %>
24
- <% if options[:spacer].present? && position != 'last' %>
25
- <%= content_tag :li, options[:spacer].html_safe, class: 'navigation_spacer' %>
26
- <% end %>
27
- <% end %>
28
- <% end %>
29
- <% end %>
@@ -1,363 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class AlchemyFourPointZero < ActiveRecord::Migration[5.0]
4
- def up
5
- unless table_exists?(:alchemy_attachments)
6
- create_table :alchemy_attachments do |t|
7
- t.string "name"
8
- t.string "file_name"
9
- t.string "file_mime_type"
10
- t.integer "file_size"
11
- t.integer "creator_id"
12
- t.integer "updater_id"
13
- t.datetime "created_at", null: false, precision: 6
14
- t.datetime "updated_at", null: false, precision: 6
15
- t.text "cached_tag_list"
16
- t.string "file_uid"
17
- t.index ["file_uid"], name: "index_alchemy_attachments_on_file_uid"
18
- end
19
- end
20
-
21
- unless table_exists?(:alchemy_contents)
22
- create_table :alchemy_contents do |t|
23
- t.string "name"
24
- t.string "essence_type", null: false
25
- t.integer "essence_id", null: false
26
- t.integer "element_id", null: false
27
- t.integer "position"
28
- t.datetime "created_at", null: false, precision: 6
29
- t.datetime "updated_at", null: false, precision: 6
30
- t.integer "creator_id"
31
- t.integer "updater_id"
32
- t.index ["element_id", "position"], name: "index_contents_on_element_id_and_position"
33
- t.index ["essence_id", "essence_type"], name: "index_alchemy_contents_on_essence_id_and_essence_type", unique: true
34
- end
35
- end
36
-
37
- unless table_exists?(:alchemy_elements)
38
- create_table :alchemy_elements do |t|
39
- t.string "name"
40
- t.integer "position"
41
- t.integer "page_id", null: false
42
- t.boolean "public", default: true
43
- t.boolean "folded", default: false
44
- t.boolean "unique", default: false
45
- t.datetime "created_at", null: false, precision: 6
46
- t.datetime "updated_at", null: false, precision: 6
47
- t.integer "creator_id"
48
- t.integer "updater_id"
49
- t.text "cached_tag_list"
50
- t.integer "parent_element_id"
51
- t.index ["page_id", "parent_element_id"], name: "index_alchemy_elements_on_page_id_and_parent_element_id"
52
- t.index ["page_id", "position"], name: "index_elements_on_page_id_and_position"
53
- end
54
- end
55
-
56
- unless table_exists?(:alchemy_elements_alchemy_pages)
57
- create_table :alchemy_elements_alchemy_pages, id: false do |t|
58
- t.integer "element_id"
59
- t.integer "page_id"
60
- end
61
- end
62
-
63
- unless table_exists?(:alchemy_essence_booleans)
64
- create_table :alchemy_essence_booleans do |t|
65
- t.boolean "value"
66
- t.datetime "created_at", null: false, precision: 6
67
- t.datetime "updated_at", null: false, precision: 6
68
- t.integer "creator_id"
69
- t.integer "updater_id"
70
- t.index ["value"], name: "index_alchemy_essence_booleans_on_value"
71
- end
72
- end
73
-
74
- unless table_exists?(:alchemy_essence_dates)
75
- create_table :alchemy_essence_dates do |t|
76
- t.datetime "date"
77
- t.integer "creator_id"
78
- t.integer "updater_id"
79
- t.datetime "created_at", null: false, precision: 6
80
- t.datetime "updated_at", null: false, precision: 6
81
- end
82
- end
83
-
84
- unless table_exists?(:alchemy_essence_files)
85
- create_table :alchemy_essence_files do |t|
86
- t.integer "attachment_id"
87
- t.string "title"
88
- t.string "css_class"
89
- t.integer "creator_id"
90
- t.integer "updater_id"
91
- t.datetime "created_at", null: false, precision: 6
92
- t.datetime "updated_at", null: false, precision: 6
93
- t.string "link_text"
94
- t.index ["attachment_id"], name: "index_alchemy_essence_files_on_attachment_id"
95
- end
96
- end
97
-
98
- unless table_exists?(:alchemy_essence_htmls)
99
- create_table :alchemy_essence_htmls do |t|
100
- t.text "source"
101
- t.integer "creator_id"
102
- t.integer "updater_id"
103
- t.datetime "created_at", null: false, precision: 6
104
- t.datetime "updated_at", null: false, precision: 6
105
- end
106
- end
107
-
108
- unless table_exists?(:alchemy_essence_links)
109
- create_table :alchemy_essence_links do |t|
110
- t.string "link"
111
- t.string "link_title"
112
- t.string "link_target"
113
- t.string "link_class_name"
114
- t.datetime "created_at", null: false, precision: 6
115
- t.datetime "updated_at", null: false, precision: 6
116
- t.integer "creator_id"
117
- t.integer "updater_id"
118
- end
119
- end
120
-
121
- unless table_exists?(:alchemy_essence_pictures)
122
- create_table :alchemy_essence_pictures do |t|
123
- t.integer "picture_id"
124
- t.string "caption"
125
- t.string "title"
126
- t.string "alt_tag"
127
- t.string "link"
128
- t.string "link_class_name"
129
- t.string "link_title"
130
- t.string "css_class"
131
- t.string "link_target"
132
- t.integer "creator_id"
133
- t.integer "updater_id"
134
- t.datetime "created_at", null: false, precision: 6
135
- t.datetime "updated_at", null: false, precision: 6
136
- t.string "crop_from"
137
- t.string "crop_size"
138
- t.string "render_size"
139
- t.index ["picture_id"], name: "index_alchemy_essence_pictures_on_picture_id"
140
- end
141
- end
142
-
143
- unless table_exists?(:alchemy_essence_richtexts)
144
- create_table :alchemy_essence_richtexts do |t|
145
- t.text "body"
146
- t.text "stripped_body"
147
- t.boolean "public"
148
- t.integer "creator_id"
149
- t.integer "updater_id"
150
- t.datetime "created_at", null: false, precision: 6
151
- t.datetime "updated_at", null: false, precision: 6
152
- end
153
- end
154
-
155
- unless table_exists?(:alchemy_essence_selects)
156
- create_table :alchemy_essence_selects do |t|
157
- t.string "value"
158
- t.datetime "created_at", null: false, precision: 6
159
- t.datetime "updated_at", null: false, precision: 6
160
- t.integer "creator_id"
161
- t.integer "updater_id"
162
- t.index ["value"], name: "index_alchemy_essence_selects_on_value"
163
- end
164
- end
165
-
166
- unless table_exists?(:alchemy_essence_texts)
167
- create_table :alchemy_essence_texts do |t|
168
- t.text "body"
169
- t.string "link"
170
- t.string "link_title"
171
- t.string "link_class_name"
172
- t.boolean "public", default: false
173
- t.string "link_target"
174
- t.integer "creator_id"
175
- t.integer "updater_id"
176
- t.datetime "created_at", null: false, precision: 6
177
- t.datetime "updated_at", null: false, precision: 6
178
- end
179
- end
180
-
181
- unless table_exists?(:alchemy_folded_pages)
182
- create_table :alchemy_folded_pages do |t|
183
- t.integer "page_id", null: false
184
- t.integer "user_id", null: false
185
- t.boolean "folded", default: false
186
- t.index ["page_id", "user_id"], name: "index_alchemy_folded_pages_on_page_id_and_user_id", unique: true
187
- end
188
- end
189
-
190
- unless table_exists?(:alchemy_languages)
191
- create_table :alchemy_languages do |t|
192
- t.string "name"
193
- t.string "language_code"
194
- t.string "frontpage_name"
195
- t.string "page_layout", default: "intro"
196
- t.boolean "public", default: false
197
- t.datetime "created_at", null: false, precision: 6
198
- t.datetime "updated_at", null: false, precision: 6
199
- t.integer "creator_id"
200
- t.integer "updater_id"
201
- t.boolean "default", default: false
202
- t.string "country_code", default: "", null: false
203
- t.integer "site_id", null: false
204
- t.string "locale"
205
- t.index ["language_code", "country_code"], name: "index_alchemy_languages_on_language_code_and_country_code"
206
- t.index ["language_code"], name: "index_alchemy_languages_on_language_code"
207
- t.index ["site_id"], name: "index_alchemy_languages_on_site_id"
208
- end
209
- end
210
-
211
- unless table_exists?(:alchemy_legacy_page_urls)
212
- create_table :alchemy_legacy_page_urls do |t|
213
- t.string "urlname", null: false
214
- t.integer "page_id", null: false
215
- t.datetime "created_at", null: false, precision: 6
216
- t.datetime "updated_at", null: false, precision: 6
217
- t.index ["page_id"], name: "index_alchemy_legacy_page_urls_on_page_id"
218
- t.index ["urlname"], name: "index_alchemy_legacy_page_urls_on_urlname"
219
- end
220
- end
221
-
222
- unless table_exists?(:alchemy_pages)
223
- create_table :alchemy_pages do |t|
224
- t.string "name"
225
- t.string "urlname"
226
- t.string "title"
227
- t.string "language_code"
228
- t.boolean "language_root"
229
- t.string "page_layout"
230
- t.text "meta_keywords"
231
- t.text "meta_description"
232
- t.integer "lft"
233
- t.integer "rgt"
234
- t.integer "parent_id"
235
- t.integer "depth"
236
- t.boolean "visible", default: false
237
- t.integer "locked_by"
238
- t.boolean "restricted", default: false
239
- t.boolean "robot_index", default: true
240
- t.boolean "robot_follow", default: true
241
- t.boolean "sitemap", default: true
242
- t.boolean "layoutpage", default: false
243
- t.datetime "created_at", null: false, precision: 6
244
- t.datetime "updated_at", null: false, precision: 6
245
- t.integer "creator_id"
246
- t.integer "updater_id"
247
- t.integer "language_id"
248
- t.text "cached_tag_list"
249
- t.datetime "published_at"
250
- t.datetime "public_on"
251
- t.datetime "public_until"
252
- t.datetime "locked_at"
253
- t.index ["language_id"], name: "index_pages_on_language_id"
254
- t.index ["locked_at", "locked_by"], name: "index_alchemy_pages_on_locked_at_and_locked_by"
255
- t.index ["parent_id", "lft"], name: "index_pages_on_parent_id_and_lft"
256
- t.index ["public_on", "public_until"], name: "index_alchemy_pages_on_public_on_and_public_until"
257
- t.index ["rgt"], name: "index_alchemy_pages_on_rgt"
258
- t.index ["urlname"], name: "index_pages_on_urlname"
259
- end
260
- end
261
-
262
- unless table_exists?(:alchemy_pictures)
263
- create_table :alchemy_pictures do |t|
264
- t.string "name"
265
- t.string "image_file_name"
266
- t.integer "image_file_width"
267
- t.integer "image_file_height"
268
- t.datetime "created_at", null: false, precision: 6
269
- t.datetime "updated_at", null: false, precision: 6
270
- t.integer "creator_id"
271
- t.integer "updater_id"
272
- t.string "upload_hash"
273
- t.text "cached_tag_list"
274
- t.string "image_file_uid"
275
- t.integer "image_file_size"
276
- t.string "image_file_format"
277
- end
278
- end
279
-
280
- unless table_exists?(:alchemy_sites)
281
- create_table :alchemy_sites do |t|
282
- t.string "host"
283
- t.string "name"
284
- t.datetime "created_at", null: false, precision: 6
285
- t.datetime "updated_at", null: false, precision: 6
286
- t.boolean "public", default: false
287
- t.text "aliases"
288
- t.boolean "redirect_to_primary_host"
289
- t.index ["host", "public"], name: "alchemy_sites_public_hosts_idx"
290
- t.index ["host"], name: "index_alchemy_sites_on_host"
291
- end
292
- end
293
-
294
- unless table_exists?(:taggings)
295
- create_table :taggings do |t|
296
- t.integer "tag_id"
297
- t.string "taggable_type"
298
- t.integer "taggable_id"
299
- t.string "tagger_type"
300
- t.integer "tagger_id"
301
- t.string "context", limit: 128
302
- t.datetime "created_at", precision: 6
303
- t.index ["context"], name: "index_taggings_on_context"
304
- t.index ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true
305
- t.index ["tag_id"], name: "index_taggings_on_tag_id"
306
- t.index ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context"
307
- t.index ["taggable_id", "taggable_type", "tagger_id", "context"], name: "taggings_idy"
308
- t.index ["taggable_id"], name: "index_taggings_on_taggable_id"
309
- t.index ["taggable_type"], name: "index_taggings_on_taggable_type"
310
- t.index ["tagger_id", "tagger_type"], name: "index_taggings_on_tagger_id_and_tagger_type"
311
- t.index ["tagger_id"], name: "index_taggings_on_tagger_id"
312
- end
313
- end
314
-
315
- unless table_exists?(:tags)
316
- create_table :tags do |t|
317
- t.string "name"
318
- t.integer "taggings_count", default: 0
319
- t.index ["name"], name: "index_tags_on_name", unique: true
320
- end
321
- end
322
-
323
- unless foreign_key_exists?(:alchemy_contents, column: :element_id)
324
- add_foreign_key :alchemy_contents, :alchemy_elements,
325
- column: :element_id,
326
- on_update: :cascade,
327
- on_delete: :cascade,
328
- name: :alchemy_contents_element_id_fkey
329
- end
330
-
331
- unless foreign_key_exists?(:alchemy_elements, column: :page_id)
332
- add_foreign_key :alchemy_elements, :alchemy_pages,
333
- column: :page_id,
334
- on_update: :cascade,
335
- on_delete: :cascade,
336
- name: :alchemy_elements_page_id_fkey
337
- end
338
- end
339
-
340
- def down
341
- drop_table(:alchemy_attachments) if table_exists?(:alchemy_attachments)
342
- drop_table(:alchemy_contents) if table_exists?(:alchemy_contents)
343
- drop_table(:alchemy_elements) if table_exists?(:alchemy_elements)
344
- drop_table(:alchemy_elements_alchemy_pages) if table_exists?(:alchemy_elements_alchemy_pages)
345
- drop_table(:alchemy_essence_booleans) if table_exists?(:alchemy_essence_booleans)
346
- drop_table(:alchemy_essence_dates) if table_exists?(:alchemy_essence_dates)
347
- drop_table(:alchemy_essence_files) if table_exists?(:alchemy_essence_files)
348
- drop_table(:alchemy_essence_htmls) if table_exists?(:alchemy_essence_htmls)
349
- drop_table(:alchemy_essence_links) if table_exists?(:alchemy_essence_links)
350
- drop_table(:alchemy_essence_pictures) if table_exists?(:alchemy_essence_pictures)
351
- drop_table(:alchemy_essence_richtexts) if table_exists?(:alchemy_essence_richtexts)
352
- drop_table(:alchemy_essence_selects) if table_exists?(:alchemy_essence_selects)
353
- drop_table(:alchemy_essence_texts) if table_exists?(:alchemy_essence_texts)
354
- drop_table(:alchemy_folded_pages) if table_exists?(:alchemy_folded_pages)
355
- drop_table(:alchemy_languages) if table_exists?(:alchemy_languages)
356
- drop_table(:alchemy_legacy_page_urls) if table_exists?(:alchemy_legacy_page_urls)
357
- drop_table(:alchemy_pages) if table_exists?(:alchemy_pages)
358
- drop_table(:alchemy_pictures) if table_exists?(:alchemy_pictures)
359
- drop_table(:alchemy_sites) if table_exists?(:alchemy_sites)
360
- drop_table(:taggings) if table_exists?(:taggings)
361
- drop_table(:tags) if table_exists?(:tags)
362
- end
363
- end