alchemy_cms 3.2.1 → 3.3.0.rc1

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 (556) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +28 -0
  3. data/.gitignore +2 -2
  4. data/.travis.yml +11 -3
  5. data/CHANGELOG.md +100 -0
  6. data/CONTRIBUTING.md +1 -1
  7. data/Gemfile +12 -1
  8. data/README.md +25 -7
  9. data/Rakefile +1 -3
  10. data/alchemy_cms.gemspec +7 -15
  11. data/app/assets/fonts/alchemy/icons.eot +0 -0
  12. data/app/assets/fonts/alchemy/icons.svg +28 -66
  13. data/app/assets/fonts/alchemy/icons.ttf +0 -0
  14. data/app/assets/fonts/alchemy/icons.woff +0 -0
  15. data/app/assets/images/alchemy/icons.png +0 -0
  16. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +10 -3
  17. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +15 -6
  18. data/app/assets/javascripts/alchemy/alchemy.char_counter.js.coffee +1 -1
  19. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +1 -1
  20. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +10 -4
  21. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +16 -22
  22. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +69 -32
  23. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +147 -83
  24. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +14 -14
  25. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +1 -1
  26. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +1 -1
  27. data/app/assets/javascripts/alchemy/alchemy.image_overlay.coffee +55 -0
  28. data/app/assets/javascripts/alchemy/alchemy.initializer.js.coffee +8 -1
  29. data/app/assets/javascripts/alchemy/alchemy.js +3 -1
  30. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +36 -31
  31. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +35 -29
  32. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +51 -5
  33. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee +26 -10
  34. data/app/assets/javascripts/alchemy/{alchemy.windows.js.coffee → alchemy.trash_window.js.coffee} +1 -13
  35. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +15 -17
  36. data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +3 -3
  37. data/app/assets/stylesheets/alchemy/_extends.scss +1 -1
  38. data/app/assets/stylesheets/alchemy/_mixins.scss +27 -0
  39. data/app/assets/stylesheets/alchemy/_variables.scss +1 -0
  40. data/app/assets/stylesheets/alchemy/admin.scss +1 -0
  41. data/app/assets/stylesheets/alchemy/archive.scss +0 -57
  42. data/app/assets/stylesheets/alchemy/base.scss +1 -18
  43. data/app/assets/stylesheets/alchemy/buttons.scss +30 -25
  44. data/app/assets/stylesheets/alchemy/dialogs.scss +25 -9
  45. data/app/assets/stylesheets/alchemy/elements.scss +182 -126
  46. data/app/assets/stylesheets/alchemy/form_fields.scss +14 -8
  47. data/app/assets/stylesheets/alchemy/forms.scss +10 -1
  48. data/app/assets/stylesheets/alchemy/frame.scss +3 -10
  49. data/app/assets/stylesheets/alchemy/icon-font.scss +13 -6
  50. data/app/assets/stylesheets/alchemy/icons.scss +16 -0
  51. data/app/assets/stylesheets/alchemy/image_library.scss +269 -0
  52. data/app/assets/stylesheets/alchemy/selects.scss +1 -0
  53. data/app/assets/stylesheets/alchemy/sitemap.scss +12 -1
  54. data/app/assets/stylesheets/alchemy/toolbar.scss +2 -2
  55. data/app/assets/stylesheets/alchemy/upload.scss +97 -87
  56. data/app/assets/stylesheets/alchemy/welcome.sass +49 -0
  57. data/app/controllers/alchemy/admin/attachments_controller.rb +21 -29
  58. data/app/controllers/alchemy/admin/base_controller.rb +23 -4
  59. data/app/controllers/alchemy/admin/clipboard_controller.rb +0 -1
  60. data/app/controllers/alchemy/admin/contents_controller.rb +2 -4
  61. data/app/controllers/alchemy/admin/dashboard_controller.rb +4 -4
  62. data/app/controllers/alchemy/admin/elements_controller.rb +20 -11
  63. data/app/controllers/alchemy/admin/essence_files_controller.rb +2 -2
  64. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +10 -9
  65. data/app/controllers/alchemy/admin/languages_controller.rb +0 -1
  66. data/app/controllers/alchemy/admin/layoutpages_controller.rb +0 -2
  67. data/app/controllers/alchemy/admin/legacy_page_urls_controller.rb +0 -1
  68. data/app/controllers/alchemy/admin/pages_controller.rb +46 -29
  69. data/app/controllers/alchemy/admin/pictures_controller.rb +44 -55
  70. data/app/controllers/alchemy/admin/resources_controller.rb +8 -75
  71. data/app/controllers/alchemy/admin/tags_controller.rb +10 -8
  72. data/app/controllers/alchemy/admin/trash_controller.rb +0 -6
  73. data/app/controllers/alchemy/api/contents_controller.rb +0 -1
  74. data/app/controllers/alchemy/api/elements_controller.rb +0 -1
  75. data/app/controllers/alchemy/api/pages_controller.rb +4 -1
  76. data/app/controllers/alchemy/attachments_controller.rb +4 -5
  77. data/app/controllers/alchemy/base_controller.rb +6 -5
  78. data/app/controllers/alchemy/elements_controller.rb +1 -1
  79. data/app/controllers/alchemy/messages_controller.rb +9 -4
  80. data/app/controllers/alchemy/pages_controller.rb +133 -137
  81. data/app/controllers/alchemy/pictures_controller.rb +12 -10
  82. data/app/controllers/concerns/alchemy/admin/uploader_responses.rb +41 -0
  83. data/app/controllers/concerns/alchemy/legacy_page_redirects.rb +56 -0
  84. data/app/controllers/concerns/alchemy/locale_redirects.rb +38 -0
  85. data/app/controllers/concerns/alchemy/page_redirects.rb +80 -0
  86. data/app/controllers/concerns/alchemy/site_redirects.rb +22 -0
  87. data/app/helpers/alchemy/admin/attachments_helper.rb +1 -2
  88. data/app/helpers/alchemy/admin/base_helper.rb +36 -62
  89. data/app/helpers/alchemy/admin/contents_helper.rb +6 -80
  90. data/app/helpers/alchemy/admin/elements_helper.rb +36 -15
  91. data/app/helpers/alchemy/admin/essences_helper.rb +15 -8
  92. data/app/helpers/alchemy/admin/form_helper.rb +6 -10
  93. data/app/helpers/alchemy/admin/navigation_helper.rb +4 -7
  94. data/app/helpers/alchemy/admin/pages_helper.rb +14 -35
  95. data/app/helpers/alchemy/admin/pictures_helper.rb +12 -14
  96. data/app/helpers/alchemy/admin/tags_helper.rb +5 -7
  97. data/app/helpers/alchemy/base_helper.rb +9 -17
  98. data/app/helpers/alchemy/elements_block_helper.rb +5 -13
  99. data/app/helpers/alchemy/elements_helper.rb +6 -6
  100. data/app/helpers/alchemy/essences_helper.rb +3 -16
  101. data/app/helpers/alchemy/pages_helper.rb +32 -25
  102. data/app/helpers/alchemy/url_helper.rb +14 -16
  103. data/app/mailers/alchemy/messages.rb +0 -2
  104. data/app/models/alchemy.rb +0 -2
  105. data/app/models/alchemy/attachment.rb +45 -56
  106. data/app/models/alchemy/cell.rb +7 -8
  107. data/app/models/alchemy/content.rb +39 -24
  108. data/app/models/alchemy/content/factory.rb +27 -44
  109. data/app/models/alchemy/element.rb +101 -267
  110. data/app/models/alchemy/element/definitions.rb +9 -8
  111. data/app/models/alchemy/element/element_contents.rb +150 -0
  112. data/app/models/alchemy/element/element_essences.rb +109 -0
  113. data/app/models/alchemy/element/presenters.rb +18 -7
  114. data/app/models/alchemy/essence_date.rb +1 -2
  115. data/app/models/alchemy/essence_file.rb +10 -6
  116. data/app/models/alchemy/essence_html.rb +0 -1
  117. data/app/models/alchemy/essence_picture.rb +12 -4
  118. data/app/models/alchemy/essence_richtext.rb +6 -3
  119. data/app/models/alchemy/language.rb +48 -21
  120. data/app/models/alchemy/language/code.rb +1 -4
  121. data/app/models/alchemy/page.rb +33 -35
  122. data/app/models/alchemy/page/page_cells.rb +6 -10
  123. data/app/models/alchemy/page/page_elements.rb +130 -100
  124. data/app/models/alchemy/page/page_naming.rb +2 -3
  125. data/app/models/alchemy/page/page_natures.rb +50 -16
  126. data/app/models/alchemy/page/page_scopes.rb +7 -7
  127. data/app/models/alchemy/page/page_users.rb +3 -3
  128. data/app/models/alchemy/picture.rb +48 -33
  129. data/app/models/alchemy/picture/transformations.rb +8 -9
  130. data/app/models/alchemy/site.rb +19 -17
  131. data/app/models/alchemy/site/layout.rb +9 -9
  132. data/app/models/alchemy/tag.rb +0 -2
  133. data/app/models/alchemy/tree_node.rb +5 -4
  134. data/app/serializers/alchemy/attachment_serializer.rb +0 -1
  135. data/app/serializers/alchemy/base_serializer.rb +30 -0
  136. data/app/serializers/alchemy/cell_serializer.rb +0 -1
  137. data/app/serializers/alchemy/essence_boolean_serializer.rb +0 -1
  138. data/app/serializers/alchemy/essence_date_serializer.rb +0 -1
  139. data/app/serializers/alchemy/essence_file_serializer.rb +0 -1
  140. data/app/serializers/alchemy/essence_html_serializer.rb +0 -1
  141. data/app/serializers/alchemy/essence_link_serializer.rb +0 -1
  142. data/app/serializers/alchemy/essence_picture_serializer.rb +0 -1
  143. data/app/serializers/alchemy/essence_richtext_serializer.rb +0 -1
  144. data/app/serializers/alchemy/essence_select_serializer.rb +0 -1
  145. data/app/serializers/alchemy/essence_text_serializer.rb +0 -1
  146. data/app/serializers/alchemy/legacy_element_serializer.rb +0 -1
  147. data/app/serializers/alchemy/page_serializer.rb +0 -1
  148. data/app/serializers/alchemy/page_tree_serializer.rb +90 -0
  149. data/app/serializers/alchemy/picture_serializer.rb +0 -1
  150. data/app/views/alchemy/_menubar.html.erb +3 -3
  151. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +11 -16
  152. data/app/views/alchemy/admin/attachments/_attachment.html.erb +9 -9
  153. data/app/views/alchemy/admin/attachments/_files_list.html.erb +7 -15
  154. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +1 -1
  155. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +2 -2
  156. data/app/views/alchemy/admin/attachments/edit.html.erb +3 -3
  157. data/app/views/alchemy/admin/attachments/index.html.erb +10 -17
  158. data/app/views/alchemy/admin/clipboard/clear.js.erb +1 -1
  159. data/app/views/alchemy/admin/clipboard/index.html.erb +3 -3
  160. data/app/views/alchemy/admin/clipboard/insert.js.erb +3 -3
  161. data/app/views/alchemy/admin/clipboard/remove.js.erb +2 -2
  162. data/app/views/alchemy/admin/contents/_missing.html.erb +5 -7
  163. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  164. data/app/views/alchemy/admin/contents/new.html.erb +2 -2
  165. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +6 -6
  166. data/app/views/alchemy/admin/dashboard/_recent_pages.html.erb +2 -2
  167. data/app/views/alchemy/admin/dashboard/_users.html.erb +2 -2
  168. data/app/views/alchemy/admin/dashboard/help.html.erb +15 -15
  169. data/app/views/alchemy/admin/dashboard/index.html.erb +6 -6
  170. data/app/views/alchemy/admin/dashboard/info.html.erb +5 -5
  171. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  172. data/app/views/alchemy/admin/elements/_element.html.erb +52 -18
  173. data/app/views/alchemy/admin/elements/_element_footer.html.erb +11 -0
  174. data/app/views/alchemy/admin/elements/{_element_head.html.erb → _element_header.html.erb} +8 -8
  175. data/app/views/alchemy/admin/elements/_element_toolbar.html.erb +49 -0
  176. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +7 -6
  177. data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
  178. data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +1 -1
  179. data/app/views/alchemy/admin/elements/create.js.erb +13 -8
  180. data/app/views/alchemy/admin/elements/fold.js.erb +12 -7
  181. data/app/views/alchemy/admin/elements/index.html.erb +12 -8
  182. data/app/views/alchemy/admin/elements/list.html.erb +3 -3
  183. data/app/views/alchemy/admin/elements/new.html.erb +4 -4
  184. data/app/views/alchemy/admin/elements/order.js.erb +3 -4
  185. data/app/views/alchemy/admin/elements/publish.js.erb +15 -0
  186. data/app/views/alchemy/admin/elements/trash.js.erb +3 -3
  187. data/app/views/alchemy/admin/elements/update.js.erb +7 -8
  188. data/app/views/alchemy/admin/essence_files/edit.html.erb +16 -13
  189. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +3 -3
  190. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +8 -8
  191. data/app/views/alchemy/admin/languages/_form.html.erb +12 -3
  192. data/app/views/alchemy/admin/languages/_language.html.erb +8 -2
  193. data/app/views/alchemy/admin/languages/_table.html.erb +11 -5
  194. data/app/views/alchemy/admin/languages/index.html.erb +1 -1
  195. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +8 -8
  196. data/app/views/alchemy/admin/layoutpages/edit.html.erb +2 -2
  197. data/app/views/alchemy/admin/layoutpages/index.html.erb +6 -13
  198. data/app/views/alchemy/admin/leave.html.erb +5 -5
  199. data/app/views/alchemy/admin/legacy_page_urls/_form.html.erb +1 -1
  200. data/app/views/alchemy/admin/legacy_page_urls/_legacy_page_url.html.erb +4 -4
  201. data/app/views/alchemy/admin/legacy_page_urls/_new.html.erb +1 -1
  202. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +9 -9
  203. data/app/views/alchemy/admin/pages/_external_link.html.erb +6 -6
  204. data/app/views/alchemy/admin/pages/_file_link.html.erb +6 -6
  205. data/app/views/alchemy/admin/pages/_form.html.erb +6 -6
  206. data/app/views/alchemy/admin/pages/_internal_link.html.erb +9 -11
  207. data/app/views/alchemy/admin/pages/_legacy_urls.html.erb +3 -3
  208. data/app/views/alchemy/admin/pages/_locked_page.html.erb +4 -4
  209. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +2 -2
  210. data/app/views/alchemy/admin/pages/_page.html.erb +95 -80
  211. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +22 -22
  212. data/app/views/alchemy/admin/pages/_page_infos.html.erb +12 -0
  213. data/app/views/alchemy/admin/pages/_page_status.html.erb +7 -9
  214. data/app/views/alchemy/admin/pages/_sitemap.html.erb +35 -6
  215. data/app/views/alchemy/admin/pages/_tinymce_custom_config.html.erb +0 -3
  216. data/app/views/alchemy/admin/pages/configure.html.erb +1 -1
  217. data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
  218. data/app/views/alchemy/admin/pages/edit.html.erb +39 -44
  219. data/app/views/alchemy/admin/pages/flush.js.erb +1 -1
  220. data/app/views/alchemy/admin/pages/fold.js.erb +2 -3
  221. data/app/views/alchemy/admin/pages/index.html.erb +15 -22
  222. data/app/views/alchemy/admin/pages/info.html.erb +8 -8
  223. data/app/views/alchemy/admin/pages/link.html.erb +3 -3
  224. data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
  225. data/app/views/alchemy/admin/pages/new.html.erb +4 -4
  226. data/app/views/alchemy/admin/pages/sort.js.erb +1 -2
  227. data/app/views/alchemy/admin/pages/unlock.js.erb +1 -1
  228. data/app/views/alchemy/admin/pages/update.js.erb +3 -3
  229. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +1 -1
  230. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +1 -1
  231. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +1 -1
  232. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +9 -15
  233. data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -13
  234. data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +1 -1
  235. data/app/views/alchemy/admin/pictures/_archive.html.erb +14 -14
  236. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +30 -36
  237. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +5 -5
  238. data/app/views/alchemy/admin/pictures/{edit.html.erb → _form.html.erb} +7 -6
  239. data/app/views/alchemy/admin/pictures/_infos.html.erb +50 -0
  240. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  241. data/app/views/alchemy/admin/pictures/_picture.html.erb +17 -51
  242. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  243. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +2 -2
  244. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +6 -6
  245. data/app/views/alchemy/admin/pictures/index.html.erb +28 -36
  246. data/app/views/alchemy/admin/pictures/show.html.erb +46 -9
  247. data/app/views/alchemy/admin/pictures/update.js.erb +6 -0
  248. data/app/views/alchemy/admin/resources/_form.html.erb +3 -3
  249. data/app/views/alchemy/admin/resources/_resource.html.erb +4 -4
  250. data/app/views/alchemy/admin/resources/_table.html.erb +5 -6
  251. data/app/views/alchemy/admin/resources/index.csv.erb +12 -10
  252. data/app/views/alchemy/admin/resources/index.html.erb +4 -4
  253. data/app/views/alchemy/admin/sites/index.html.erb +1 -1
  254. data/app/views/alchemy/admin/tags/_tag.html.erb +4 -4
  255. data/app/views/alchemy/admin/tags/edit.html.erb +5 -5
  256. data/app/views/alchemy/admin/tags/index.html.erb +8 -8
  257. data/app/views/alchemy/admin/tags/new.html.erb +2 -2
  258. data/app/views/alchemy/admin/trash/clear.js.erb +1 -1
  259. data/app/views/alchemy/admin/trash/index.html.erb +8 -6
  260. data/app/views/alchemy/admin/uploader/_button.html.erb +39 -0
  261. data/app/views/alchemy/admin/uploader/_setup.html.erb +13 -0
  262. data/app/views/alchemy/base/500.html.erb +4 -4
  263. data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
  264. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +3 -4
  265. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +1 -1
  266. data/app/views/alchemy/essences/_essence_date_editor.html.erb +2 -6
  267. data/app/views/alchemy/essences/_essence_date_view.html.erb +1 -1
  268. data/app/views/alchemy/essences/_essence_file_editor.html.erb +9 -11
  269. data/app/views/alchemy/essences/_essence_file_view.html.erb +11 -5
  270. data/app/views/alchemy/essences/_essence_html_editor.html.erb +1 -1
  271. data/app/views/alchemy/essences/_essence_link_editor.html.erb +1 -1
  272. data/app/views/alchemy/essences/_essence_link_view.html.erb +1 -1
  273. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +47 -52
  274. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
  275. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +1 -1
  276. data/app/views/alchemy/essences/_essence_select_editor.html.erb +23 -13
  277. data/app/views/alchemy/essences/_essence_text_editor.html.erb +1 -1
  278. data/app/views/alchemy/essences/_essence_text_view.html.erb +1 -1
  279. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +29 -36
  280. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +5 -5
  281. data/app/views/alchemy/language_links/_language.html.erb +15 -9
  282. data/app/views/alchemy/messages/contact_form_mail.de.text.erb +1 -1
  283. data/app/views/alchemy/messages/contact_form_mail.en.text.erb +1 -1
  284. data/app/views/alchemy/messages/contact_form_mail.es.text.erb +1 -1
  285. data/app/views/alchemy/navigation/_link.html.erb +0 -1
  286. data/app/views/alchemy/pages/show.rss.builder +6 -4
  287. data/app/views/alchemy/welcome.html.erb +28 -0
  288. data/app/views/layouts/alchemy/admin.html.erb +14 -10
  289. data/bin/alchemy +3 -4
  290. data/bin/rspec +7 -0
  291. data/bin/spring +15 -0
  292. data/config/alchemy/config.yml +16 -17
  293. data/config/initializers/assets.rb +13 -0
  294. data/config/locales/alchemy.de.yml +27 -29
  295. data/config/locales/alchemy.en.yml +23 -29
  296. data/config/locales/alchemy.es.yml +23 -29
  297. data/config/locales/alchemy.fr.yml +19 -28
  298. data/config/locales/alchemy.nl.yml +19 -27
  299. data/config/locales/alchemy.ru.yml +19 -28
  300. data/config/routes.rb +53 -54
  301. data/config/spring.rb +2 -0
  302. data/db/migrate/20130827094554_alchemy_two_point_six.rb +1 -3
  303. data/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +6 -0
  304. data/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +5 -0
  305. data/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +7 -0
  306. data/lib/alchemy/auth_accessors.rb +1 -1
  307. data/lib/alchemy/cache_digests/template_tracker.rb +7 -13
  308. data/lib/alchemy/config.rb +5 -7
  309. data/lib/alchemy/configuration_methods.rb +11 -1
  310. data/lib/alchemy/controller_actions.rb +9 -12
  311. data/lib/alchemy/engine.rb +11 -28
  312. data/lib/alchemy/errors.rb +0 -1
  313. data/lib/alchemy/essence.rb +20 -20
  314. data/lib/alchemy/filetypes.rb +1 -3
  315. data/lib/alchemy/forms/builder.rb +0 -2
  316. data/lib/alchemy/hints.rb +1 -3
  317. data/lib/alchemy/i18n.rb +81 -53
  318. data/lib/alchemy/kaminari/scoped_pagination_url_helper.rb +0 -2
  319. data/lib/alchemy/locale.rb +0 -1
  320. data/lib/alchemy/logger.rb +1 -3
  321. data/lib/alchemy/modules.rb +3 -3
  322. data/lib/alchemy/mount_point.rb +0 -2
  323. data/lib/alchemy/name_conversions.rb +1 -3
  324. data/lib/alchemy/on_page_layout.rb +37 -23
  325. data/lib/alchemy/on_page_layout/callbacks_runner.rb +34 -0
  326. data/lib/alchemy/page_layout.rb +23 -24
  327. data/lib/alchemy/paths.rb +32 -0
  328. data/lib/alchemy/permissions.rb +20 -20
  329. data/lib/alchemy/picture_attributes.rb +0 -3
  330. data/lib/alchemy/resource.rb +66 -22
  331. data/lib/alchemy/resources_helper.rb +48 -11
  332. data/lib/alchemy/routing_constraints.rb +4 -5
  333. data/lib/alchemy/seeder.rb +1 -4
  334. data/lib/alchemy/shell.rb +12 -14
  335. data/lib/alchemy/tasks/helpers.rb +5 -7
  336. data/lib/alchemy/test_support/essence_shared_examples.rb +24 -24
  337. data/lib/alchemy/test_support/factories.rb +2 -146
  338. data/lib/alchemy/test_support/factories/attachment_factory.rb +9 -0
  339. data/lib/alchemy/test_support/factories/cell_factory.rb +9 -0
  340. data/lib/alchemy/test_support/factories/content_factory.rb +10 -0
  341. data/lib/alchemy/test_support/factories/dummy_user_factory.rb +21 -0
  342. data/lib/alchemy/test_support/factories/element_factory.rb +21 -0
  343. data/lib/alchemy/test_support/factories/essence_file_factory.rb +8 -0
  344. data/lib/alchemy/test_support/factories/essence_picture_factory.rb +8 -0
  345. data/lib/alchemy/test_support/factories/essence_text_factory.rb +7 -0
  346. data/lib/alchemy/test_support/factories/language_factory.rb +28 -0
  347. data/lib/alchemy/test_support/factories/page_factory.rb +45 -0
  348. data/lib/alchemy/test_support/factories/picture_factory.rb +10 -0
  349. data/lib/alchemy/test_support/factories/site_factory.rb +12 -0
  350. data/lib/alchemy/test_support/integration_helpers.rb +0 -3
  351. data/lib/alchemy/tinymce.rb +24 -35
  352. data/lib/alchemy/touching.rb +5 -6
  353. data/lib/alchemy/upgrader.rb +3 -5
  354. data/lib/alchemy/upgrader/tasks/available_contents_upgrader.rb +155 -0
  355. data/lib/alchemy/upgrader/tasks/nestable_elements_migration.rb +71 -0
  356. data/lib/alchemy/upgrader/tasks/three_point_two_task.rb +31 -0
  357. data/lib/alchemy/upgrader/three_point_three.rb +50 -0
  358. data/lib/alchemy/upgrader/three_point_two.rb +3 -32
  359. data/lib/alchemy/upgrader/three_point_zero.rb +0 -1
  360. data/lib/alchemy/version.rb +1 -1
  361. data/lib/rails/generators/alchemy/base.rb +1 -1
  362. data/lib/rails/generators/alchemy/elements/elements_generator.rb +1 -7
  363. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +5 -7
  364. data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +6 -8
  365. data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +6 -7
  366. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +4 -4
  367. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +3 -3
  368. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +3 -3
  369. data/lib/rails/generators/alchemy/essence/essence_generator.rb +2 -3
  370. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +1 -1
  371. data/lib/rails/generators/alchemy/install/files/alchemy.de.yml +2 -2
  372. data/lib/rails/generators/alchemy/install/files/alchemy.en.yml +2 -2
  373. data/lib/rails/generators/alchemy/install/files/alchemy.es.yml +3 -3
  374. data/lib/rails/generators/alchemy/install/install_generator.rb +0 -1
  375. data/lib/rails/generators/alchemy/install/templates/elements.yml.tt +2 -2
  376. data/lib/rails/generators/alchemy/install/templates/page_layouts.yml.tt +1 -1
  377. data/lib/rails/generators/alchemy/module/module_generator.rb +1 -1
  378. data/lib/rails/templates/alchemy.rb +2 -2
  379. data/lib/tasks/alchemy/convert.rake +4 -8
  380. data/lib/tasks/alchemy/db.rake +2 -3
  381. data/lib/tasks/alchemy/install.rake +3 -4
  382. data/lib/tasks/alchemy/tidy.rake +4 -5
  383. data/lib/tasks/alchemy/upgrade.rake +2 -4
  384. data/spec/controllers/{admin → alchemy/admin}/attachments_controller_spec.rb +26 -44
  385. data/spec/controllers/{admin → alchemy/admin}/base_controller_spec.rb +14 -1
  386. data/spec/controllers/{admin → alchemy/admin}/clipboard_controller_spec.rb +3 -3
  387. data/spec/controllers/{admin → alchemy/admin}/contents_controller_spec.rb +4 -4
  388. data/spec/controllers/{admin → alchemy/admin}/dashboard_controller_spec.rb +11 -6
  389. data/spec/controllers/{admin → alchemy/admin}/elements_controller_spec.rb +54 -31
  390. data/spec/controllers/{admin → alchemy/admin}/essence_files_controller_spec.rb +8 -3
  391. data/spec/controllers/{admin → alchemy/admin}/essence_pictures_controller_spec.rb +3 -3
  392. data/spec/controllers/{admin → alchemy/admin}/languages_controller_spec.rb +13 -1
  393. data/spec/controllers/{admin → alchemy/admin}/layoutpages_controller_spec.rb +0 -6
  394. data/spec/controllers/{admin → alchemy/admin}/pages_controller_spec.rb +103 -35
  395. data/spec/controllers/{admin → alchemy/admin}/pictures_controller_spec.rb +133 -108
  396. data/spec/controllers/alchemy/admin/resources_controller_spec.rb +81 -0
  397. data/spec/controllers/{admin → alchemy/admin}/trash_controller_spec.rb +12 -13
  398. data/spec/controllers/alchemy/api/contents_controller_spec.rb +12 -13
  399. data/spec/controllers/alchemy/api/elements_controller_spec.rb +8 -9
  400. data/spec/controllers/alchemy/api/pages_controller_spec.rb +40 -7
  401. data/spec/controllers/{attachments_controller_spec.rb → alchemy/attachments_controller_spec.rb} +7 -7
  402. data/spec/controllers/alchemy/base_controller_spec.rb +106 -0
  403. data/spec/controllers/{elements_controller_spec.rb → alchemy/elements_controller_spec.rb} +4 -4
  404. data/spec/controllers/{messages_controller_spec.rb → alchemy/messages_controller_spec.rb} +14 -9
  405. data/spec/controllers/alchemy/on_page_layout_mixin_spec.rb +330 -0
  406. data/spec/controllers/{pages_controller_spec.rb → alchemy/pages_controller_spec.rb} +167 -89
  407. data/spec/controllers/{pictures_controller_spec.rb → alchemy/pictures_controller_spec.rb} +42 -20
  408. data/spec/dummy/app/models/dummy_user.rb +4 -0
  409. data/spec/dummy/app/views/alchemy/elements/_all_you_can_eat_view.html.erb +31 -0
  410. data/spec/dummy/app/views/alchemy/elements/_article_editor.html.erb +6 -10
  411. data/spec/dummy/app/views/alchemy/elements/_article_view.html.erb +9 -24
  412. data/spec/dummy/app/views/alchemy/elements/_bild_editor.html.erb +3 -0
  413. data/spec/dummy/app/views/alchemy/elements/_bild_view.html.erb +5 -0
  414. data/spec/dummy/app/views/alchemy/elements/_contactform_editor.html.erb +6 -0
  415. data/spec/dummy/app/views/alchemy/elements/_contactform_view.html.erb +16 -0
  416. data/spec/dummy/app/views/alchemy/elements/_download_editor.html.erb +3 -0
  417. data/spec/dummy/app/views/alchemy/elements/_download_view.html.erb +5 -0
  418. data/spec/dummy/app/views/alchemy/elements/_erb_element_editor.html.erb +3 -0
  419. data/spec/dummy/app/views/alchemy/elements/_erb_element_view.html.erb +5 -0
  420. data/spec/dummy/app/views/alchemy/elements/_header_editor.html.erb +3 -0
  421. data/spec/dummy/app/views/alchemy/elements/_header_view.html.erb +5 -0
  422. data/spec/dummy/app/views/alchemy/elements/_news_editor.html.erb +5 -0
  423. data/spec/dummy/app/views/alchemy/elements/_search_editor.html.erb +1 -0
  424. data/spec/dummy/app/views/alchemy/elements/_search_view.html.erb +4 -0
  425. data/spec/dummy/app/views/alchemy/elements/_slide_editor.html.erb +3 -0
  426. data/spec/dummy/app/views/alchemy/elements/_slide_view.html.erb +5 -0
  427. data/spec/dummy/app/views/alchemy/elements/_slider_editor.html.erb +2 -0
  428. data/spec/dummy/app/views/alchemy/elements/_slider_view.html.erb +4 -0
  429. data/spec/dummy/app/views/alchemy/elements/_text_editor.html.erb +3 -0
  430. data/spec/dummy/app/views/alchemy/elements/_text_view.html.erb +5 -0
  431. data/spec/dummy/app/views/alchemy/page_layouts/_standard.html.erb +1 -0
  432. data/spec/dummy/config/alchemy/elements.yml +10 -13
  433. data/spec/dummy/config/alchemy/page_layouts.yml +1 -1
  434. data/spec/dummy/config/initializers/alchemy.rb +1 -0
  435. data/spec/dummy/config/locales/kl.yml +2 -0
  436. data/spec/dummy/db/migrate/20150608204610_add_parent_element_id_to_alchemy_elements.rb +1 -0
  437. data/spec/dummy/db/migrate/20150729151825_add_link_text_to_alchemy_essence_files.rb +1 -0
  438. data/spec/dummy/db/migrate/20150906195818_add_locale_to_alchemy_languages.rb +1 -0
  439. data/spec/dummy/db/schema.rb +10 -6
  440. data/spec/factories.rb +13 -0
  441. data/spec/features/admin/admin_layout_spec.rb +14 -0
  442. data/spec/features/admin/dashboard_spec.rb +1 -2
  443. data/spec/features/admin/edit_elements_feature_spec.rb +36 -0
  444. data/spec/features/admin/language_tree_feature_spec.rb +7 -8
  445. data/spec/features/admin/languages_features_spec.rb +65 -0
  446. data/spec/features/admin/legacy_page_url_management_spec.rb +3 -3
  447. data/spec/features/admin/link_overlay_spec.rb +16 -17
  448. data/spec/features/admin/locale_select_feature_spec.rb +1 -1
  449. data/spec/features/admin/modules_integration_spec.rb +0 -1
  450. data/spec/features/admin/navigation_feature_spec.rb +11 -2
  451. data/spec/features/admin/page_creation_feature_spec.rb +5 -5
  452. data/spec/features/admin/page_editing_feature_spec.rb +6 -6
  453. data/spec/features/admin/picture_library_integration_spec.rb +3 -3
  454. data/spec/features/admin/resources_integration_spec.rb +7 -12
  455. data/spec/features/admin/site_select_feature_spec.rb +1 -2
  456. data/spec/features/admin/tinymce_feature_spec.rb +0 -1
  457. data/spec/features/page_feature_spec.rb +57 -158
  458. data/spec/features/page_redirects_spec.rb +358 -0
  459. data/spec/features/picture_security_spec.rb +1 -7
  460. data/spec/fixtures/animated.gif +0 -0
  461. data/spec/helpers/{admin → alchemy/admin}/attachments_helper_spec.rb +0 -0
  462. data/spec/helpers/{admin → alchemy/admin}/base_helper_spec.rb +39 -29
  463. data/spec/helpers/{admin → alchemy/admin}/contents_helper_spec.rb +4 -23
  464. data/spec/helpers/{admin → alchemy/admin}/elements_helper_spec.rb +141 -5
  465. data/spec/helpers/{admin → alchemy/admin}/essences_helper_spec.rb +69 -8
  466. data/spec/helpers/{admin → alchemy/admin}/navigation_helper_spec.rb +43 -37
  467. data/spec/helpers/{admin → alchemy/admin}/pages_helper_spec.rb +6 -38
  468. data/spec/helpers/{admin → alchemy/admin}/pictures_helper_spec.rb +0 -1
  469. data/spec/helpers/{admin → alchemy/admin}/tags_helper_spec.rb +1 -3
  470. data/spec/helpers/{base_helper_spec.rb → alchemy/base_helper_spec.rb} +1 -2
  471. data/spec/helpers/{elements_block_helper_spec.rb → alchemy/elements_block_helper_spec.rb} +3 -3
  472. data/spec/helpers/{elements_helper_spec.rb → alchemy/elements_helper_spec.rb} +18 -19
  473. data/spec/helpers/alchemy/essences_helper_spec.rb +85 -0
  474. data/spec/helpers/{pages_helper_spec.rb → alchemy/pages_helper_spec.rb} +125 -39
  475. data/spec/helpers/alchemy/picture_url_helpers_spec.rb +78 -0
  476. data/spec/helpers/{url_helper_spec.rb → alchemy/url_helper_spec.rb} +66 -40
  477. data/spec/libraries/config_spec.rb +2 -3
  478. data/spec/libraries/controller_actions_spec.rb +18 -18
  479. data/spec/libraries/i18n_spec.rb +7 -0
  480. data/spec/libraries/page_layout_spec.rb +13 -7
  481. data/spec/libraries/paths_spec.rb +15 -0
  482. data/spec/libraries/permissions_spec.rb +6 -7
  483. data/spec/libraries/resource_spec.rb +48 -75
  484. data/spec/libraries/resources_helper_spec.rb +55 -6
  485. data/spec/libraries/shell_spec.rb +0 -4
  486. data/spec/libraries/template_tracker_spec.rb +4 -13
  487. data/spec/libraries/tinymce_spec.rb +53 -9
  488. data/spec/mailers/{messages_spec.rb → alchemy/messages_spec.rb} +0 -2
  489. data/spec/models/{attachment_spec.rb → alchemy/attachment_spec.rb} +43 -20
  490. data/spec/models/{cell_spec.rb → alchemy/cell_spec.rb} +2 -3
  491. data/spec/models/{content_spec.rb → alchemy/content_spec.rb} +179 -70
  492. data/spec/models/{element_spec.rb → alchemy/element_spec.rb} +315 -70
  493. data/spec/models/{element_to_page_spec.rb → alchemy/element_to_page_spec.rb} +0 -1
  494. data/spec/models/{essence_boolean_spec.rb → alchemy/essence_boolean_spec.rb} +0 -0
  495. data/spec/models/{essence_date_spec.rb → alchemy/essence_date_spec.rb} +2 -3
  496. data/spec/models/{essence_file_spec.rb → alchemy/essence_file_spec.rb} +2 -5
  497. data/spec/models/{essence_html_spec.rb → alchemy/essence_html_spec.rb} +1 -1
  498. data/spec/models/{essence_link_spec.rb → alchemy/essence_link_spec.rb} +0 -0
  499. data/spec/models/{essence_picture_spec.rb → alchemy/essence_picture_spec.rb} +101 -29
  500. data/spec/models/{essence_richtext_spec.rb → alchemy/essence_richtext_spec.rb} +7 -2
  501. data/spec/models/{essence_select_spec.rb → alchemy/essence_select_spec.rb} +0 -0
  502. data/spec/models/{essence_text_spec.rb → alchemy/essence_text_spec.rb} +4 -8
  503. data/spec/models/alchemy/language_spec.rb +243 -0
  504. data/spec/models/{legacy_page_url_spec.rb → alchemy/legacy_page_url_spec.rb} +1 -1
  505. data/spec/models/{message_spec.rb → alchemy/message_spec.rb} +0 -0
  506. data/spec/models/{page_spec.rb → alchemy/page_spec.rb} +460 -248
  507. data/spec/models/{picture_spec.rb → alchemy/picture_spec.rb} +118 -30
  508. data/spec/models/{site_spec.rb → alchemy/site_spec.rb} +19 -84
  509. data/spec/models/{tag_spec.rb → alchemy/tag_spec.rb} +1 -3
  510. data/spec/models/dummy_model_spec.rb +1 -2
  511. data/spec/requests/alchemy/admin/resources_requests_spec.rb +26 -0
  512. data/spec/requests/alchemy/admin/site_requests_spec.rb +19 -0
  513. data/spec/requests/alchemy/site_requests_spec.rb +18 -0
  514. data/spec/requests/alchemy/sitemap_spec.rb +56 -0
  515. data/spec/routing/api_routing_spec.rb +1 -1
  516. data/spec/routing/routing_spec.rb +121 -15
  517. data/spec/spec_helper.rb +2 -1
  518. data/spec/support/hint_examples.rb +1 -3
  519. data/spec/support/test_tweaks.rb +3 -3
  520. data/spec/support/transformation_examples.rb +6 -7
  521. data/spec/tasks/helpers_spec.rb +2 -4
  522. data/spec/views/admin/pictures/show_spec.rb +43 -0
  523. data/spec/views/essences/essence_boolean_editor_spec.rb +0 -1
  524. data/spec/views/essences/essence_boolean_view_spec.rb +2 -4
  525. data/spec/views/essences/essence_date_view_spec.rb +0 -1
  526. data/spec/views/essences/essence_file_editor_spec.rb +4 -6
  527. data/spec/views/essences/essence_file_view_spec.rb +56 -3
  528. data/spec/views/essences/essence_link_view_spec.rb +1 -1
  529. data/spec/views/essences/essence_picture_editor_spec.rb +80 -0
  530. data/spec/views/essences/essence_picture_view_spec.rb +0 -1
  531. data/spec/views/essences/essence_select_view_spec.rb +0 -1
  532. data/spec/views/essences/essence_text_view_spec.rb +0 -1
  533. data/vendor/assets/javascripts/handlebars.js +4608 -0
  534. data/vendor/assets/javascripts/tinymce/langs/de.js +19 -0
  535. data/vendor/assets/javascripts/tinymce/langs/es.js +19 -0
  536. data/vendor/assets/javascripts/tinymce/langs/fr.js +23 -4
  537. data/vendor/assets/javascripts/tinymce/langs/nl.js +22 -3
  538. data/vendor/assets/javascripts/tinymce/langs/ru.js +22 -3
  539. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -1
  540. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -1
  541. data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -1
  542. data/vendor/assets/javascripts/tinymce/tinymce.min.js +12 -13
  543. metadata +274 -256
  544. data/app/views/alchemy/admin/attachments/create.js.erb +0 -11
  545. data/app/views/alchemy/admin/attachments/new.html.erb +0 -14
  546. data/app/views/alchemy/admin/elements/_element_foot.html.erb +0 -36
  547. data/app/views/alchemy/admin/partials/_upload_form.html.erb +0 -67
  548. data/app/views/alchemy/admin/pictures/info.html.erb +0 -38
  549. data/app/views/alchemy/admin/pictures/new.html.erb +0 -16
  550. data/lib/alchemy/middleware/rescue_old_cookies.rb +0 -27
  551. data/spec/controllers/admin/resources_controller_spec.rb +0 -53
  552. data/spec/controllers/base_controller_spec.rb +0 -51
  553. data/spec/helpers/essences_helper_spec.rb +0 -156
  554. data/spec/helpers/picture_url_helpers_spec.rb +0 -35
  555. data/spec/libraries/on_page_layout_spec.rb +0 -112
  556. data/spec/models/language_spec.rb +0 -123
@@ -3,61 +3,61 @@ window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
3
3
  Alchemy.FileProgress = (file) ->
4
4
 
5
5
  # Build Wrapper
6
- @$fileProgressWrapper = $('<div class="progressWrapper"/>')
6
+ @$fileProgressWrapper = $('<div class="progress-wrapper"/>')
7
7
 
8
8
  # Build Container
9
- @$fileProgressElement = $('<div class="progressContainer"/>')
9
+ @$fileProgressElement = $('<div class="progress-container"/>')
10
10
 
11
11
  # Append Cancel Button
12
- @$fileProgressCancel = $('<a href="javascript:void(0);" class="progressCancel"/>')
12
+ @$fileProgressCancel = $('<a href="javascript:void(0);" class="progress-cancel"/>')
13
13
  @$fileProgressElement.append @$fileProgressCancel
14
14
 
15
15
  # Append Filename
16
- @$fileProgressElement.append "<div class=\"progressName\">" + file.name + "</div>"
16
+ @$fileProgressElement.append "<div class=\"progress-name\">" + file.name + "</div>"
17
17
 
18
18
  # Append Progressbar Status Text
19
- @$fileProgressStatus = $('<div class="progressBarStatus">&nbsp;</div>')
19
+ @$fileProgressStatus = $('<div class="progress-bar-status">&nbsp;</div>')
20
20
  @$fileProgressElement.append @$fileProgressStatus
21
21
 
22
22
  # Build Progressbar Container
23
- $progressBarContainer = $('<div class="progressBarContainer"/>')
23
+ $progressBarContainer = $('<div class="progress-bar-container"/>')
24
24
 
25
25
  # Build Progressbar
26
- @$progressBar = $('<div class="progressBarInProgress"/>')
26
+ @$progressBar = $('<div class="progress-bar-in-progress"/>')
27
27
 
28
28
  # Knit all together
29
29
  $progressBarContainer.append @$progressBar
30
30
  @$fileProgressElement.append $progressBarContainer
31
31
  @$fileProgressWrapper.append @$fileProgressElement
32
- $('#uploadProgressContainer').append @$fileProgressWrapper
32
+ $('.upload-progress-container').append @$fileProgressWrapper
33
33
  this
34
34
 
35
35
  Alchemy.FileProgress::reset = ->
36
36
  @$fileProgressStatus.html '&nbsp;'
37
- @$progressBar.removeClass().addClass 'progressBarInProgress'
37
+ @$progressBar.removeClass().addClass 'progress-bar-in-progress'
38
38
  @$progressBar.css width: '0%'
39
39
 
40
40
  Alchemy.FileProgress::setProgress = (percentage) ->
41
- @$progressBar.removeClass().addClass 'progressBarInProgress'
41
+ @$progressBar.removeClass().addClass 'progress-bar-in-progress'
42
42
  @$progressBar.css width: percentage + '%'
43
43
 
44
44
  Alchemy.FileProgress::setComplete = ->
45
- @$progressBar.removeClass().addClass 'progressBarComplete'
45
+ @$progressBar.removeClass().addClass 'progress-bar-complete'
46
46
  @$progressBar.css width: '100%'
47
47
  @$fileProgressCancel.hide()
48
48
  @$fileProgressWrapper.delay(1500).fadeOut ->
49
49
  $(this).remove()
50
50
 
51
51
  Alchemy.FileProgress::setError = ->
52
- @$progressBar.removeClass().addClass 'progressBarError'
52
+ @$progressBar.removeClass().addClass 'progress-bar-error'
53
53
  @$progressBar.css width: '100%'
54
54
 
55
55
  Alchemy.FileProgress::setCancelled = ->
56
- @$progressBar.removeClass().addClass 'progressBarCanceled'
56
+ @$progressBar.removeClass().addClass 'progress-bar-canceled'
57
57
  @$progressBar.css width: '100%'
58
58
  @$fileProgressCancel.hide()
59
59
  @$fileProgressWrapper.delay(1500).fadeOut ->
60
60
  $(this).remove()
61
61
 
62
62
  Alchemy.FileProgress::setStatus = (status) ->
63
- @$fileProgressStatus.text Alchemy._t(status)
63
+ @$fileProgressStatus.text Alchemy.t(status)
@@ -31,7 +31,7 @@ Alchemy.Hotkeys = (scope) ->
31
31
  $(document).on 'keypress', (e) ->
32
32
  if !$(e.target).is('input, textarea') && String.fromCharCode(e.which) == '?'
33
33
  Alchemy.openDialog '/admin/help',
34
- title: Alchemy._t('help')
34
+ title: Alchemy.t('help')
35
35
  size: '400x492'
36
36
  false
37
37
  else
@@ -22,5 +22,5 @@ Alchemy.I18n =
22
22
 
23
23
  # Global utility method for translating a given string
24
24
  #
25
- Alchemy._t = (key, replacement) ->
25
+ Alchemy.t = (key, replacement) ->
26
26
  Alchemy.I18n.translate(key, replacement)
@@ -0,0 +1,55 @@
1
+ class window.Alchemy.ImageOverlay extends Alchemy.Dialog
2
+
3
+ constructor: (url) ->
4
+ @options =
5
+ draggable: false
6
+ super(url, @options)
7
+ return
8
+
9
+ init: ->
10
+ Alchemy.ImageLoader(@dialog_body)
11
+ $('.zoomed-picture-background').click (e) =>
12
+ e.stopPropagation()
13
+ return if e.target.nodeName == 'IMG'
14
+ @close()
15
+ false
16
+ $('.picture-overlay-handle').click (e) =>
17
+ @dialog.toggleClass('hide-form')
18
+ false
19
+ @$previous = $('.previous-picture')
20
+ @$next = $('.next-picture')
21
+ @$document.keydown (e) =>
22
+ return true if e.target.nodeName == 'INPUT'
23
+ switch e.which
24
+ when 37
25
+ @previous()
26
+ false
27
+ when 39
28
+ @next()
29
+ false
30
+ else
31
+ true
32
+ super()
33
+
34
+ previous: ->
35
+ @$previous.click()
36
+ return
37
+
38
+ next: ->
39
+ @$next.click()
40
+ return
41
+
42
+ build: ->
43
+ @dialog_container = $('<div class="alchemy-image-overlay-container" />')
44
+ @dialog = $('<div class="alchemy-image-overlay-dialog" />')
45
+ @dialog_body = $('<div class="alchemy-image-overlay-body" />')
46
+ @close_button = $('<a class="alchemy-image-overlay-close">
47
+ <span class="icon close small"></span>
48
+ </a>')
49
+ @dialog.append(@close_button)
50
+ @dialog.append(@dialog_body)
51
+ @dialog_container.append(@dialog)
52
+ @overlay = $('<div class="alchemy-image-overlay" />')
53
+ @$body.append(@overlay)
54
+ @$body.append(@dialog_container)
55
+ @dialog
@@ -16,7 +16,7 @@ Alchemy.Initializer = ->
16
16
 
17
17
  # Add observer for please wait overlay.
18
18
  $('a.please_wait, #main_navi a.main_navi_entry, div.button_with_label form :submit, #sub_navigation .subnavi_tab a, .pagination a')
19
- .not('*[data-alchemy-confirm], #subnav_additions .subnavi_tab button')
19
+ .not('*[data-alchemy-confirm], #locked_pages .subnavi_tab button')
20
20
  .click ->
21
21
  unless Alchemy.isPageDirty()
22
22
  Alchemy.pleaseWaitOverlay()
@@ -61,3 +61,10 @@ Turbolinks.enableProgressBar()
61
61
  # Turbolinks DOM Ready
62
62
  $(document).on 'page:change', ->
63
63
  Alchemy.Initializer()
64
+ return
65
+
66
+ # Turbolinks before parsing a new page
67
+ $(document).on 'page:receive', ->
68
+ # Ensure that all tinymce editors get removed before parsing a new page
69
+ Alchemy.Tinymce.removeFrom $('.has_tinymce')
70
+ return
@@ -20,6 +20,7 @@
20
20
  //= require select2_locale_fr
21
21
  //= require select2_locale_nl
22
22
  //= require select2_locale_ru
23
+ //= require handlebars
23
24
  //= require alchemy/alchemy.base
24
25
  //= require alchemy/alchemy.autocomplete
25
26
  //= require alchemy/alchemy.browser
@@ -37,6 +38,7 @@
37
38
  //= require alchemy/alchemy.hotkeys
38
39
  //= require alchemy/alchemy.i18n
39
40
  //= require alchemy/alchemy.image_cropper
41
+ //= require alchemy/alchemy.image_overlay
40
42
  //= require alchemy/alchemy.string_extension
41
43
  //= require alchemy/alchemy.link_dialog
42
44
  //= require alchemy/alchemy.list_filter
@@ -48,5 +50,5 @@
48
50
  //= require alchemy/alchemy.spinner
49
51
  //= require alchemy/alchemy.tinymce
50
52
  //= require alchemy/alchemy.translations
51
- //= require alchemy/alchemy.windows
53
+ //= require alchemy/alchemy.trash_window
52
54
  //= require alchemy/alchemy.custom
@@ -33,21 +33,6 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
33
33
 
34
34
  # Attaches click events to several buttons in the link dialog.
35
35
  attachEvents: ->
36
- # The select page and show elements links.
37
- $('a.sitemap_pagename_link, a.show_elements_to_link', @dialog_body).click (e) =>
38
- $this = $(e.target)
39
- page_id = $this.data('page-id')
40
- url = $this.data('url')
41
- # Select page in page tree
42
- @selectPage(page_id)
43
- # if the show elements link was clicked
44
- if $this.hasClass('show_elements_to_link')
45
- # we open the elements select for that page
46
- @showElementsSelect($this.attr('href'), url)
47
- else
48
- # store url
49
- @$internal_urlname.val('/' + url)
50
- false
51
36
  # The ok buttons
52
37
  $('.create-link.button', @dialog_body).click (e) =>
53
38
  @link_type = $(e.target).data('link-type')
@@ -66,6 +51,27 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
66
51
  target: $("##{@link_type}_link_target").val()
67
52
  false
68
53
 
54
+ # Attaches click events to buttons in the link dialog that appear after the
55
+ # page tree has finished loading.
56
+ attachTreeEvents: ->
57
+ # The select page and show elements links.
58
+ $('a.sitemap_pagename_link, a.show_elements_to_link', @dialog_body).click (e) =>
59
+ $this = $(e.target)
60
+ page_id = $this.data('page-id')
61
+ url = $this.data('url')
62
+ # Select page in page tree
63
+ @selectPage(page_id)
64
+ # if the show elements link was clicked
65
+ if $this.hasClass('show_elements_to_link')
66
+ # we open the elements select for that page
67
+ @showElementsSelect($this.attr('href'), url)
68
+ else
69
+ # store url
70
+ @$internal_urlname.val('/' + url)
71
+ false
72
+ # Select the current page in the tree
73
+ @selectInternalLinkTab()
74
+
69
75
  # Sets the page selected and scrolls it in the viewport.
70
76
  selectPage: (page_id) ->
71
77
  # deselect any selected page from page tree
@@ -92,7 +98,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
92
98
 
93
99
  # Sets the link either in TinyMCE or on an Essence.
94
100
  setLink: (url, title, target) ->
95
- Alchemy.setElementDirty(@$link_object.parents('.element_editor'))
101
+ Alchemy.setElementDirty(@$link_object.closest('.element-editor'))
96
102
  if @link_object.editor
97
103
  @setTinyMCELink(url, title, target)
98
104
  else
@@ -124,35 +130,34 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
124
130
  selectTab: ->
125
131
  # Creating an temporary anchor node if we are linking an EssencePicture or EssenceText.
126
132
  if (@link_object.nodeType)
127
- $link = @createTempLink()
133
+ @$link = @createTempLink()
128
134
  # Restoring the bookmarked selection inside the TinyMCE of an EssenceRichtext.
129
135
  else if (@link_object.node.nodeName == 'A')
130
- $link = $(@link_object.node)
136
+ @$link = $(@link_object.node)
131
137
  @link_object.selection.moveToBookmark(@link_object.bookmark)
132
138
  else
133
139
  return false
134
140
  # Populate title and target fields.
135
- $('.link_title', @dialog_body).val $link.attr('title')
136
- $('.link_target', @dialog_body).select2('val', $link.attr('data-link-target'))
141
+ $('.link_title', @dialog_body).val @$link.attr('title')
142
+ $('.link_target', @dialog_body).select2('val', @$link.attr('data-link-target'))
137
143
  # Checking of what kind the link is (internal, external or file).
138
- if $link.hasClass('external')
144
+ if @$link.hasClass('external')
139
145
  # Handles an external link.
140
146
  tab = $('#overlay_tab_external_link')
141
- @$external_url.val($link.attr('href'))
142
- else if $link.hasClass('file')
147
+ @$external_url.val(@$link.attr('href'))
148
+ else if @$link.hasClass('file')
143
149
  # Handles a file link.
144
150
  tab = $('#overlay_tab_file_link')
145
- @$public_filename.select2('val', $link[0].pathname + $link[0].search)
151
+ @$public_filename.select2('val', @$link[0].pathname + @$link[0].search)
146
152
  else
147
153
  # Handles an internal link.
148
154
  tab = $('#overlay_tab_internal_link')
149
- @selectInternalLinkTab($link)
150
155
  # activate the tab jquery ui 1.10 style o.O
151
156
  @$overlay_tabs.tabs('option', 'active', $('#overlay_tabs > div').index(tab))
152
157
 
153
158
  # Handles actions for internal link tab.
154
- selectInternalLinkTab: ($link) ->
155
- url = $link.attr('href').split('#')
159
+ selectInternalLinkTab: ->
160
+ url = @$link.attr('href').split('#')
156
161
  urlname = url[0]
157
162
  anchor = url[1]
158
163
  if anchor
@@ -171,7 +176,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
171
176
  if ($sitemap_line.length > 0)
172
177
  # Select the line where the link was detected in.
173
178
  $sitemap_line.addClass('selected_page')
174
- @$page_container.scrollTo($sitemap_line.parents('li'), {duration: 400, offset: -10})
179
+ @$page_container.scrollTo($sitemap_line.closest('li'), {duration: 400, offset: -10})
175
180
 
176
181
  # Opens a new Dialog that shows the elements from given page_id in a selectbox.
177
182
  # The value is stored as anchor and the url gets updated so it includes the anchor link
@@ -215,7 +220,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
215
220
 
216
221
  # Shows validation errors
217
222
  showValidationError: ->
218
- $('#errors ul', @dialog_body).html("<li>#{Alchemy._t('url_validation_failed')}</li>")
223
+ $('#errors ul', @dialog_body).html("<li>#{Alchemy.t('url_validation_failed')}</li>")
219
224
  $('#errors', @dialog_body).show()
220
225
 
221
226
  # Populates the internal anchors select
@@ -227,7 +232,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
227
232
  if element.id
228
233
  @$internal_anchor.append("<option value='#{element.id}'>##{element.id}</option>")
229
234
  else
230
- @$internal_anchor.html("<option>#{Alchemy._t('No anchors found')}</option>")
235
+ @$internal_anchor.html("<option>#{Alchemy.t('No anchors found')}</option>")
231
236
  @$internal_anchor.change (e) =>
232
237
  # deselect any selected page from page tree
233
238
  @deselectPage()
@@ -244,7 +249,7 @@ class window.Alchemy.LinkDialog extends Alchemy.Dialog
244
249
  $("#contents_#{content_id}_link_class_name").val('')
245
250
  $("#contents_#{content_id}_link_target").val('')
246
251
  if $link.hasClass('linked')
247
- Alchemy.setElementDirty $(link).parents('.element_editor')
252
+ Alchemy.setElementDirty $(link).closest('.element-editor')
248
253
  $link.removeClass('linked').addClass('disabled')
249
254
  $('#edit_link_' + content_id).removeClass('linked')
250
255
  false
@@ -11,6 +11,7 @@ Alchemy.initAlchemyPreviewMode = ($) ->
11
11
 
12
12
  # The Alchemy JavaScript Object contains all Functions
13
13
  $.extend Alchemy,
14
+
14
15
  ElementSelector:
15
16
 
16
17
  # defaults
@@ -21,25 +22,19 @@ Alchemy.initAlchemyPreviewMode = ($) ->
21
22
  outline: ""
22
23
  "outline-offset": ""
23
24
  "-moz-outline-radius": ""
24
-
25
25
  default_hover:
26
26
  outline: "3px solid #F0B437"
27
27
  "outline-offset": "4px"
28
28
  cursor: "pointer"
29
-
30
29
  webkit_hover:
31
30
  outline: "4px auto #F0B437"
32
-
33
31
  moz_hover:
34
32
  "-moz-outline-radius": "3px"
35
-
36
33
  default_selected:
37
34
  outline: "3px solid #90B9D0"
38
35
  "outline-offset": "4px"
39
-
40
36
  webkit_selected:
41
37
  outline: "4px auto #90B9D0"
42
-
43
38
  moz_selected:
44
39
  "-moz-outline-radius": "3px"
45
40
 
@@ -48,42 +43,53 @@ Alchemy.initAlchemyPreviewMode = ($) ->
48
43
  @$previewElements = $elements
49
44
  $elements.mouseover (e) =>
50
45
  $el = $(e.delegateTarget)
51
- $el.attr("title", Alchemy._t('click_to_edit'))
46
+ $el.attr("title", Alchemy.t('click_to_edit'))
52
47
  $el.css(@getStyle("hover")) unless $el.hasClass("selected")
48
+ return
53
49
  $elements.mouseout (e) =>
54
50
  $el = $(e.delegateTarget)
55
51
  $el.removeAttr("title")
56
52
  $el.css(@getStyle("reset")) unless $el.hasClass("selected")
57
- $elements.on "Alchemy.SelectElement", (e) =>
58
- @selectElement(e)
53
+ return
54
+ $elements.on "SelectPreviewElement.Alchemy", (e) =>
55
+ $el = $(e.delegateTarget)
56
+ # Stop the event from bubbling up to parent elements
57
+ e.stopPropagation()
58
+ @selectElement($el)
59
+ return
59
60
  $elements.click (e) =>
60
- @clickElement(e)
61
+ $el = $(e.delegateTarget)
62
+ # Stop the event from bubbling up to parent elements
63
+ e.stopPropagation()
64
+ # Stop default click events from running
65
+ e.preventDefault()
66
+ # Mark current preview element as selected
67
+ @selectElement($el)
68
+ # Focus the element editor
69
+ @focusElementEditor($el)
70
+ return
71
+ return
61
72
 
62
- selectElement: (e) ->
63
- $el = $(e.delegateTarget)
64
- $elements = @$previewElements
65
- offset = @scrollOffset
66
- el_offset = $el.offset()
67
- e.preventDefault()
68
- $elements.removeClass("selected").css(@getStyle("reset"))
73
+ # Mark element in preview frame as selected and scrolls to it.
74
+ selectElement: ($el) ->
75
+ offset = $el.offset()
76
+ @$previewElements.removeClass("selected").css(@getStyle("reset"))
69
77
  $el.addClass("selected").css(@getStyle("selected"))
70
78
  $("html, body").animate
71
- scrollTop: el_offset.top - offset
72
- scrollLeft: el_offset.left - offset
79
+ scrollTop: offset.top - @scrollOffset
80
+ scrollLeft: offset.left - @scrollOffset
73
81
  , 400
74
82
  return
75
83
 
76
- clickElement: (e) ->
77
- $el = $(e.delegateTarget)
78
- parent$ = window.parent.jQuery
84
+ # Focus the element editor in the Alchemy element window.
85
+ focusElementEditor: ($el) ->
86
+ alchemy_window = window.parent
87
+ alchemy_$ = alchemy_window.jQuery
79
88
  target_id = $el.data("alchemy-element")
80
- $element_editor = parent$("#element_area .element_editor").closest("[id=\"element_" + target_id + "\"]")
81
- elementsWindow = window.parent.Alchemy.ElementsWindow
82
- e.preventDefault()
83
- $element_editor.trigger("Alchemy.SelectElementEditor", target_id)
84
- if elementsWindow.hidden
85
- elementsWindow.show()
86
- $el.trigger("Alchemy.SelectElement")
89
+ $element_editor = alchemy_$("#element_#{target_id}")
90
+ elements_window = alchemy_window.Alchemy.ElementsWindow
91
+ $element_editor.trigger("FocusElementEditor.Alchemy", target_id)
92
+ elements_window.show() if elements_window.hidden
87
93
  return
88
94
 
89
95
  getStyle: (state) ->
@@ -4,12 +4,58 @@ window.Alchemy = {} if typeof(window.Alchemy) is 'undefined'
4
4
  Alchemy.Sitemap =
5
5
 
6
6
  # Storing some objects.
7
- init: ->
7
+ init: (options) ->
8
8
  @search_field = $("#search_field")
9
9
  @filter_field_clear = $('.js_filter_field_clear')
10
10
  @display = $('#page_filter_result')
11
- @items = $(".sitemap_page", '#sitemap')
12
- @_observe()
11
+ @sitemap_wrapper = $('#sitemap-wrapper p.loading')
12
+ @template = Handlebars.compile($('#sitemap-template').html())
13
+ list_template_regexp = new RegExp '\/' + options.page_root_id, 'g'
14
+ list_template_html = $('#sitemap-list').html().replace(list_template_regexp, '/{{id}}')
15
+ @list_template = Handlebars.compile(list_template_html)
16
+ @items = null
17
+ @options = options
18
+
19
+ Handlebars.registerPartial('list', list_template_html)
20
+
21
+ @fetch()
22
+
23
+ # Fetches the sitemap from JSON
24
+ fetch: (foldingId) ->
25
+ self = Alchemy.Sitemap
26
+
27
+ if foldingId
28
+ spinner = Alchemy.Spinner.small()
29
+ spinTarget = $('#fold_button_' + foldingId)
30
+ renderTarget = $('#page_' + foldingId)
31
+ renderTemplate = @list_template
32
+ pageId = foldingId
33
+ else
34
+ spinner = @options.spinner || Alchemy.Spinner.medium()
35
+ spinTarget = @sitemap_wrapper
36
+ renderTarget = @sitemap_wrapper
37
+ renderTemplate = @template
38
+ pageId = @options.page_root_id
39
+
40
+ spinner.spin(spinTarget[0])
41
+
42
+ request = $.ajax url: @options.url, data:
43
+ id: pageId
44
+ full: @options.full
45
+
46
+ request.done (data) ->
47
+ # This will also remove the spinner
48
+ renderTarget.replaceWith(renderTemplate({children: data.pages}))
49
+ self.items = $(".sitemap_page", '#sitemap')
50
+ self._observe()
51
+
52
+ Alchemy.watchForDialogs('#sitemap')
53
+
54
+ if self.options.ready
55
+ self.options.ready()
56
+
57
+ request.fail (jqXHR, status) ->
58
+ Alchemy.debug("Request failed: " + status)
13
59
 
14
60
  # Filters the sitemap
15
61
  filter: (term) ->
@@ -27,10 +73,10 @@ Alchemy.Sitemap =
27
73
  self.filter_field_clear.show()
28
74
  length = results.length
29
75
  if length == 1
30
- self.display.show().text("1 #{Alchemy._t('page_found')}")
76
+ self.display.show().text("1 #{Alchemy.t('page_found')}")
31
77
  $.scrollTo(results[0], {duration: 400, offset: -80})
32
78
  else if length > 1
33
- self.display.show().text("#{length} #{Alchemy._t('pages_found')}")
79
+ self.display.show().text("#{length} #{Alchemy.t('pages_found')}")
34
80
  else
35
81
  self.items.removeClass('no-match highlight')
36
82
  self.display.hide()