alchemy_cms 2.5.3.1 → 2.6.0.rc5

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 (331) hide show
  1. data/.gitignore +1 -1
  2. data/.travis.yml +5 -13
  3. data/Gemfile +6 -3
  4. data/README.md +3 -2
  5. data/alchemy_cms.gemspec +22 -22
  6. data/app/assets/fonts/alchemy-icons.eot +0 -0
  7. data/app/assets/fonts/alchemy-icons.svg +54 -0
  8. data/app/assets/fonts/alchemy-icons.ttf +0 -0
  9. data/app/assets/fonts/alchemy-icons.woff +0 -0
  10. data/app/assets/images/alchemy/icons.png +0 -0
  11. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +151 -0
  12. data/app/assets/javascripts/alchemy/alchemy.buttons.js.coffee +3 -2
  13. data/app/assets/javascripts/alchemy/alchemy.datepicker.js.coffee +31 -0
  14. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +1 -1
  15. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +98 -0
  16. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +23 -24
  17. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +27 -0
  18. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +11 -8
  19. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +32 -0
  20. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +46 -0
  21. data/app/assets/javascripts/alchemy/alchemy.js +8 -2
  22. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +5 -4
  23. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +49 -0
  24. data/app/assets/javascripts/alchemy/alchemy.onload.js.coffee +3 -0
  25. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +71 -0
  26. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +61 -0
  27. data/app/assets/javascripts/alchemy/alchemy.spinner.js.coffee +35 -0
  28. data/app/assets/javascripts/alchemy/alchemy.string_extension.js.coffee +11 -0
  29. data/app/assets/javascripts/alchemy/alchemy.windows.js.coffee +278 -0
  30. data/app/assets/stylesheets/alchemy/admin.css.scss +2 -0
  31. data/app/assets/stylesheets/alchemy/archive.scss +109 -65
  32. data/app/assets/stylesheets/alchemy/base.scss +16 -188
  33. data/app/assets/stylesheets/alchemy/dashboard.scss +2 -2
  34. data/app/assets/stylesheets/alchemy/defaults.scss +2 -1
  35. data/app/assets/stylesheets/alchemy/elements.scss +58 -94
  36. data/app/assets/stylesheets/alchemy/errors.scss +2 -2
  37. data/app/assets/stylesheets/alchemy/{mixins.scss → extends.scss} +104 -80
  38. data/app/assets/stylesheets/alchemy/flash.scss +4 -6
  39. data/app/assets/stylesheets/alchemy/fonts.scss +46 -0
  40. data/app/assets/stylesheets/alchemy/form_elements.scss +46 -45
  41. data/app/assets/stylesheets/alchemy/frame.scss +20 -15
  42. data/app/assets/stylesheets/alchemy/icons.scss +22 -9
  43. data/app/assets/stylesheets/alchemy/jquery-ui.scss +476 -399
  44. data/app/assets/stylesheets/alchemy/login.scss +1 -1
  45. data/app/assets/stylesheets/alchemy/menubar.css.scss +1 -1
  46. data/app/assets/stylesheets/alchemy/notices.scss +5 -5
  47. data/app/assets/stylesheets/alchemy/pagination.scss +25 -13
  48. data/app/assets/stylesheets/alchemy/search.scss +29 -17
  49. data/app/assets/stylesheets/alchemy/sitemap.scss +41 -36
  50. data/app/assets/stylesheets/alchemy/tables.scss +102 -50
  51. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +18 -16
  52. data/app/assets/stylesheets/alchemy/toolbar.scss +84 -24
  53. data/app/assets/stylesheets/alchemy/upload.scss +14 -9
  54. data/app/assets/stylesheets/alchemy/variables.scss +1 -0
  55. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +18 -21
  56. data/app/controllers/alchemy/admin/attachments_controller.rb +29 -39
  57. data/app/controllers/alchemy/admin/base_controller.rb +3 -9
  58. data/app/controllers/alchemy/admin/clipboard_controller.rb +1 -1
  59. data/app/controllers/alchemy/admin/contents_controller.rb +1 -1
  60. data/app/controllers/alchemy/admin/dashboard_controller.rb +1 -1
  61. data/app/controllers/alchemy/admin/elements_controller.rb +3 -3
  62. data/app/controllers/alchemy/admin/essence_files_controller.rb +1 -1
  63. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +5 -5
  64. data/app/controllers/alchemy/admin/languages_controller.rb +1 -1
  65. data/app/controllers/alchemy/admin/pages_controller.rb +18 -16
  66. data/app/controllers/alchemy/admin/pictures_controller.rb +11 -10
  67. data/app/controllers/alchemy/admin/resources_controller.rb +87 -14
  68. data/app/controllers/alchemy/admin/tags_controller.rb +3 -3
  69. data/app/controllers/alchemy/admin/trash_controller.rb +3 -3
  70. data/app/controllers/alchemy/admin/users_controller.rb +6 -11
  71. data/app/controllers/alchemy/attachments_controller.rb +8 -9
  72. data/app/controllers/alchemy/base_controller.rb +17 -10
  73. data/app/controllers/alchemy/pages_controller.rb +7 -19
  74. data/app/controllers/alchemy/passwords_controller.rb +15 -3
  75. data/app/controllers/alchemy/user_sessions_controller.rb +5 -4
  76. data/app/controllers/alchemy/users_controller.rb +1 -1
  77. data/app/helpers/alchemy/admin/attachments_helper.rb +2 -2
  78. data/app/helpers/alchemy/admin/base_helper.rb +62 -90
  79. data/app/helpers/alchemy/admin/elements_helper.rb +13 -5
  80. data/app/helpers/alchemy/admin/essences_helper.rb +3 -5
  81. data/app/helpers/alchemy/admin/pages_helper.rb +6 -3
  82. data/app/helpers/alchemy/admin/tags_helper.rb +60 -0
  83. data/app/helpers/alchemy/base_helper.rb +16 -20
  84. data/app/helpers/alchemy/elements_helper.rb +7 -11
  85. data/app/helpers/alchemy/essences_helper.rb +2 -2
  86. data/app/helpers/alchemy/pages_helper.rb +31 -69
  87. data/app/helpers/alchemy/url_helper.rb +11 -3
  88. data/app/models/alchemy/attachment.rb +73 -45
  89. data/app/models/alchemy/cell.rb +1 -1
  90. data/app/models/alchemy/content.rb +20 -9
  91. data/app/models/alchemy/element.rb +9 -7
  92. data/app/models/alchemy/page.rb +15 -248
  93. data/app/models/alchemy/page/cells.rb +71 -0
  94. data/app/models/alchemy/page/elements.rb +147 -0
  95. data/app/models/alchemy/page/naming.rb +90 -0
  96. data/app/models/alchemy/picture.rb +18 -13
  97. data/app/models/alchemy/tag.rb +1 -1
  98. data/app/models/alchemy/user.rb +38 -6
  99. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +14 -7
  100. data/app/views/alchemy/admin/attachments/_attachment.html.erb +17 -12
  101. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +3 -8
  102. data/app/views/alchemy/admin/attachments/_files_list.html.erb +20 -12
  103. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +11 -0
  104. data/app/views/alchemy/admin/attachments/_tag_list.html.erb +31 -0
  105. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +4 -0
  106. data/app/views/alchemy/admin/attachments/edit.html.erb +8 -7
  107. data/app/views/alchemy/admin/attachments/index.html.erb +19 -12
  108. data/app/views/alchemy/admin/attachments/new.html.erb +2 -2
  109. data/app/views/alchemy/admin/attachments/show.html.erb +3 -0
  110. data/app/views/alchemy/admin/contents/_missing.html.erb +4 -4
  111. data/app/views/alchemy/admin/contents/create.js.erb +1 -1
  112. data/app/views/alchemy/admin/contents/new.html.erb +6 -3
  113. data/app/views/alchemy/admin/dashboard/_locked_pages.html.erb +1 -1
  114. data/app/views/alchemy/admin/dashboard/_users.html.erb +1 -1
  115. data/app/views/alchemy/admin/dashboard/index.html.erb +3 -3
  116. data/app/views/alchemy/admin/dashboard/info.html.erb +16 -13
  117. data/app/views/alchemy/admin/elements/_add_picture.html.erb +1 -1
  118. data/app/views/alchemy/admin/elements/_element_foot.html.erb +4 -4
  119. data/app/views/alchemy/admin/elements/_element_head.html.erb +1 -7
  120. data/app/views/alchemy/admin/elements/_elements_select.html.erb +2 -2
  121. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +4 -4
  122. data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +1 -1
  123. data/app/views/alchemy/admin/elements/create.js.erb +2 -2
  124. data/app/views/alchemy/admin/elements/fold.js.erb +3 -6
  125. data/app/views/alchemy/admin/elements/new.html.erb +1 -1
  126. data/app/views/alchemy/admin/elements/order.js.erb +1 -1
  127. data/app/views/alchemy/admin/elements/trash.js.erb +1 -1
  128. data/app/views/alchemy/admin/elements/update.js.erb +2 -2
  129. data/app/views/alchemy/admin/essence_files/edit.html.erb +4 -4
  130. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +17 -18
  131. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +2 -2
  132. data/app/views/alchemy/admin/essence_pictures/update.js.erb +1 -0
  133. data/app/views/alchemy/admin/languages/_form.html.erb +12 -10
  134. data/app/views/alchemy/admin/languages/_language.html.erb +2 -1
  135. data/app/views/alchemy/admin/languages/_table.html.erb +3 -3
  136. data/app/views/alchemy/admin/languages/index.html.erb +15 -15
  137. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +6 -6
  138. data/app/views/alchemy/admin/layoutpages/index.html.erb +41 -40
  139. data/app/views/alchemy/admin/pages/_contactform_links.html.erb +4 -4
  140. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +6 -6
  141. data/app/views/alchemy/admin/pages/_external_link.html.erb +2 -2
  142. data/app/views/alchemy/admin/pages/_file_link.html.erb +3 -3
  143. data/app/views/alchemy/admin/pages/_internal_link.html.erb +1 -1
  144. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +1 -1
  145. data/app/views/alchemy/admin/pages/_page.html.erb +13 -13
  146. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +2 -4
  147. data/app/views/alchemy/admin/pages/_sitemap.html.erb +5 -0
  148. data/app/views/alchemy/admin/pages/configure.html.erb +7 -7
  149. data/app/views/alchemy/admin/pages/configure_external.html.erb +4 -4
  150. data/app/views/alchemy/admin/pages/edit.html.erb +23 -30
  151. data/app/views/alchemy/admin/pages/index.html.erb +34 -23
  152. data/app/views/alchemy/admin/pages/new.html.erb +1 -1
  153. data/app/views/alchemy/admin/pages/sort.js.erb +1 -1
  154. data/app/views/alchemy/admin/partials/_flash_upload.html.erb +2 -3
  155. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +2 -2
  156. data/app/views/alchemy/admin/partials/_search_form.html.erb +3 -3
  157. data/app/views/alchemy/admin/partials/_upload_form.html.erb +2 -2
  158. data/app/views/alchemy/admin/pictures/_archive.html.erb +7 -7
  159. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +1 -1
  160. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +6 -6
  161. data/app/views/alchemy/admin/pictures/_filter_bar.html.erb +4 -4
  162. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +1 -1
  163. data/app/views/alchemy/admin/pictures/_picture.html.erb +3 -8
  164. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +9 -14
  165. data/app/views/alchemy/admin/pictures/_tag_list.html.erb +27 -25
  166. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +3 -1
  167. data/app/views/alchemy/admin/pictures/index.html.erb +49 -42
  168. data/app/views/alchemy/admin/pictures/new.html.erb +2 -2
  169. data/app/views/alchemy/admin/pictures/show.html.erb +11 -0
  170. data/app/views/alchemy/admin/resources/_boolean.html.erb +2 -2
  171. data/app/views/alchemy/admin/resources/_datetime.html.erb +2 -2
  172. data/app/views/alchemy/admin/resources/_form.html.erb +9 -8
  173. data/app/views/alchemy/admin/resources/_resource.html.erb +15 -21
  174. data/app/views/alchemy/admin/resources/_string.html.erb +2 -2
  175. data/app/views/alchemy/admin/resources/_table.html.erb +11 -13
  176. data/app/views/alchemy/admin/resources/_text.html.erb +2 -2
  177. data/app/views/alchemy/admin/resources/index.csv.erb +13 -0
  178. data/app/views/alchemy/admin/resources/index.html.erb +24 -15
  179. data/app/views/alchemy/admin/sites/index.html.erb +23 -0
  180. data/app/views/alchemy/admin/tags/_radio_tag.html.erb +1 -1
  181. data/app/views/alchemy/admin/tags/_tag.html.erb +2 -1
  182. data/app/views/alchemy/admin/tags/edit.html.erb +1 -1
  183. data/app/views/alchemy/admin/tags/index.html.erb +16 -11
  184. data/app/views/alchemy/admin/tags/new.html.erb +3 -3
  185. data/app/views/alchemy/admin/trash/clear.js.coffee +1 -1
  186. data/app/views/alchemy/admin/users/_table.html.erb +12 -5
  187. data/app/views/alchemy/admin/users/_user.html.erb +16 -16
  188. data/app/views/alchemy/admin/users/index.html.erb +28 -16
  189. data/app/views/alchemy/breadcrumb/_page.html.erb +15 -0
  190. data/app/views/alchemy/breadcrumb/_spacer.html.erb +1 -0
  191. data/app/views/alchemy/elements/_editor_not_found.html.erb +1 -1
  192. data/app/views/alchemy/essences/_essence_file_editor.html.erb +16 -16
  193. data/app/views/alchemy/essences/_essence_file_view.html.erb +8 -9
  194. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +3 -6
  195. data/app/views/alchemy/essences/_essence_picture_tools.html.erb +9 -8
  196. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +0 -5
  197. data/app/views/alchemy/essences/_linkable_essence_tools.html.erb +2 -2
  198. data/app/views/alchemy/navigation/_link.html.erb +7 -7
  199. data/app/views/alchemy/navigation/_renderer.html.erb +29 -36
  200. data/app/views/alchemy/notifications/admin_user_created.de.text.erb +5 -1
  201. data/app/views/alchemy/notifications/admin_user_created.en.text.erb +5 -1
  202. data/app/views/alchemy/notifications/registered_user_created.de.text.erb +13 -0
  203. data/app/views/alchemy/notifications/registered_user_created.en.text.erb +13 -0
  204. data/app/views/alchemy/search/_result.html.erb +4 -6
  205. data/app/views/alchemy/search/_results.html.erb +4 -5
  206. data/app/views/alchemy/user_sessions/leave.html.erb +1 -1
  207. data/app/views/alchemy/user_sessions/new.html.erb +2 -2
  208. data/app/views/kaminari/_first_page.html.erb +11 -0
  209. data/app/views/kaminari/_gap.html.erb +1 -1
  210. data/app/views/kaminari/_last_page.html.erb +11 -0
  211. data/app/views/kaminari/_next_page.html.erb +2 -2
  212. data/app/views/kaminari/_page.html.erb +1 -1
  213. data/app/views/kaminari/_paginator.html.erb +2 -0
  214. data/app/views/kaminari/_prev_page.html.erb +2 -2
  215. data/app/views/layouts/alchemy/admin.html.erb +4 -5
  216. data/config/alchemy/config.yml +8 -12
  217. data/config/authorization_rules.rb +4 -3
  218. data/config/initializers/dragonfly.rb +20 -12
  219. data/config/locales/alchemy.de.yml +20 -15
  220. data/config/locales/alchemy.en.yml +15 -10
  221. data/config/locales/devise.de.yml +1 -0
  222. data/config/routes.rb +3 -3
  223. data/{spec/dummy/db/migrate/20121118000000_alchemy_two_point_four.rb → db/migrate/20130214233001_alchemy_two_point_five.rb} +50 -36
  224. data/db/migrate/20130221200514_migrate_attachments_to_dragonfly.rb +21 -0
  225. data/db/migrate/20130312205327_change_alchemy_users_role_to_roles.rb +11 -0
  226. data/lib/alchemy/capistrano.rb +10 -8
  227. data/lib/alchemy/errors.rb +7 -0
  228. data/lib/alchemy/filetypes.rb +33 -0
  229. data/lib/alchemy/i18n.rb +9 -1
  230. data/lib/alchemy/name_conversions.rb +28 -0
  231. data/lib/alchemy/page_layout.rb +5 -3
  232. data/lib/alchemy/resource.rb +132 -29
  233. data/lib/alchemy/resources_helper.rb +81 -12
  234. data/lib/alchemy/upgrader.rb +14 -276
  235. data/lib/alchemy/version.rb +1 -1
  236. data/lib/alchemy_cms.rb +17 -2
  237. data/lib/rails/generators/alchemy/deploy_script/templates/deploy.rb.tt +1 -1
  238. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +1 -1
  239. data/lib/tasks/alchemy/convert.rake +39 -0
  240. data/lib/tasks/alchemy/install.rake +4 -6
  241. data/lib/tasks/alchemy/upgrade.rake +18 -1
  242. data/spec/controllers/admin/clipboard_controller_spec.rb +4 -4
  243. data/spec/controllers/admin/elements_controller_spec.rb +23 -23
  244. data/spec/controllers/admin/pages_controller_spec.rb +15 -0
  245. data/spec/controllers/admin/resources_controller_spec.rb +1 -11
  246. data/spec/controllers/admin/trash_controller_spec.rb +9 -9
  247. data/spec/controllers/attachments_controller_spec.rb +3 -3
  248. data/spec/controllers/elements_controller_spec.rb +2 -2
  249. data/spec/controllers/pages_controller_spec.rb +160 -129
  250. data/spec/controllers/pictures_controller_spec.rb +2 -2
  251. data/spec/controllers/user_sessions_controller_spec.rb +3 -3
  252. data/spec/controllers/users_controller_spec.rb +2 -2
  253. data/spec/dummy/app/models/event.rb +2 -2
  254. data/spec/dummy/app/models/location.rb +4 -0
  255. data/spec/dummy/app/views/layouts/application.html.erb +6 -42
  256. data/spec/dummy/config/routes.rb +1 -1
  257. data/spec/dummy/db/migrate/20121026104128_create_events.rb +0 -1
  258. data/{db/migrate/20121118000000_alchemy_two_point_four.rb → spec/dummy/db/migrate/20130214233001_alchemy_two_point_five.rb} +50 -36
  259. data/spec/dummy/db/migrate/20130221200514_migrate_attachments_to_dragonfly.rb +21 -0
  260. data/spec/dummy/db/migrate/20130312205327_change_alchemy_users_role_to_roles.rb +11 -0
  261. data/spec/dummy/db/migrate/20130328101418_create_locations.rb +9 -0
  262. data/spec/dummy/db/schema.rb +15 -6
  263. data/spec/factories.rb +4 -4
  264. data/spec/{integration → features}/admin/link_overlay_spec.rb +0 -0
  265. data/spec/{integration → features}/admin/modules_integration_spec.rb +1 -1
  266. data/spec/{integration → features}/admin/pages_controller_spec.rb +9 -4
  267. data/spec/{integration → features}/admin/picture_library_integration_spec.rb +5 -5
  268. data/spec/{integration → features}/admin/resources_integration_spec.rb +1 -1
  269. data/spec/{integration → features}/navigation_spec.rb +0 -0
  270. data/spec/{integration → features}/pages_controller_spec.rb +42 -112
  271. data/spec/{integration → features}/picture_security_spec.rb +2 -2
  272. data/spec/{integration → features}/security_spec.rb +7 -7
  273. data/spec/{integration → features}/translation_integration_spec.rb +0 -0
  274. data/spec/helpers/admin/base_helper_spec.rb +0 -50
  275. data/spec/helpers/admin/tags_helper_spec.rb +53 -0
  276. data/spec/helpers/base_helper_spec.rb +19 -3
  277. data/spec/helpers/pages_helper_spec.rb +92 -44
  278. data/spec/{url_helpers_spec.rb → helpers/picture_url_helpers_spec.rb} +7 -7
  279. data/spec/helpers/url_helper_spec.rb +92 -72
  280. data/spec/{config_spec.rb → libraries/config_spec.rb} +0 -0
  281. data/spec/libraries/resource_spec.rb +215 -76
  282. data/spec/libraries/resources_helper_spec.rb +70 -28
  283. data/spec/models/attachment_spec.rb +75 -9
  284. data/spec/models/clipboard_spec.rb +1 -1
  285. data/spec/models/element_spec.rb +7 -0
  286. data/spec/models/page_spec.rb +144 -25
  287. data/spec/models/picture_spec.rb +5 -5
  288. data/spec/models/resource_spec.rb +47 -10
  289. data/spec/models/user_spec.rb +115 -3
  290. data/spec/{routing_spec.rb → routing/routing_spec.rb} +8 -20
  291. data/spec/spec_helper.rb +5 -6
  292. data/spec/support/alchemy/specs_helpers.rb +1 -1
  293. data/spec/support/ci/install_phantomjs +1 -1
  294. data/spec/support/image with spaces.png +0 -0
  295. data/vendor/assets/javascripts/jquery_plugins/jquery.Jcrop.min.js +18 -18
  296. data/vendor/assets/javascripts/jquery_plugins/{jquery.dialogextend.1_0_1.js → jquery.dialogextend.js} +25 -17
  297. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo.min.js +7 -0
  298. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +7 -7
  299. data/vendor/assets/javascripts/keymage.min.js +6 -0
  300. data/vendor/assets/javascripts/spin.min.js +1 -0
  301. metadata +122 -124
  302. data/app/assets/images/alchemy/ajax_loader.gif +0 -0
  303. data/app/assets/images/alchemy/gui/toggle.png +0 -0
  304. data/app/assets/images/alchemy/image_loader.gif +0 -0
  305. data/app/assets/images/alchemy/shading.png +0 -0
  306. data/app/assets/images/alchemy/tabs.gif +0 -0
  307. data/app/assets/javascripts/alchemy/alchemy.base.js +0 -172
  308. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +0 -47
  309. data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +0 -91
  310. data/app/assets/javascripts/alchemy/alchemy.growler.js +0 -46
  311. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +0 -60
  312. data/app/assets/javascripts/alchemy/alchemy.js_extensions.js +0 -15
  313. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +0 -97
  314. data/app/assets/javascripts/alchemy/alchemy.windows.js +0 -321
  315. data/app/models/alchemy/clipboard_spec.rb +0 -0
  316. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +0 -8
  317. data/app/views/alchemy/notifications/registered_user_created.text.erb +0 -11
  318. data/db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb +0 -21
  319. data/db/migrate/20121205155004_create_alchemy_sites.rb +0 -14
  320. data/db/migrate/20121211163003_add_public_to_alchemy_sites.rb +0 -6
  321. data/db/migrate/20121220102223_add_aliases_to_site.rb +0 -6
  322. data/db/migrate/20130110212411_create_alchemy_legacy_page_urls.rb +0 -11
  323. data/db/migrate/20130121092645_migrate_to_devise.rb +0 -24
  324. data/spec/alchemy_spec.rb +0 -7
  325. data/spec/dummy/db/migrate/20121121162313_switch_from_fleximage_to_dragonfly.rb +0 -21
  326. data/spec/dummy/db/migrate/20121205155004_create_alchemy_sites.rb +0 -14
  327. data/spec/dummy/db/migrate/20121211163003_add_public_to_alchemy_sites.rb +0 -6
  328. data/spec/dummy/db/migrate/20121220102223_add_aliases_to_site.rb +0 -6
  329. data/spec/dummy/db/migrate/20130110212411_create_alchemy_legacy_page_urls.rb +0 -11
  330. data/spec/dummy/db/migrate/20130121092645_migrate_to_devise.rb +0 -24
  331. data/vendor/assets/javascripts/jquery_plugins/jquery.scrollTo-1.4.2-min.js +0 -11
@@ -22,12 +22,6 @@ module Alchemy
22
22
  show_error_notice(e)
23
23
  end
24
24
 
25
- # Logs the current exception to the error log.
26
- def exception_logger(e)
27
- Rails.logger.error("\n#{e.class} #{e.message} in #{e.backtrace.first}")
28
- Rails.logger.error(e.backtrace[1..50].each { |l| l.gsub(/#{Rails.root.to_s}/, '') }.join("\n"))
29
- end
30
-
31
25
  # Displays an error notice in the Alchemy backend.
32
26
  def show_error_notice(e)
33
27
  # truncate the message, because very long error messages (i.e from mysql2) causes cookie oveflow errors
@@ -42,10 +36,10 @@ module Alchemy
42
36
  end
43
37
 
44
38
  def redirect_back_or_to_default(default_path = admin_dashboard_path)
45
- if request.env["HTTP_REFERER"].blank?
46
- redirect_to default_path
47
- else
39
+ if request.referer.present?
48
40
  redirect_to :back
41
+ else
42
+ redirect_to default_path
49
43
  end
50
44
  end
51
45
 
@@ -7,7 +7,7 @@ module Alchemy
7
7
  @clipboard = get_clipboard
8
8
  @clipboard_items = model_class.all_from_clipboard(@clipboard.all(params[:remarkable_type]))
9
9
  respond_to do |format|
10
- format.html { render :layout => false }
10
+ format.html { render layout: !request.xhr? }
11
11
  end
12
12
  end
13
13
 
@@ -8,7 +8,7 @@ module Alchemy
8
8
  @element = Element.find(params[:element_id])
9
9
  @contents = @element.available_contents
10
10
  @content = @element.contents.build
11
- render :layout => false
11
+ render layout: !request.xhr?
12
12
  end
13
13
 
14
14
  def create
@@ -14,7 +14,7 @@ module Alchemy
14
14
 
15
15
  def info
16
16
  @alchemy_version = Alchemy.version
17
- render :layout => false
17
+ render layout: !request.xhr?
18
18
  end
19
19
 
20
20
  def update_check
@@ -12,7 +12,7 @@ module Alchemy
12
12
  else
13
13
  @elements = @page.elements_grouped_by_cells
14
14
  end
15
- render :layout => false
15
+ render layout: !request.xhr?
16
16
  end
17
17
 
18
18
  def list
@@ -31,7 +31,7 @@ module Alchemy
31
31
  unless clipboard_elements.blank?
32
32
  @clipboard_items = Element.all_from_clipboard_for_page(clipboard_elements, @page)
33
33
  end
34
- render :layout => false
34
+ render layout: !request.xhr?
35
35
  end
36
36
 
37
37
  # Creates a element as discribed in config/alchemy/elements.yml on page via AJAX.
@@ -65,7 +65,7 @@ module Alchemy
65
65
  # And then updates the element itself.
66
66
  def update
67
67
  @element = Element.find_by_id(params[:id])
68
- if @element.save_contents(params)
68
+ if @element.save_contents(params[:contents])
69
69
  @page = @element.page
70
70
  @element_validated = @element.update_attributes!(params[:element])
71
71
  else
@@ -7,7 +7,7 @@ module Alchemy
7
7
  def edit
8
8
  @content = Content.find(params[:id])
9
9
  @essence_file = @content.essence
10
- render :layout => false
10
+ render layout: !request.xhr?
11
11
  end
12
12
 
13
13
  def update
@@ -10,7 +10,7 @@ module Alchemy
10
10
  @essence_picture = EssencePicture.find(params[:id])
11
11
  @content = Content.find(params[:content_id])
12
12
  @options = params[:options] || {}
13
- render :layout => false
13
+ render layout: !request.xhr?
14
14
  end
15
15
 
16
16
  def crop
@@ -44,7 +44,7 @@ module Alchemy
44
44
  else
45
45
  @no_image_notice = _t('No image found. Did you saved the element?')
46
46
  end
47
- render :layout => false
47
+ render layout: !request.xhr?
48
48
  end
49
49
 
50
50
  def update
@@ -55,8 +55,8 @@ module Alchemy
55
55
  end
56
56
 
57
57
  def assign
58
- @content = Content.find(params[:id])
59
- @picture = Picture.find(params[:picture_id])
58
+ @content = Content.find_by_id(params[:id])
59
+ @picture = Picture.find_by_id(params[:picture_id])
60
60
  @content.essence.picture = @picture
61
61
  @options = params[:options] || {}
62
62
  @element = @content.element
@@ -76,7 +76,7 @@ module Alchemy
76
76
  @picture_essence.link = params[:link]
77
77
  @picture_essence.link_title = params[:title]
78
78
  @picture_essence.open_link_in_new_window = params[:blank]
79
- @notice = _t("saved_link")
79
+ @notice = _t(:saved_link)
80
80
  @picture_essence.save
81
81
  end
82
82
 
@@ -8,7 +8,7 @@ module Alchemy
8
8
  render :layout => !request.xhr?
9
9
  end
10
10
 
11
- protected
11
+ protected
12
12
 
13
13
  def configured_page_layout
14
14
  Alchemy::Config.get(:default_language).try('[]', 'page_layout')
@@ -45,14 +45,15 @@ module Alchemy
45
45
  @page = Page.new(:layoutpage => params[:layoutpage] == 'true', :parent_id => params[:parent_id])
46
46
  @page_layouts = PageLayout.layouts_for_select(session[:language_id], @page.layoutpage?)
47
47
  @clipboard_items = Page.all_from_clipboard_for_select(get_clipboard[:pages], session[:language_id], @page.layoutpage?)
48
- render :layout => false
48
+ render layout: !request.xhr?
49
49
  end
50
50
 
51
51
  def create
52
52
  parent = Page.find_by_id(params[:page][:parent_id]) || Page.root
53
53
  params[:page][:language_id] ||= parent.language ? parent.language.id : Language.get_default.id
54
54
  params[:page][:language_code] ||= parent.language ? parent.language.code : Language.get_default.code
55
- if !params[:paste_from_clipboard].blank?
55
+ # Copy the page
56
+ if params[:paste_from_clipboard].present?
56
57
  source_page = Page.find(params[:paste_from_clipboard])
57
58
  @page = Page.copy(source_page, {
58
59
  :parent_id => params[:page][:parent_id],
@@ -64,14 +65,15 @@ module Alchemy
64
65
  source_page.copy_children_to(@page)
65
66
  end
66
67
  else
67
- @page = Page.create(params[:page])
68
+ # Create new page
69
+ @page = Page.new(params[:page])
70
+ end
71
+ if @page.save
72
+ redirect_path = params[:redirect_to] || edit_admin_page_path(@page)
73
+ else
74
+ # TODO: Make a rollback, because the page is already persisted here.
75
+ redirect_path = admin_pages_path
68
76
  end
69
- redirect_path =
70
- if @page.valid?
71
- params[:redirect_to] || edit_admin_page_path(@page)
72
- else
73
- admin_pages_path
74
- end
75
77
  render_errors_or_redirect(@page, redirect_path, _t("Page created", :name => @page.name))
76
78
  end
77
79
 
@@ -79,7 +81,7 @@ module Alchemy
79
81
  def edit
80
82
  # fetching page via before filter
81
83
  if @page.locked? && @page.locker && @page.locker.logged_in? && @page.locker != current_user
82
- flash[:notice] = _t("This page is locked by %{name}", :name => (@page.locker.name rescue _t('unknown')))
84
+ flash[:notice] = _t("This page is locked by %{name}", :name => (@page.locker.name rescue _t(:unknown)))
83
85
  redirect_to admin_pages_path
84
86
  else
85
87
  @page.lock(current_user)
@@ -92,10 +94,10 @@ module Alchemy
92
94
  def configure
93
95
  # fetching page via before filter
94
96
  if @page.redirects_to_external?
95
- render :action => 'configure_external', :layout => false
97
+ render action: 'configure_external', layout: !request.xhr?
96
98
  else
97
99
  @page_layouts = PageLayout.layouts_with_own_for_select(@page.page_layout, session[:language_id], @page.layoutpage?)
98
- render :layout => false
100
+ render layout: !request.xhr?
99
101
  end
100
102
  end
101
103
 
@@ -144,7 +146,7 @@ module Alchemy
144
146
  if multi_language?
145
147
  @url_prefix = "#{session[:language_code]}/"
146
148
  end
147
- render :layout => false
149
+ render layout: !request.xhr?
148
150
  end
149
151
 
150
152
  def fold
@@ -160,7 +162,7 @@ module Alchemy
160
162
  def unlock
161
163
  # fetching page via before filter
162
164
  @page.unlock
163
- flash[:notice] = _t("unlocked_page", :name => @page.name)
165
+ flash[:notice] = _t(:unlocked_page, :name => @page.name)
164
166
  @pages_locked_by_user = Page.from_current_site.all_locked_by(current_user)
165
167
  respond_to do |format|
166
168
  format.js
@@ -179,7 +181,7 @@ module Alchemy
179
181
  def publish
180
182
  # fetching page via before filter
181
183
  @page.publish!
182
- flash[:notice] = _t("page_published", :name => @page.name)
184
+ flash[:notice] = _t(:page_published, :name => @page.name)
183
185
  redirect_back_or_to_default(admin_pages_path)
184
186
  end
185
187
 
@@ -197,7 +199,7 @@ module Alchemy
197
199
  )
198
200
  new_language_root.move_to_child_of Page.root
199
201
  original_language_root.copy_children_to(new_language_root)
200
- flash[:notice] = _t('language_pages_copied')
202
+ flash[:notice] = _t(:language_pages_copied)
201
203
  redirect_to params[:layoutpage] == "true" ? admin_layoutpages_path : :action => :index
202
204
  end
203
205
 
@@ -2,6 +2,7 @@ module Alchemy
2
2
  module Admin
3
3
  class PicturesController < Alchemy::Admin::BaseController
4
4
  protect_from_forgery :except => [:create]
5
+ helper 'alchemy/admin/tags'
5
6
 
6
7
  cache_sweeper Alchemy::PicturesSweeper, :only => [:update, :destroy]
7
8
 
@@ -37,7 +38,7 @@ module Alchemy
37
38
  @page = params[:page]
38
39
  @per_page = params[:per_page]
39
40
  end
40
- render :layout => false
41
+ render layout: !request.xhr?
41
42
  end
42
43
 
43
44
  def create
@@ -68,6 +69,11 @@ module Alchemy
68
69
  end
69
70
  end
70
71
 
72
+ def show
73
+ @picture = Picture.find(params[:id])
74
+ render layout: !request.xhr?
75
+ end
76
+
71
77
  def edit
72
78
  @picture = Picture.find(params[:id])
73
79
  render :layout => !request.xhr?
@@ -82,9 +88,9 @@ module Alchemy
82
88
  @picture = Picture.find(params[:id])
83
89
 
84
90
  if @picture.update_attributes(params[:picture])
85
- flash[:notice] = _t('picture_updated_successfully', :name => @picture.name)
91
+ flash[:notice] = _t(:picture_updated_successfully, :name => @picture.name)
86
92
  else
87
- flash[:error] = _t('picture_update_failed')
93
+ flash[:error] = _t(:picture_update_failed)
88
94
  end
89
95
  redirect_to_index
90
96
  end
@@ -146,14 +152,9 @@ module Alchemy
146
152
  @notice = _t('Picture cache flushed')
147
153
  end
148
154
 
149
- def show_in_window
150
- @picture = Picture.find(params[:id])
151
- render :layout => false
152
- end
153
-
154
155
  def info
155
156
  @picture = Picture.find(params[:id])
156
- render :layout => false
157
+ render layout: !request.xhr?
157
158
  end
158
159
 
159
160
  private
@@ -171,7 +172,7 @@ module Alchemy
171
172
  end
172
173
 
173
174
  def in_overlay?
174
- !params[:element_id].blank?
175
+ params[:element_id].present?
175
176
  end
176
177
 
177
178
  def archive_overlay
@@ -1,3 +1,5 @@
1
+ require 'csv'
2
+
1
3
  module Alchemy
2
4
  module Admin
3
5
  class ResourcesController < Alchemy::Admin::BaseController
@@ -8,25 +10,40 @@ module Alchemy
8
10
 
9
11
  before_filter :load_resource, :only => [:show, :edit, :update, :destroy]
10
12
 
13
+ handles_sortable_columns do |c|
14
+ c.default_sort_value = :name
15
+ c.link_class = 'sortable'
16
+ c.indicator_class = {:asc => "sorted asc", :desc => "sorted desc"}
17
+ c.indicator_text = {:asc => "<i>&nbsp;&darr;&nbsp;</i>", :desc => "<i>&nbsp;&uarr;&nbsp;</i>"}
18
+ end
19
+
11
20
  def index
12
- if params[:query].blank?
13
- items = resource_handler.model
14
- else
15
- search_terms = ActiveRecord::Base.sanitize("%#{params[:query]}%")
16
- items = resource_handler.model.where(resource_handler.searchable_attributes.map { |attribute|
17
- "`#{resource_handler.model.table_name}`.`#{attribute[:name]}` LIKE #{search_terms}"
18
- }.join(" OR "))
21
+ items = resource_handler.model
22
+ if contains_relations?
23
+ items = items.includes(*resource_relations_names)
24
+ end
25
+ if params[:query].present?
26
+ items = query_items(items)
27
+ end
28
+ items = items.order(sort_order)
29
+ respond_to do |format|
30
+ format.html {
31
+ items = items.page(params[:page] || 1).per(per_page_value_for_screen_size)
32
+ instance_variable_set("@#{resource_handler.resources_name}", items)
33
+ }
34
+ format.csv {
35
+ instance_variable_set("@#{resource_handler.resources_name}", items)
36
+ }
19
37
  end
20
- instance_variable_set("@#{resource_handler.resources_name}", items.page(params[:page] || 1).per(per_page_value_for_screen_size))
21
38
  end
22
39
 
23
40
  def new
24
- instance_variable_set("@#{resource_handler.model_name}", resource_handler.model.new)
41
+ instance_variable_set("@#{resource_handler.resource_name}", resource_handler.model.new)
25
42
  render :layout => !request.xhr?
26
43
  end
27
44
 
28
45
  def show
29
- render :layout => !request.xhr?
46
+ render action: 'edit', layout: !request.xhr?
30
47
  end
31
48
 
32
49
  def edit
@@ -34,7 +51,7 @@ module Alchemy
34
51
  end
35
52
 
36
53
  def create
37
- instance_variable_set("@#{resource_handler.model_name}", resource_handler.model.new(params[resource_handler.namespaced_model_name.to_sym]))
54
+ instance_variable_set("@#{resource_handler.resource_name}", resource_handler.model.new(params[resource_handler.namespaced_resource_name.to_sym]))
38
55
  resource_instance_variable.save
39
56
  render_errors_or_redirect(
40
57
  resource_instance_variable,
@@ -44,7 +61,7 @@ module Alchemy
44
61
  end
45
62
 
46
63
  def update
47
- resource_instance_variable.update_attributes(params[resource_handler.namespaced_model_name.to_sym])
64
+ resource_instance_variable.update_attributes(params[resource_handler.namespaced_resource_name.to_sym])
48
65
  render_errors_or_redirect(
49
66
  resource_instance_variable,
50
67
  resources_path,
@@ -75,7 +92,7 @@ module Alchemy
75
92
  when :destroy
76
93
  verb = "removed"
77
94
  end
78
- flash[:notice] = _t("#{resource_handler.model_name.classify} successfully #{verb}", :default => _t("Succesfully #{verb}"))
95
+ flash[:notice] = _t("#{resource_handler.resource_name.classify} successfully #{verb}", :default => _t("Succesfully #{verb}"))
79
96
  end
80
97
 
81
98
  def is_alchemy_module?
@@ -87,8 +104,64 @@ module Alchemy
87
104
  end
88
105
 
89
106
  def load_resource
90
- instance_variable_set("@#{resource_handler.model_name}", resource_handler.model.find(params[:id]))
107
+ instance_variable_set("@#{resource_handler.resource_name}", resource_handler.model.find(params[:id]))
108
+ end
109
+
110
+ # Returns a sort order for AR#sort method
111
+ #
112
+ # Falls back to fallback_sort_order, if the requested column is not a column of model.
113
+ #
114
+ # If the column is a tablename and column combination that matches any resource relations, than this order will be taken.
115
+ #
116
+ def sort_order
117
+ sortable_column_order do |column, direction|
118
+ if resource_handler.model_associations.present? && column.match(/\./)
119
+ table, column = column.split('.')
120
+ if resource_handler.model_associations.detect { |a| a.table_name == table }
121
+ "#{table}.#{column} #{direction}"
122
+ else
123
+ fallback_sort_order(direction)
124
+ end
125
+ elsif resource_handler.model.column_names.include?(column.to_s)
126
+ "#{resource_handler.model.table_name}.#{column} #{direction}"
127
+ else
128
+ fallback_sort_order(direction)
129
+ end
130
+ end
131
+ end
132
+
133
+ # Default sort order fallback
134
+ #
135
+ # Overwrite this in your controller to define custom fallback
136
+ #
137
+ def fallback_sort_order(direction)
138
+ "#{resource_handler.model.table_name}.id #{direction}"
139
+ end
140
+
141
+ # Returns an activerecord object that contains items matching params[:query]
142
+ #
143
+ def query_items(items)
144
+ query = params[:query].downcase.split(' ').join('%')
145
+ query = ActiveRecord::Base.sanitize("%#{query}%")
146
+ items.where(search_query(query))
147
+ end
148
+
149
+ # Returns a search query string
150
+ #
151
+ # It queries all searchable attributes from resource model via LIKE and joins them via OR.
152
+ #
153
+ # If the attribute is a relation it builds the query for the associated table.
154
+ #
155
+ def search_query(search_terms)
156
+ resource_handler.searchable_attributes.map do |attribute|
157
+ if relation = attribute[:relation]
158
+ "#{relation[:model_association].klass.table_name}.#{relation[:attr_method]} LIKE #{search_terms}"
159
+ else
160
+ "#{resource_handler.model.table_name}.#{attribute[:name]} LIKE #{search_terms}"
161
+ end
162
+ end.join(" OR ")
91
163
  end
164
+
92
165
  end
93
166
  end
94
167
  end
@@ -1,6 +1,6 @@
1
1
  module Alchemy
2
2
  module Admin
3
- class TagsController < BaseController
3
+ class TagsController < ResourcesController
4
4
 
5
5
  before_filter :load_tag, :only => [:edit, :update, :destroy]
6
6
 
@@ -12,7 +12,7 @@ module Alchemy
12
12
 
13
13
  def new
14
14
  @tag = ActsAsTaggableOn::Tag.new
15
- render :layout => false
15
+ render layout: !request.xhr?
16
16
  end
17
17
 
18
18
  def create
@@ -22,7 +22,7 @@ module Alchemy
22
22
 
23
23
  def edit
24
24
  @tags = ActsAsTaggableOn::Tag.order("name ASC").all - [@tag]
25
- render :layout => false
25
+ render layout: !request.xhr?
26
26
  end
27
27
 
28
28
  def update