alchemy_cms 4.0.6 → 4.1.0.beta

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 (340) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -0
  3. data/.gitignore +1 -0
  4. data/.localeapp/config.rb +8 -0
  5. data/.rubocop.yml +26 -13
  6. data/.travis.yml +12 -14
  7. data/CHANGELOG.md +5 -24
  8. data/Gemfile +10 -7
  9. data/README.md +16 -14
  10. data/Rakefile +1 -1
  11. data/alchemy_cms.gemspec +6 -7
  12. data/app/assets/images/alchemy/alchemy-logo.png +0 -0
  13. data/app/assets/images/alchemy/alchemy-logo.svg +1 -70
  14. data/app/assets/images/alchemy/favicon.ico +0 -0
  15. data/app/assets/images/alchemy/icon.svg +1 -14
  16. data/app/assets/javascripts/alchemy/admin.js +0 -7
  17. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +2 -2
  18. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +1 -1
  20. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +1 -0
  21. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +19 -6
  22. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +2 -7
  23. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +36 -26
  24. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +6 -15
  25. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +1 -1
  26. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +8 -11
  27. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +4 -1
  28. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +1 -1
  29. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +5 -14
  30. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +54 -75
  31. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +4 -13
  32. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +1 -0
  33. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +12 -6
  34. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +0 -158
  35. data/app/assets/stylesheets/alchemy/_defaults.scss +0 -2
  36. data/app/assets/stylesheets/alchemy/_extends.scss +13 -18
  37. data/app/assets/stylesheets/alchemy/_mixins.scss +72 -46
  38. data/app/assets/stylesheets/alchemy/_variables.scss +128 -59
  39. data/app/assets/stylesheets/alchemy/admin.scss +7 -1
  40. data/app/assets/stylesheets/alchemy/archive.scss +23 -27
  41. data/app/assets/stylesheets/alchemy/base.scss +5 -355
  42. data/app/assets/stylesheets/alchemy/buttons.scss +23 -60
  43. data/app/assets/stylesheets/alchemy/clipboard.scss +26 -0
  44. data/app/assets/stylesheets/alchemy/dashboard.scss +7 -40
  45. data/app/assets/stylesheets/alchemy/dialogs.scss +23 -36
  46. data/app/assets/stylesheets/alchemy/elements.scss +80 -156
  47. data/app/assets/stylesheets/alchemy/errors.scss +2 -2
  48. data/app/assets/stylesheets/alchemy/flash.scss +19 -10
  49. data/app/assets/stylesheets/alchemy/fonts.scss +13 -0
  50. data/app/assets/stylesheets/alchemy/forms.scss +6 -1
  51. data/app/assets/stylesheets/alchemy/frame.scss +24 -65
  52. data/app/assets/stylesheets/alchemy/hints.scss +2 -2
  53. data/app/assets/stylesheets/alchemy/icons.scss +3 -337
  54. data/app/assets/stylesheets/alchemy/image_library.scss +9 -10
  55. data/app/assets/stylesheets/alchemy/jquery-ui.scss +21 -839
  56. data/app/assets/stylesheets/alchemy/jquery.datetimepicker.scss +32 -57
  57. data/app/assets/stylesheets/alchemy/lists.scss +4 -8
  58. data/app/assets/stylesheets/alchemy/menubar.scss +26 -29
  59. data/app/assets/stylesheets/alchemy/navigation.scss +23 -25
  60. data/app/assets/stylesheets/alchemy/notices.scss +25 -25
  61. data/app/assets/stylesheets/alchemy/pagination.scss +12 -7
  62. data/app/assets/stylesheets/alchemy/preview_window.scss +20 -0
  63. data/app/assets/stylesheets/alchemy/resource_info.scss +1 -1
  64. data/app/assets/stylesheets/alchemy/search.scss +19 -15
  65. data/app/assets/stylesheets/alchemy/selects.scss +63 -32
  66. data/app/assets/stylesheets/alchemy/sitemap.scss +70 -148
  67. data/app/assets/stylesheets/alchemy/tables.scss +16 -59
  68. data/app/assets/stylesheets/alchemy/toolbar.scss +9 -36
  69. data/app/assets/stylesheets/alchemy/trash.scss +8 -0
  70. data/app/assets/stylesheets/alchemy/upload.scss +5 -6
  71. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +1 -0
  72. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +78 -43
  73. data/app/controllers/alchemy/admin/attachments_controller.rb +6 -6
  74. data/app/controllers/alchemy/admin/base_controller.rb +9 -9
  75. data/app/controllers/alchemy/admin/contents_controller.rb +0 -17
  76. data/app/controllers/alchemy/admin/elements_controller.rb +1 -4
  77. data/app/controllers/alchemy/admin/essence_files_controller.rb +1 -3
  78. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +1 -3
  79. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  80. data/app/controllers/alchemy/admin/pictures_controller.rb +5 -5
  81. data/app/controllers/alchemy/admin/resources_controller.rb +10 -10
  82. data/app/controllers/alchemy/admin/tags_controller.rb +7 -7
  83. data/app/controllers/alchemy/api/contents_controller.rb +6 -1
  84. data/app/controllers/alchemy/api/elements_controller.rb +5 -1
  85. data/app/controllers/alchemy/api/pages_controller.rb +6 -1
  86. data/app/controllers/alchemy/base_controller.rb +5 -3
  87. data/app/controllers/alchemy/pages_controller.rb +1 -1
  88. data/app/helpers/alchemy/admin/base_helper.rb +14 -15
  89. data/app/helpers/alchemy/admin/contents_helper.rb +1 -2
  90. data/app/helpers/alchemy/admin/elements_helper.rb +7 -6
  91. data/app/helpers/alchemy/admin/tags_helper.rb +3 -4
  92. data/app/helpers/alchemy/base_helper.rb +35 -5
  93. data/app/helpers/alchemy/elements_helper.rb +2 -2
  94. data/app/helpers/alchemy/pages_helper.rb +4 -2
  95. data/app/models/alchemy/attachment.rb +14 -23
  96. data/app/models/alchemy/base_record.rb +13 -0
  97. data/app/models/alchemy/cell.rb +1 -1
  98. data/app/models/alchemy/content.rb +1 -2
  99. data/app/models/alchemy/content/factory.rb +1 -1
  100. data/app/models/alchemy/element.rb +10 -12
  101. data/app/models/alchemy/essence_boolean.rb +1 -1
  102. data/app/models/alchemy/essence_date.rb +2 -2
  103. data/app/models/alchemy/essence_file.rb +1 -1
  104. data/app/models/alchemy/essence_html.rb +1 -1
  105. data/app/models/alchemy/essence_link.rb +1 -1
  106. data/app/models/alchemy/essence_picture.rb +1 -1
  107. data/app/models/alchemy/essence_richtext.rb +1 -1
  108. data/app/models/alchemy/essence_select.rb +1 -1
  109. data/app/models/alchemy/essence_text.rb +1 -1
  110. data/app/models/alchemy/folded_page.rb +1 -1
  111. data/app/models/alchemy/language.rb +21 -5
  112. data/app/models/alchemy/page.rb +17 -5
  113. data/app/models/alchemy/page/page_elements.rb +14 -2
  114. data/app/models/alchemy/page/page_naming.rb +17 -4
  115. data/app/models/alchemy/picture.rb +4 -7
  116. data/app/models/alchemy/site.rb +3 -3
  117. data/app/models/alchemy/tag.rb +3 -3
  118. data/app/models/concerns/alchemy/content_touching.rb +23 -0
  119. data/app/serializers/alchemy/element_serializer.rb +2 -0
  120. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +1 -1
  121. data/app/views/alchemy/admin/attachments/_attachment.html.erb +11 -21
  122. data/app/views/alchemy/admin/attachments/_files_list.html.erb +26 -29
  123. data/app/views/alchemy/admin/attachments/_filter_bar.html.erb +2 -3
  124. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +3 -4
  125. data/app/views/alchemy/admin/attachments/_replace_button.html.erb +2 -3
  126. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +3 -3
  127. data/app/views/alchemy/admin/attachments/destroy.js.erb +1 -1
  128. data/app/views/alchemy/admin/attachments/edit.html.erb +2 -2
  129. data/app/views/alchemy/admin/attachments/index.html.erb +3 -2
  130. data/app/views/alchemy/admin/attachments/show.html.erb +7 -8
  131. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  132. data/app/views/alchemy/admin/clipboard/index.html.erb +23 -7
  133. data/app/views/alchemy/admin/clipboard/insert.js.erb +1 -1
  134. data/app/views/alchemy/admin/clipboard/remove.js.erb +2 -2
  135. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  136. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +9 -6
  137. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +6 -4
  138. data/app/views/alchemy/admin/dashboard/_sites.html.erb +4 -2
  139. data/app/views/alchemy/admin/dashboard/_users.html.erb +6 -4
  140. data/app/views/alchemy/admin/dashboard/index.html.erb +3 -3
  141. data/app/views/alchemy/admin/dashboard/info.html.erb +6 -7
  142. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  143. data/app/views/alchemy/admin/elements/_element.html.erb +1 -1
  144. data/app/views/alchemy/admin/elements/_element_header.html.erb +14 -14
  145. data/app/views/alchemy/admin/elements/_element_toolbar.html.erb +3 -3
  146. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +2 -3
  147. data/app/views/alchemy/admin/elements/index.html.erb +2 -4
  148. data/app/views/alchemy/admin/elements/new.html.erb +1 -2
  149. data/app/views/alchemy/admin/elements/publish.js.erb +5 -5
  150. data/app/views/alchemy/admin/languages/_language.html.erb +4 -9
  151. data/app/views/alchemy/admin/languages/_table.html.erb +1 -1
  152. data/app/views/alchemy/admin/languages/index.html.erb +1 -1
  153. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +5 -5
  154. data/app/views/alchemy/admin/layoutpages/index.html.erb +5 -4
  155. data/app/views/alchemy/admin/leave.html.erb +1 -1
  156. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +1 -1
  157. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
  158. data/app/views/alchemy/admin/pages/_form.html.erb +1 -1
  159. data/app/views/alchemy/admin/pages/_locked_page.html.erb +1 -1
  160. data/app/views/alchemy/admin/pages/_page.html.erb +31 -23
  161. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +5 -5
  162. data/app/views/alchemy/admin/pages/_page_infos.html.erb +3 -3
  163. data/app/views/alchemy/admin/pages/_publication_fields.html.erb +1 -1
  164. data/app/views/alchemy/admin/pages/edit.html.erb +22 -21
  165. data/app/views/alchemy/admin/pages/index.html.erb +5 -21
  166. data/app/views/alchemy/admin/pages/info.html.erb +5 -5
  167. data/app/views/alchemy/admin/pages/sort.html.erb +1 -1
  168. data/app/views/alchemy/admin/pages/unlock.js.erb +2 -4
  169. data/app/views/alchemy/admin/partials/_flash.html.erb +1 -1
  170. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +7 -3
  171. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -2
  172. data/app/views/alchemy/admin/partials/_search_form.html.erb +3 -3
  173. data/app/views/alchemy/admin/pictures/_archive.html.erb +19 -17
  174. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  175. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +13 -13
  176. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +2 -3
  177. data/app/views/alchemy/admin/pictures/_form.html.erb +3 -3
  178. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +2 -3
  179. data/app/views/alchemy/admin/pictures/_picture.html.erb +7 -7
  180. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +3 -3
  181. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +6 -7
  182. data/app/views/alchemy/admin/pictures/index.html.erb +12 -12
  183. data/app/views/alchemy/admin/pictures/index.js.erb +0 -1
  184. data/app/views/alchemy/admin/pictures/show.html.erb +9 -9
  185. data/app/views/alchemy/admin/resources/_filter_bar.html.erb +2 -3
  186. data/app/views/alchemy/admin/resources/_form.html.erb +10 -2
  187. data/app/views/alchemy/admin/resources/_resource.html.erb +9 -14
  188. data/app/views/alchemy/admin/resources/_table.html.erb +1 -1
  189. data/app/views/alchemy/admin/resources/_tag_list.html.erb +4 -4
  190. data/app/views/alchemy/admin/resources/index.html.erb +2 -3
  191. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  192. data/app/views/alchemy/admin/tags/_tag.html.erb +7 -11
  193. data/app/views/alchemy/admin/tags/index.html.erb +4 -4
  194. data/app/views/alchemy/admin/trash/index.html.erb +2 -3
  195. data/app/views/alchemy/admin/uploader/_button.html.erb +1 -2
  196. data/app/views/alchemy/base/500.html.erb +1 -1
  197. data/app/views/alchemy/base/permission_denied.js.erb +1 -1
  198. data/app/views/alchemy/base/redirect.js.erb +1 -2
  199. data/app/views/alchemy/elements/_editor_not_found.html.erb +2 -3
  200. data/app/views/alchemy/essences/_essence_date_editor.html.erb +1 -1
  201. data/app/views/alchemy/essences/_essence_file_editor.html.erb +7 -11
  202. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +9 -7
  203. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +1 -1
  204. data/app/views/alchemy/pages/_meta_data.html.erb +1 -1
  205. data/app/views/kaminari/alchemy/_first_page.html.erb +7 -3
  206. data/app/views/kaminari/alchemy/_gap.html.erb +1 -1
  207. data/app/views/kaminari/alchemy/_last_page.html.erb +7 -3
  208. data/app/views/kaminari/alchemy/_next_page.html.erb +4 -2
  209. data/app/views/kaminari/alchemy/_page.html.erb +1 -1
  210. data/app/views/kaminari/alchemy/_prev_page.html.erb +4 -2
  211. data/app/views/layouts/alchemy/admin.html.erb +8 -6
  212. data/bin/rails +2 -2
  213. data/bin/rspec +1 -1
  214. data/config/alchemy/config.yml +0 -2
  215. data/config/alchemy/modules.yml +5 -5
  216. data/config/initializers/simple_form.rb +45 -8
  217. data/config/locales/alchemy.en.yml +66 -179
  218. data/config/routes.rb +1 -1
  219. data/db/migrate/20180226123013_alchemy_four_point_zero.rb +392 -0
  220. data/db/migrate/20180227224537_migrate_tags_to_gutentag.rb +41 -0
  221. data/lib/alchemy/config.rb +0 -2
  222. data/lib/alchemy/engine.rb +5 -9
  223. data/lib/alchemy/essence.rb +6 -6
  224. data/lib/alchemy/filetypes.rb +13 -1
  225. data/lib/alchemy/forms/builder.rb +5 -3
  226. data/lib/alchemy/i18n.rb +8 -6
  227. data/lib/alchemy/modules.rb +1 -1
  228. data/lib/alchemy/name_conversions.rb +0 -2
  229. data/lib/alchemy/page_layout.rb +3 -2
  230. data/lib/alchemy/paths.rb +5 -5
  231. data/lib/alchemy/resource.rb +9 -9
  232. data/lib/alchemy/resources_helper.rb +11 -15
  233. data/lib/alchemy/routing_constraints.rb +2 -2
  234. data/lib/alchemy/shell.rb +0 -1
  235. data/lib/alchemy/taggable.rb +40 -0
  236. data/lib/alchemy/tasks/tidy.rb +1 -9
  237. data/lib/alchemy/test_support/factories/content_factory.rb +10 -0
  238. data/lib/alchemy/test_support/factories/element_factory.rb +5 -0
  239. data/lib/alchemy/test_support/shared_contexts.rb +1 -1
  240. data/lib/alchemy/tinymce.rb +2 -2
  241. data/lib/alchemy/upgrader/four_point_one.rb +42 -0
  242. data/lib/alchemy/upgrader/tasks/harden_acts_as_taggable_on_migrations.rb +27 -0
  243. data/lib/alchemy/version.rb +1 -1
  244. data/lib/alchemy_cms.rb +2 -3
  245. data/lib/rails/generators/alchemy/elements/elements_generator.rb +2 -2
  246. data/lib/rails/generators/alchemy/essence/essence_generator.rb +1 -1
  247. data/lib/rails/generators/alchemy/install/install_generator.rb +4 -8
  248. data/lib/rails/generators/alchemy/module/module_generator.rb +1 -1
  249. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +2 -2
  250. data/lib/rails/generators/alchemy/site_layouts/site_layouts_generator.rb +2 -2
  251. data/lib/rails/generators/alchemy/views/views_generator.rb +1 -1
  252. data/lib/tasks/alchemy/db.rake +2 -1
  253. data/lib/tasks/alchemy/tidy.rake +0 -6
  254. data/lib/tasks/alchemy/upgrade.rake +11 -144
  255. data/vendor/assets/fonts/fa-regular-400.eot +0 -0
  256. data/vendor/assets/fonts/fa-regular-400.svg +363 -0
  257. data/vendor/assets/fonts/fa-regular-400.ttf +0 -0
  258. data/vendor/assets/fonts/fa-regular-400.woff +0 -0
  259. data/vendor/assets/fonts/fa-regular-400.woff2 +0 -0
  260. data/vendor/assets/fonts/fa-solid-900.eot +0 -0
  261. data/vendor/assets/fonts/fa-solid-900.svg +1413 -0
  262. data/vendor/assets/fonts/fa-solid-900.ttf +0 -0
  263. data/vendor/assets/fonts/fa-solid-900.woff +0 -0
  264. data/vendor/assets/fonts/fa-solid-900.woff2 +0 -0
  265. data/vendor/assets/javascripts/tinymce/license.txt +6 -6
  266. data/vendor/assets/javascripts/tinymce/tinymce.min.js +2 -15
  267. data/vendor/assets/stylesheets/fontawesome/_animated.scss +20 -0
  268. data/vendor/assets/stylesheets/fontawesome/_bordered-pulled.scss +20 -0
  269. data/vendor/assets/stylesheets/fontawesome/_core.scss +16 -0
  270. data/vendor/assets/stylesheets/fontawesome/_fixed-width.scss +6 -0
  271. data/vendor/assets/stylesheets/fontawesome/_icons.scss +792 -0
  272. data/vendor/assets/stylesheets/fontawesome/_larger.scss +23 -0
  273. data/vendor/assets/stylesheets/fontawesome/_list.scss +18 -0
  274. data/vendor/assets/stylesheets/fontawesome/_mixins.scss +57 -0
  275. data/vendor/assets/stylesheets/fontawesome/_rotated-flipped.scss +23 -0
  276. data/vendor/assets/stylesheets/fontawesome/_screen-reader.scss +5 -0
  277. data/vendor/assets/stylesheets/fontawesome/_stacked.scss +31 -0
  278. data/vendor/assets/stylesheets/fontawesome/_variables.scss +805 -0
  279. data/vendor/assets/stylesheets/fontawesome/fa-regular.scss +22 -0
  280. data/vendor/assets/stylesheets/fontawesome/fa-solid.scss +23 -0
  281. data/vendor/assets/stylesheets/fontawesome/fontawesome.scss +16 -0
  282. metadata +78 -112
  283. data/app/assets/fonts/alchemy/icons.eot +0 -0
  284. data/app/assets/fonts/alchemy/icons.svg +0 -33
  285. data/app/assets/fonts/alchemy/icons.ttf +0 -0
  286. data/app/assets/fonts/alchemy/icons.woff +0 -0
  287. data/app/assets/images/alchemy/icons.png +0 -0
  288. data/app/assets/images/alchemy/ui-icons_666666_256x240.png +0 -0
  289. data/app/assets/images/sassy-ie-overlay.png +0 -0
  290. data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +0 -42
  291. data/app/assets/stylesheets/alchemy/icon-font.scss +0 -75
  292. data/app/assets/stylesheets/alchemy/modules.scss +0 -27
  293. data/app/models/alchemy.rb +0 -7
  294. data/app/views/alchemy/admin/contents/destroy.js.erb +0 -4
  295. data/app/views/alchemy/admin/pictures/flush.js.erb +0 -2
  296. data/config/locales/alchemy.de.yml +0 -932
  297. data/config/locales/alchemy.es.yml +0 -960
  298. data/config/locales/alchemy.fr.yml +0 -938
  299. data/config/locales/alchemy.it.yml +0 -938
  300. data/config/locales/alchemy.nl.yml +0 -918
  301. data/config/locales/alchemy.ru.yml +0 -830
  302. data/config/locales/simple_form.de.yml +0 -26
  303. data/config/locales/simple_form.en.yml +0 -25
  304. data/config/locales/simple_form.es.yml +0 -6
  305. data/config/locales/simple_form.fr.yml +0 -26
  306. data/config/locales/simple_form.it.yml +0 -25
  307. data/config/locales/simple_form.nl.yml +0 -25
  308. data/config/locales/simple_form.ru.yml +0 -25
  309. data/db/migrate/20130827094554_alchemy_two_point_six.rb +0 -378
  310. data/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +0 -5
  311. data/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +0 -5
  312. data/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +0 -5
  313. data/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +0 -6
  314. data/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +0 -5
  315. data/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +0 -7
  316. data/db/migrate/20160108174834_add_timebased_publishing_columns_to_pages.rb +0 -32
  317. data/db/migrate/20160422195310_add_image_file_format_to_alchemy_pictures.rb +0 -9
  318. data/db/migrate/20160617224938_change_alchemy_pages_locked_to_locked_at.rb +0 -22
  319. data/db/migrate/20160912223112_add_index_to_alchemy_pages_rgt.rb +0 -9
  320. data/db/migrate/20160927205604_add_foreign_key_indices_and_null_constraints.rb +0 -20
  321. data/db/migrate/20160928080104_add_foreign_keys.rb +0 -27
  322. data/lib/alchemy/touching.rb +0 -42
  323. data/lib/alchemy/upgrader/tasks/available_contents_upgrader.rb +0 -161
  324. data/lib/alchemy/upgrader/tasks/install_asset_manifests.rb +0 -15
  325. data/lib/alchemy/upgrader/tasks/install_dragonfly_config.rb +0 -14
  326. data/lib/alchemy/upgrader/tasks/nestable_elements_migration.rb +0 -71
  327. data/lib/alchemy/upgrader/tasks/three_point_two_task.rb +0 -31
  328. data/lib/alchemy/upgrader/three_point_five.rb +0 -32
  329. data/lib/alchemy/upgrader/three_point_four.rb +0 -52
  330. data/lib/alchemy/upgrader/three_point_one.rb +0 -54
  331. data/lib/alchemy/upgrader/three_point_three.rb +0 -50
  332. data/lib/alchemy/upgrader/three_point_two.rb +0 -40
  333. data/lib/alchemy/upgrader/three_point_zero.rb +0 -92
  334. data/vendor/assets/javascripts/jquery_plugins/jquery.floatThead.min.js +0 -3
  335. data/vendor/assets/javascripts/tinymce/langs/de.js +0 -219
  336. data/vendor/assets/javascripts/tinymce/langs/es.js +0 -219
  337. data/vendor/assets/javascripts/tinymce/langs/fr.js +0 -219
  338. data/vendor/assets/javascripts/tinymce/langs/it.js +0 -219
  339. data/vendor/assets/javascripts/tinymce/langs/nl.js +0 -219
  340. data/vendor/assets/javascripts/tinymce/langs/ru.js +0 -219
@@ -4,7 +4,6 @@
4
4
  //= require jquery_ujs
5
5
  //= require turbolinks
6
6
  //= require jquery-ui/draggable
7
- //= require jquery-ui/effect-drop
8
7
  //= require jquery-ui/effect-fade
9
8
  //= require jquery-ui/sortable
10
9
  //= require jquery-ui/tabs
@@ -14,12 +13,6 @@
14
13
  //= require keymaster
15
14
  //= require requestAnimationFrame
16
15
  //= require select2
17
- //= require select2_locale_de
18
- //= require select2_locale_es
19
- //= require select2_locale_fr
20
- //= require select2_locale_nl
21
- //= require select2_locale_ru
22
- //= require select2_locale_it
23
16
  //= require handlebars
24
17
  //= require alchemy/templates
25
18
  //= require alchemy/alchemy.base
@@ -62,10 +62,10 @@ $.extend Alchemy,
62
62
  removePicture: (selector) ->
63
63
  $form_field = $(selector)
64
64
  $element = $form_field.closest(".element-editor")
65
- if $form_field
65
+ if $form_field[0]
66
66
  $form_field.val ""
67
67
  $form_field.prev().remove()
68
- $form_field.parent().addClass "missing"
68
+ $form_field.parent().html '<i class="icon far fa-image fa-fw"/>'
69
69
  Alchemy.setElementDirty $element
70
70
  false
71
71
 
@@ -20,7 +20,7 @@ Alchemy.Buttons =
20
20
 
21
21
  disable: (button) ->
22
22
  $button = $(button)
23
- spinner = new Alchemy.Spinner('small')
23
+ spinner = new Alchemy.Spinner('small', {fill: '#fff'})
24
24
  $button.data('content', $button.html())
25
25
  $button.attr('disabled', true)
26
26
  $button.addClass('disabled')
@@ -21,7 +21,7 @@ class window.Alchemy.ConfirmDialog extends Alchemy.Dialog
21
21
 
22
22
  build_buttons: ->
23
23
  $btn_container = $('<div class="alchemy-dialog-buttons" />')
24
- @cancel_button = $("<button class=\"cancel\">#{@options.cancel_label}</button>")
24
+ @cancel_button = $("<button class=\"cancel secondary\">#{@options.cancel_label}</button>")
25
25
  @ok_button = $("<button class=\"confirm\">#{@options.ok_label}</button>")
26
26
  $btn_container.append(@cancel_button)
27
27
  $btn_container.append(@ok_button)
@@ -15,6 +15,7 @@ $.extend Alchemy,
15
15
  $datepicker_inputs.each ->
16
16
  type = $(this).data('datepicker-type')
17
17
  options =
18
+ scrollInput: false
18
19
  format: Alchemy.t("formats.#{type}")
19
20
  timepicker: /time/.test(type)
20
21
  datepicker: /date/.test(type)
@@ -140,7 +140,7 @@ class window.Alchemy.Dialog
140
140
  error_header = "#{xhr.statusText} (#{xhr.status})"
141
141
  error_body = "Please check log and try again."
142
142
  $errorDiv = $("<div class=\"message #{error_type}\" />")
143
- $errorDiv.append "<span class=\"icon #{error_type}\" />"
143
+ $errorDiv.append Alchemy.messageIcon(error_type)
144
144
  $errorDiv.append "<h1>#{error_header}</h1>"
145
145
  $errorDiv.append "<p>#{error_body}</p>"
146
146
  @dialog_body.html $errorDiv
@@ -171,7 +171,7 @@ class window.Alchemy.Dialog
171
171
  @dialog_body = $('<div class="alchemy-dialog-body" />')
172
172
  @dialog_header = $('<div class="alchemy-dialog-header" />')
173
173
  @dialog_title = $('<div class="alchemy-dialog-title" />')
174
- @close_button = $('<a class="alchemy-dialog-close"><span class="icon close small"></span></a>')
174
+ @close_button = $('<a class="alchemy-dialog-close"><i class="icon fas fa-times fa-fw fa-xs"/></a>')
175
175
  @dialog_title.text(@options.title)
176
176
  @dialog_header.append(@dialog_title)
177
177
  @dialog_header.append(@close_button)
@@ -251,17 +251,19 @@ window.Alchemy.openDialog = (url, options) ->
251
251
  # See Alchemy.Dialog for further options you can add to the data attribute
252
252
  #
253
253
  window.Alchemy.watchForDialogs = (scope = '#alchemy') ->
254
- $(scope).on 'click', '[data-alchemy-dialog]', (e) ->
254
+ $(scope).on 'click', '[data-alchemy-dialog]', (event) ->
255
255
  $this = $(this)
256
256
  url = $this.attr('href')
257
257
  options = $this.data('alchemy-dialog')
258
258
  Alchemy.openDialog(url, options)
259
- false
259
+ event.preventDefault()
260
+ return
260
261
  $(scope).on 'click', '[data-alchemy-confirm-delete]', (event) ->
261
262
  $this = $(this)
262
263
  options = $this.data('alchemy-confirm-delete')
263
264
  Alchemy.confirmToDeleteDialog($this.attr('href'), options)
264
- false
265
+ event.preventDefault()
266
+ return
265
267
  $(scope).on 'click', '[data-alchemy-confirm]', (event) ->
266
268
  options = $(this).data('alchemy-confirm')
267
269
  Alchemy.openConfirmDialog options.message, $.extend options,
@@ -271,4 +273,15 @@ window.Alchemy.watchForDialogs = (scope = '#alchemy') ->
271
273
  Alchemy.pleaseWaitOverlay()
272
274
  @form.submit()
273
275
  return
274
- false
276
+ event.preventDefault()
277
+ return
278
+
279
+ # Returns a FontAwesome icon for given message type
280
+ #
281
+ window.Alchemy.messageIcon = (messageType) ->
282
+ icon_class = switch messageType
283
+ when "warning", "warn", "alert" then "exclamation"
284
+ when "notice" then "check"
285
+ when "error" then "bug"
286
+ else messageType
287
+ "<i class=\"icon fas fa-#{icon_class} fa-fw\" />"
@@ -12,19 +12,14 @@ $.extend Alchemy,
12
12
  setElementDirty: (element) ->
13
13
  $element = $(element)
14
14
  $element.addClass('dirty')
15
- $element
16
- .find('> .element-header .icon[class*="element_"]')
17
- .addClass('element_dirty')
18
15
  window.onbeforeunload = @pageUnload
19
16
 
20
17
  pageUnload: ->
21
- Alchemy.pleaseWaitOverlay(false)
22
18
  Alchemy.t('page_dirty_notice')
23
19
 
24
20
  setElementClean: (element) ->
25
21
  $element = $(element)
26
22
  $element.removeClass('dirty')
27
- $element.find('> .element-header .icon').removeClass('element_dirty')
28
23
  $element.find('> .element-content .dirty').removeClass('dirty')
29
24
  window.onbeforeunload = undefined
30
25
 
@@ -41,10 +36,11 @@ $.extend Alchemy,
41
36
  $form = $("<form action=\"#{element.action}\" method=\"POST\" style=\"display: none\" />")
42
37
  $form.append $(element).find("input")
43
38
  $form.appendTo "body"
39
+ Alchemy.pleaseWaitOverlay()
44
40
  $form.submit()
45
41
  else if $(element).is("a")
46
42
  callback = ->
47
- window.location.href = element.pathname
43
+ Turbolinks.visit(element.pathname)
48
44
  if Alchemy.isPageDirty()
49
45
  Alchemy.openConfirmDialog Alchemy.t('page_dirty_notice'),
50
46
  title: Alchemy.t('warning')
@@ -52,7 +48,6 @@ $.extend Alchemy,
52
48
  cancel_label: Alchemy.t('cancel')
53
49
  on_ok: ->
54
50
  window.onbeforeunload = undefined
55
- Alchemy.pleaseWaitOverlay()
56
51
  callback()
57
52
  false
58
53
  else
@@ -20,7 +20,9 @@ Alchemy.ElementEditors =
20
20
  # Binds click events on several DOM elements from element editors
21
21
  # Uses event delegation, so it is not necessary to rebind these events.
22
22
  bindEvents: ->
23
- @element_area.on "click", ".element-header", (e) =>
23
+ $('body').on 'click', (e) =>
24
+ @onClickBody(e)
25
+ @element_area.on "click", ".element-editor", (e) =>
24
26
  @onClickElement(e)
25
27
  @element_area.on "dblclick", ".element-header", (e) =>
26
28
  @onDoubleClickElement(e)
@@ -39,12 +41,15 @@ Alchemy.ElementEditors =
39
41
  # Selects and scrolls to element with given id in the preview window.
40
42
  #
41
43
  selectElementInPreview: (element_id) ->
42
- $frame_elements = document
43
- .getElementById("alchemy_preview_window")
44
- .contentWindow
45
- .jQuery("[data-alchemy-element]")
46
- $selected_element = $frame_elements.closest("[data-alchemy-element='#{element_id}']")
47
- $selected_element.trigger("SelectPreviewElement.Alchemy")
44
+ previewElements = document
45
+ .getElementById('alchemy_preview_window')
46
+ .contentDocument
47
+ .querySelectorAll('[data-alchemy-element]')
48
+ previewElement = Array.from(previewElements).find (element) ->
49
+ element.getAttribute('data-alchemy-element') == element_id
50
+ if previewElement
51
+ event = new Event('SelectPreviewElement.Alchemy')
52
+ previewElement.dispatchEvent(event)
48
53
  return
49
54
 
50
55
  # Selects element
@@ -59,7 +64,6 @@ Alchemy.ElementEditors =
59
64
  # If we have folded parents we need to unfold each of them
60
65
  # and then finally scroll to or unfold ourself
61
66
  $folded_parents = $element.parents('.element-editor.folded')
62
- @selectElement($element)
63
67
  if $folded_parents.length > 0
64
68
  @unfoldParents $folded_parents, =>
65
69
  @scrollToOrUnfold(element_id)
@@ -77,11 +81,10 @@ Alchemy.ElementEditors =
77
81
 
78
82
  # Marks an element as selected in the element window and scrolls to it.
79
83
  #
80
- selectElement: ($element) ->
81
- $elements = $("#element_area .element-editor")
82
- $elements.removeClass("selected")
84
+ selectElement: ($element, scroll = false) ->
85
+ $("#element_area .element-editor").not($element[0]).removeClass("selected")
83
86
  $element.addClass("selected")
84
- @scrollToElement($element)
87
+ @scrollToElement($element) if scroll
85
88
  return
86
89
 
87
90
  # Unfolds given parents until the last one is reached, then calls callback
@@ -104,9 +107,10 @@ Alchemy.ElementEditors =
104
107
  #
105
108
  scrollToOrUnfold: (element_id, callback) ->
106
109
  $el = $("#element_#{element_id}")
107
- @selectElement($el)
108
110
  if $el.hasClass("folded")
109
111
  @toggleFold(element_id, callback)
112
+ else
113
+ @selectElement($el, true)
110
114
  return
111
115
 
112
116
  # Scrolls the element window to given element editor dom element.
@@ -114,7 +118,7 @@ Alchemy.ElementEditors =
114
118
  scrollToElement: (el) ->
115
119
  $("#element_area").scrollTo el,
116
120
  duration: 400
117
- offset: -10
121
+ offset: -6
118
122
 
119
123
  # Expands or folds a element editor
120
124
  #
@@ -138,7 +142,7 @@ Alchemy.ElementEditors =
138
142
  toggleFold: (id, callback) ->
139
143
  spinner = new Alchemy.Spinner('small')
140
144
  spinner.spin("#element_#{id} > .element-header .ajax-folder")
141
- $("#element_#{id}_folder").hide()
145
+ $("#element_#{id}_folder .icon").hide()
142
146
  $.post Alchemy.routes.fold_admin_element_path(id), =>
143
147
  callback.call() if callback?
144
148
  return
@@ -168,37 +172,43 @@ Alchemy.ElementEditors =
168
172
 
169
173
  # Event handlers
170
174
 
171
- # Click event handler for element head.
175
+ onClickBody: (e) ->
176
+ frameWindow = $('#alchemy_preview_window')[0].contentWindow
177
+ element = $(e.target).parents('.element-editor')[0]
178
+ $('#element_area .element-editor').not(element).removeClass('selected')
179
+ unless element
180
+ frameWindow.postMessage('blurAlchemyElements', window.location.origin)
181
+ return
182
+
183
+ # Click event handler for element body.
172
184
  #
173
185
  # - Focuses the element
174
186
  # - Triggers custom 'SelectPreviewElement.Alchemy' event on target element in preview frame.
175
187
  #
176
188
  onClickElement: (e) ->
177
- $element = $(e.target).closest(".element-editor")
189
+ $target = $(e.target)
190
+ $element = $target.closest(".element-editor")
178
191
  element_id = $element.attr("id").replace(/\D/g, "")
179
- $("#element_area .element-editor").removeClass("selected")
180
- $element.addClass("selected")
181
192
  @selectElement($element)
182
193
  @selectElementInPreview(element_id)
183
- e.preventDefault()
184
- e.stopPropagation()
185
- false
194
+ # Element submit button needs to keep it's default event
195
+ e.preventDefault() unless $target.is(':submit')
196
+ return
186
197
 
187
198
  # Double click event handler for element head.
188
199
  onDoubleClickElement: (e) ->
189
200
  id = $(e.target).closest('.element-editor').attr('id').replace(/\D/g, '')
190
201
  @toggle(id)
191
202
  e.preventDefault()
192
- e.stopPropagation()
193
- false
203
+ return
194
204
 
195
205
  # Click event handler for element toggle icon.
196
206
  onClickToggle: (e) ->
197
- id = $(e.target).data('element-toggle')
207
+ id = $(e.currentTarget).data('element-toggle')
198
208
  @toggle(id)
199
209
  e.preventDefault()
200
210
  e.stopPropagation()
201
- false
211
+ return
202
212
 
203
213
  # Handles the custom 'FocusElementEditor.Alchemy' event.
204
214
  #
@@ -11,8 +11,8 @@ Alchemy.ToolbarButton = (options) ->
11
11
  $lnk.click (e) ->
12
12
  e.preventDefault()
13
13
  options.onClick(e)
14
- false
15
- $lnk.append "<span class='icon #{options.iconClass}' />"
14
+ return
15
+ $lnk.append "<i class='icon fas fa-#{options.iconClass} fa-fw' />"
16
16
  $btn.append $lnk
17
17
  $btn.append "<br><label>#{options.label}</label>"
18
18
  $btn
@@ -21,6 +21,7 @@ Alchemy.ElementsWindow =
21
21
 
22
22
  init: (url, options, callback) ->
23
23
  @hidden = false
24
+ @$body = $('body')
24
25
  @element_window = $('<div id="alchemy_elements_window"/>')
25
26
  @element_area = $('<div id="element_area"/>')
26
27
  @url = url
@@ -32,11 +33,11 @@ Alchemy.ElementsWindow =
32
33
  @button.click =>
33
34
  @hide()
34
35
  false
35
- height = @resize()
36
36
  window.requestAnimationFrame =>
37
37
  spinner = new Alchemy.Spinner('medium')
38
38
  spinner.spin @element_area[0]
39
39
  $('#main_content').append(@element_window)
40
+ @show()
40
41
  @reload()
41
42
 
42
43
  createToolbar: (buttons) ->
@@ -45,14 +46,6 @@ Alchemy.ElementsWindow =
45
46
  @toolbar.append Alchemy.ToolbarButton(btn)
46
47
  @toolbar
47
48
 
48
- resize: ->
49
- height = $(window).height() - 73
50
- @element_window.css
51
- height: height
52
- @element_area.css
53
- height: height - 46
54
- height
55
-
56
49
  reload: ->
57
50
  $.get @url, (data) =>
58
51
  @element_area.html data
@@ -63,16 +56,14 @@ Alchemy.ElementsWindow =
63
56
  Alchemy.AjaxErrorHandler @element_area, xhr.status, status, error
64
57
 
65
58
  hide: ->
66
- @element_window.css(right: -400)
59
+ @$body.removeClass('elements-window-visible');
67
60
  @hidden = true
68
61
  @toggleButton()
69
- Alchemy.PreviewWindow.resize()
70
62
 
71
63
  show: ->
72
- @element_window.css(right: 0)
64
+ @$body.addClass('elements-window-visible');
73
65
  @hidden = false
74
66
  @toggleButton()
75
- Alchemy.PreviewWindow.resize()
76
67
 
77
68
  toggleButton: ->
78
69
  if @hidden
@@ -9,7 +9,7 @@ Alchemy.FileProgress = (file) ->
9
9
  @$fileProgressElement = $('<div class="progress-container"/>')
10
10
 
11
11
  # Append Cancel Button
12
- @$fileProgressCancel = $('<a href="javascript:void(0);" class="progress-cancel"/>')
12
+ @$fileProgressCancel = $('<a href="javascript:void(0);" class="progress-cancel"><i class="fas fa-times fa-fw"/></a>')
13
13
  @$fileProgressElement.append @$fileProgressCancel
14
14
 
15
15
  # Append Filename
@@ -4,24 +4,21 @@ Alchemy.Growler =
4
4
 
5
5
  build: (message, flash_type) ->
6
6
  $flash_container = $("<div class=\"flash #{flash_type}\" />")
7
- icon_class = (if flash_type is "notice" then "tick" else flash_type)
8
- $flash_container.append "<span class=\"icon #{icon_class}\" />"
7
+ $flash_container.append Alchemy.messageIcon(flash_type)
9
8
  $flash_container.append message
10
9
  $("#flash_notices").append $flash_container
11
10
  $("#flash_notices").show()
12
11
  Alchemy.Growler.fade()
13
12
 
14
13
  fade: ->
15
- $(".flash.notice, .flash.warning, .flash.warn, .flash.alert", "#flash_notices").delay(5000).hide "drop",
16
- direction: "up"
17
- , 400, ->
18
- $(this).remove()
14
+ $(".flash:not(.error)", "#flash_notices").delay(5000).queue(-> Alchemy.Growler.dismiss(this))
15
+ $(".flash", "#flash_notices").click((e) => @dismiss(e.currentTarget))
16
+ return
19
17
 
20
- $(".flash.error", "#flash_notices").click ->
21
- $(this).hide "drop",
22
- direction: "up"
23
- , 400, ->
24
- $(this).remove()
18
+ dismiss: (element) ->
19
+ $(element).on 'transitionend', => $(element).remove()
20
+ $(element).addClass('dismissed')
21
+ return
25
22
 
26
23
  Alchemy.growl = (message, style = "notice") ->
27
24
  Alchemy.Growler.build message, style
@@ -9,7 +9,10 @@ Alchemy.GUI =
9
9
  Alchemy.Datepicker(scope)
10
10
  Alchemy.Tooltips(scope)
11
11
  Alchemy.Buttons.observe(scope)
12
- Alchemy.watchForDialogs(scope)
12
+ # Dialog links use event delegation and therefore do not
13
+ # need to be re-initialized after dom elements get replaced
14
+ unless scope
15
+ Alchemy.watchForDialogs()
13
16
  Alchemy.Hotkeys(scope)
14
17
  Alchemy.ListFilter(scope)
15
18
  Alchemy.Autocomplete.tags(scope)
@@ -44,7 +44,7 @@ class window.Alchemy.ImageOverlay extends Alchemy.Dialog
44
44
  @dialog = $('<div class="alchemy-image-overlay-dialog" />')
45
45
  @dialog_body = $('<div class="alchemy-image-overlay-body" />')
46
46
  @close_button = $('<a class="alchemy-image-overlay-close">
47
- <span class="icon close small"></span>
47
+ <i class="icon fas fa-times fa-fw"></i>
48
48
  </a>')
49
49
  @dialog.append(@close_button)
50
50
  @dialog.append(@dialog_body)
@@ -15,11 +15,9 @@ Alchemy.Initializer = ->
15
15
  Alchemy.Growler.fade()
16
16
 
17
17
  # Add observer for please wait overlay.
18
- $('.please_wait, #main_navi a, .button_with_label form :submit, .locked_page a, .pagination a')
19
- .not('*[data-alchemy-confirm], .locked_page button')
20
- .click ->
21
- unless Alchemy.isPageDirty()
22
- Alchemy.pleaseWaitOverlay()
18
+ $('.please_wait, .button_with_label form :submit')
19
+ .not('*[data-alchemy-confirm]')
20
+ .click Alchemy.pleaseWaitOverlay
23
21
 
24
22
  # Hack for enabling tab focus for <a>'s styled as button.
25
23
  $('a.button').attr({tabindex: 0})
@@ -28,17 +26,16 @@ Alchemy.Initializer = ->
28
26
  $('select#change_locale').on 'change', (e) ->
29
27
  url = window.location.pathname
30
28
  delimiter = if url.match(/\?/) then '&' else '?'
31
- window.location.href = "#{url}#{delimiter}admin_locale=#{$(this).val()}"
29
+ Turbolinks.visit "#{url}#{delimiter}admin_locale=#{$(this).val()}"
32
30
 
33
31
  # Site select handler
34
32
  $('select#change_site').on 'change', (e) ->
35
33
  url = window.location.pathname
36
34
  delimiter = if url.match(/\?/) then '&' else '?'
37
- window.location.href = "#{url}#{delimiter}site_id=#{$(this).val()}"
35
+ Turbolinks.visit "#{url}#{delimiter}site_id=#{$(this).val()}"
38
36
 
39
37
  # Submit forms of selects with `data-autosubmit="true"`
40
38
  $('select[data-auto-submit="true"]').on 'change', (e) ->
41
- Alchemy.pleaseWaitOverlay()
42
39
  $(this.form).submit()
43
40
 
44
41
  # Attaches the image loader on all images
@@ -49,12 +46,6 @@ Alchemy.Initializer = ->
49
46
  tagName = (event.target || event.srcElement).tagName
50
47
  key.isPressed('esc') || !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA')
51
48
 
52
- # Sticky table headers
53
- $('table.list').floatThead
54
- useAbsolutePositioning: false,
55
- scrollingTop: 122,
56
- zIndex: 1
57
-
58
49
  # Enabling the Turbolinks Progress Bar for v2.5
59
50
  Turbolinks.enableProgressBar() if Turbolinks.enableProgressBar
60
51