alchemy_cms 2.1.12 → 2.2.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 (405) hide show
  1. data/.travis.yml +1 -1
  2. data/Gemfile +20 -16
  3. data/README.md +11 -7
  4. data/alchemy_cms.gemspec +31 -29
  5. data/app/assets/javascripts/alchemy/alchemy.base.js +234 -233
  6. data/app/assets/javascripts/alchemy/alchemy.buttons.js +26 -26
  7. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +32 -32
  8. data/app/assets/javascripts/alchemy/alchemy.dirty.js +78 -78
  9. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +103 -103
  10. data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +84 -84
  11. data/app/assets/javascripts/alchemy/alchemy.elements_window.js +88 -88
  12. data/app/assets/javascripts/alchemy/alchemy.file_progress.js +92 -0
  13. data/app/assets/javascripts/alchemy/alchemy.growler.js +23 -23
  14. data/app/assets/javascripts/alchemy/alchemy.html5.js +23 -0
  15. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +53 -52
  16. data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +33 -30
  17. data/app/assets/javascripts/alchemy/alchemy.js +2 -0
  18. data/app/assets/javascripts/alchemy/alchemy.js_extensions.js +14 -14
  19. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +181 -0
  20. data/app/assets/javascripts/alchemy/alchemy.menubar.js +48 -48
  21. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +39 -39
  22. data/app/assets/javascripts/alchemy/alchemy.preview.js +81 -83
  23. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +86 -86
  24. data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +23 -23
  25. data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +208 -353
  26. data/app/assets/javascripts/alchemy/alchemy.uploader.js +279 -0
  27. data/app/assets/javascripts/alchemy/alchemy.windows.js +268 -268
  28. data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +42 -42
  29. data/app/assets/stylesheets/alchemy/_defaults.scss +89 -89
  30. data/app/assets/stylesheets/alchemy/base.css.scss +790 -804
  31. data/app/assets/stylesheets/alchemy/buttons.css.scss +263 -264
  32. data/app/assets/stylesheets/alchemy/dashboard.css.scss +66 -66
  33. data/app/assets/stylesheets/alchemy/elements.css.scss +575 -564
  34. data/app/assets/stylesheets/alchemy/flash.css.scss +45 -45
  35. data/app/assets/stylesheets/alchemy/frame.css.scss +262 -262
  36. data/app/assets/stylesheets/alchemy/icons.css.scss +86 -86
  37. data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +706 -707
  38. data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +46 -27
  39. data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +107 -107
  40. data/app/assets/stylesheets/alchemy/login.css.scss +40 -38
  41. data/app/assets/stylesheets/alchemy/menubar.css.scss +84 -82
  42. data/app/assets/stylesheets/alchemy/modules.css.scss +9 -9
  43. data/app/assets/stylesheets/alchemy/pagination.css.scss +49 -49
  44. data/app/assets/stylesheets/alchemy/print.css +7 -7
  45. data/app/assets/stylesheets/alchemy/sitemap.css.scss +185 -154
  46. data/app/assets/stylesheets/alchemy/standard_set.css +205 -206
  47. data/app/assets/stylesheets/alchemy/tables.css.scss +94 -60
  48. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +34 -34
  49. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +177 -177
  50. data/app/assets/stylesheets/alchemy/upload.css.scss +68 -45
  51. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +222 -221
  52. data/app/controllers/alchemy/admin/attachments_controller.rb +100 -100
  53. data/app/controllers/alchemy/admin/base_controller.rb +116 -116
  54. data/app/controllers/alchemy/admin/clipboard_controller.rb +44 -44
  55. data/app/controllers/alchemy/admin/contents_controller.rb +55 -55
  56. data/app/controllers/alchemy/admin/dashboard_controller.rb +12 -11
  57. data/app/controllers/alchemy/admin/elements_controller.rb +109 -109
  58. data/app/controllers/alchemy/admin/essence_audios_controller.rb +8 -8
  59. data/app/controllers/alchemy/admin/essence_files_controller.rb +20 -20
  60. data/app/controllers/alchemy/admin/essence_flashes_controller.rb +8 -8
  61. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +81 -81
  62. data/app/controllers/alchemy/admin/essence_videos_controller.rb +8 -8
  63. data/app/controllers/alchemy/admin/languages_controller.rb +16 -4
  64. data/app/controllers/alchemy/admin/layoutpages_controller.rb +9 -9
  65. data/app/controllers/alchemy/admin/pages_controller.rb +249 -248
  66. data/app/controllers/alchemy/admin/pictures_controller.rb +105 -105
  67. data/app/controllers/alchemy/admin/resources_controller.rb +111 -166
  68. data/app/controllers/alchemy/admin/trash_controller.rb +18 -18
  69. data/app/controllers/alchemy/admin/users_controller.rb +69 -69
  70. data/app/controllers/alchemy/attachments_controller.rb +27 -27
  71. data/app/controllers/alchemy/base_controller.rb +159 -155
  72. data/app/controllers/alchemy/elements_controller.rb +16 -16
  73. data/app/controllers/alchemy/messages_controller.rb +59 -59
  74. data/app/controllers/alchemy/pages_controller.rb +194 -198
  75. data/app/controllers/alchemy/pictures_controller.rb +57 -57
  76. data/app/controllers/alchemy/user_sessions_controller.rb +70 -70
  77. data/app/helpers/alchemy/admin/attachments_helper.rb +7 -7
  78. data/app/helpers/alchemy/admin/base_helper.rb +425 -425
  79. data/app/helpers/alchemy/admin/contents_helper.rb +72 -72
  80. data/app/helpers/alchemy/admin/elements_helper.rb +108 -107
  81. data/app/helpers/alchemy/admin/essences_helper.rb +108 -108
  82. data/app/helpers/alchemy/admin/pages_helper.rb +42 -42
  83. data/app/helpers/alchemy/admin/pictures_helper.rb +26 -26
  84. data/app/helpers/alchemy/base_helper.rb +90 -90
  85. data/app/helpers/alchemy/elements_helper.rb +167 -168
  86. data/app/helpers/alchemy/essences_helper.rb +133 -133
  87. data/app/helpers/alchemy/pages_helper.rb +515 -526
  88. data/app/helpers/alchemy/pictures_helper.rb +19 -0
  89. data/app/mailers/alchemy/messages.rb +13 -13
  90. data/app/mailers/alchemy/notifications.rb +19 -19
  91. data/app/models/alchemy.rb +3 -3
  92. data/app/models/alchemy/attachment.rb +52 -78
  93. data/app/models/alchemy/cell.rb +48 -48
  94. data/app/models/alchemy/content.rb +196 -196
  95. data/app/models/alchemy/element.rb +500 -490
  96. data/app/models/alchemy/essence_audio.rb +7 -7
  97. data/app/models/alchemy/essence_date.rb +10 -10
  98. data/app/models/alchemy/essence_file.rb +7 -7
  99. data/app/models/alchemy/essence_flash.rb +6 -6
  100. data/app/models/alchemy/essence_html.rb +9 -9
  101. data/app/models/alchemy/essence_picture.rb +17 -17
  102. data/app/models/alchemy/essence_richtext.rb +53 -53
  103. data/app/models/alchemy/essence_text.rb +21 -21
  104. data/app/models/alchemy/essence_video.rb +7 -7
  105. data/app/models/alchemy/folded_page.rb +3 -3
  106. data/app/models/alchemy/language.rb +91 -91
  107. data/app/models/alchemy/language/code.rb +14 -14
  108. data/app/models/alchemy/message.rb +48 -45
  109. data/app/models/alchemy/page.rb +555 -558
  110. data/app/models/alchemy/picture.rb +100 -99
  111. data/app/models/alchemy/user.rb +76 -74
  112. data/app/models/alchemy/user_session.rb +8 -8
  113. data/app/sweepers/alchemy/content_sweeper.rb +15 -15
  114. data/app/sweepers/alchemy/pages_sweeper.rb +50 -50
  115. data/app/sweepers/alchemy/pictures_sweeper.rb +14 -14
  116. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +23 -23
  117. data/app/views/alchemy/admin/attachments/_attachment.html.erb +56 -56
  118. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +15 -15
  119. data/app/views/alchemy/admin/attachments/_files_list.html.erb +16 -16
  120. data/app/views/alchemy/admin/attachments/create.js.erb +2 -2
  121. data/app/views/alchemy/admin/attachments/destroy.js.erb +3 -3
  122. data/app/views/alchemy/admin/attachments/edit.html.erb +10 -10
  123. data/app/views/alchemy/admin/attachments/index.html.erb +14 -14
  124. data/app/views/alchemy/admin/attachments/new.html.erb +9 -9
  125. data/app/views/alchemy/admin/clipboard/index.html.erb +21 -21
  126. data/app/views/alchemy/admin/clipboard/insert.js.erb +5 -5
  127. data/app/views/alchemy/admin/contents/_missing.html.erb +1 -1
  128. data/app/views/alchemy/admin/contents/create.js.erb +33 -33
  129. data/app/views/alchemy/admin/contents/destroy.js.erb +5 -5
  130. data/app/views/alchemy/admin/contents/new.html.erb +13 -13
  131. data/app/views/alchemy/admin/contents/order.js.erb +2 -2
  132. data/app/views/alchemy/admin/dashboard/index.html.erb +96 -92
  133. data/app/views/alchemy/admin/elements/_add_content.html.erb +12 -12
  134. data/app/views/alchemy/admin/elements/_element.html.erb +3 -3
  135. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +28 -28
  136. data/app/views/alchemy/admin/elements/_picture_editor.html.erb +21 -21
  137. data/app/views/alchemy/admin/elements/create.js.erb +32 -32
  138. data/app/views/alchemy/admin/elements/index.html.erb +2 -2
  139. data/app/views/alchemy/admin/elements/new.html.erb +31 -31
  140. data/app/views/alchemy/admin/elements/order.js.erb +3 -3
  141. data/app/views/alchemy/admin/elements/trash.js.erb +13 -13
  142. data/app/views/alchemy/admin/elements/update.js.erb +6 -6
  143. data/app/views/alchemy/admin/essence_files/assign.js.erb +6 -6
  144. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +32 -32
  145. data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +1 -1
  146. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +1 -1
  147. data/app/views/alchemy/admin/essence_pictures/update.js.erb +11 -11
  148. data/app/views/alchemy/admin/languages/_form.html.erb +51 -45
  149. data/app/views/alchemy/admin/languages/_language.html.erb +45 -45
  150. data/app/views/alchemy/admin/languages/_table.html.erb +25 -25
  151. data/app/views/alchemy/admin/layoutpages/index.html.erb +35 -35
  152. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +42 -42
  153. data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
  154. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +27 -27
  155. data/app/views/alchemy/admin/pages/_page.html.erb +112 -112
  156. data/app/views/alchemy/admin/pages/_sitemap.html.erb +1 -1
  157. data/app/views/alchemy/admin/pages/configure.html.erb +71 -69
  158. data/app/views/alchemy/admin/pages/configure_external.html.erb +38 -38
  159. data/app/views/alchemy/admin/pages/destroy.js.erb +10 -10
  160. data/app/views/alchemy/admin/pages/edit.html.erb +165 -165
  161. data/app/views/alchemy/admin/pages/fold.js.erb +2 -2
  162. data/app/views/alchemy/admin/pages/index.html.erb +66 -66
  163. data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
  164. data/app/views/alchemy/admin/pages/new.html.erb +40 -40
  165. data/app/views/alchemy/admin/pages/sort.js.erb +4 -4
  166. data/app/views/alchemy/admin/pages/unlock.js.erb +6 -6
  167. data/app/views/alchemy/admin/pages/update.js.erb +19 -19
  168. data/app/views/alchemy/admin/partials/_flash.html.erb +2 -2
  169. data/app/views/alchemy/admin/partials/_flash_notices.html.erb +1 -1
  170. data/app/views/alchemy/admin/partials/_flash_upload.html.erb +38 -0
  171. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -15
  172. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +8 -8
  173. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +35 -35
  174. data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -14
  175. data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +6 -6
  176. data/app/views/alchemy/admin/partials/_upload_form.html.erb +56 -118
  177. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +11 -11
  178. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +71 -71
  179. data/app/views/alchemy/admin/pictures/_picture.html.erb +32 -32
  180. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +26 -26
  181. data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +6 -6
  182. data/app/views/alchemy/admin/pictures/create.js.erb +7 -7
  183. data/app/views/alchemy/admin/pictures/index.html.erb +67 -67
  184. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +5 -4
  185. data/app/views/alchemy/admin/resources/_form.html.erb +25 -19
  186. data/app/views/alchemy/admin/resources/_resource.html.erb +37 -36
  187. data/app/views/alchemy/admin/resources/_table.html.erb +17 -17
  188. data/app/views/alchemy/admin/resources/destroy.js.erb +1 -1
  189. data/app/views/alchemy/admin/resources/index.html.erb +14 -14
  190. data/app/views/alchemy/admin/trash/index.html.erb +20 -20
  191. data/app/views/alchemy/admin/users/_table.html.erb +52 -52
  192. data/app/views/alchemy/admin/users/_user.html.erb +35 -36
  193. data/app/views/alchemy/admin/users/index.html.erb +26 -27
  194. data/app/views/alchemy/base/error_notice.html.erb +2 -2
  195. data/app/views/alchemy/base/update.js.erb +1 -1
  196. data/app/views/alchemy/elements/_contactform_view.html.erb +76 -76
  197. data/app/views/alchemy/elements/_download_view.html.erb +1 -1
  198. data/app/views/alchemy/elements/_editor_not_found.html.erb +3 -3
  199. data/app/views/alchemy/elements/_searchresult_view.html.erb +2 -2
  200. data/app/views/alchemy/elements/_sitemap_editor.html.erb +1 -1
  201. data/app/views/alchemy/essences/_essence_audio_view.html.erb +13 -13
  202. data/app/views/alchemy/essences/_essence_date_editor.html.erb +10 -10
  203. data/app/views/alchemy/essences/_essence_file_editor.html.erb +62 -62
  204. data/app/views/alchemy/essences/_essence_file_view.html.erb +8 -8
  205. data/app/views/alchemy/essences/_essence_flash_view.html.erb +19 -19
  206. data/app/views/alchemy/essences/_essence_html_editor.html.erb +6 -6
  207. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +73 -73
  208. data/app/views/alchemy/essences/_essence_picture_view.html.erb +34 -34
  209. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +7 -7
  210. data/app/views/alchemy/essences/_essence_text_editor.html.erb +8 -8
  211. data/app/views/alchemy/navigation/_image_link.html.erb +12 -12
  212. data/app/views/alchemy/navigation/_link.html.erb +13 -13
  213. data/app/views/alchemy/navigation/_renderer.html.erb +17 -17
  214. data/app/views/alchemy/page_layouts/_layout_footer.html.erb +1 -1
  215. data/app/views/alchemy/page_layouts/_layout_header.html.erb +1 -1
  216. data/app/views/alchemy/pages/show.rss.builder +14 -14
  217. data/app/views/alchemy/search/_result.html.erb +7 -7
  218. data/app/views/alchemy/user_sessions/leave.html.erb +9 -9
  219. data/app/views/alchemy/user_sessions/login.html.erb +39 -39
  220. data/app/views/alchemy/user_sessions/logout.html.erb +1 -1
  221. data/app/views/layouts/alchemy/admin.html.erb +81 -81
  222. data/app/views/layouts/alchemy/login.html.erb +36 -36
  223. data/app/views/layouts/alchemy/pages.html.erb +48 -27
  224. data/bin/alchemy +136 -134
  225. data/config/alchemy/config.yml +13 -9
  226. data/config/locales/alchemy.de.yml +24 -30
  227. data/config/locales/alchemy.en.yml +11 -28
  228. data/config/routes.rb +146 -146
  229. data/db/migrate/20100607193638_create_essence_pictures.rb +3 -3
  230. data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +1 -1
  231. data/db/migrate/20101109151812_create_languages.rb +3 -3
  232. data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +3 -3
  233. data/db/migrate/20110224105120_change_pages_visible_default.rb +3 -3
  234. data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +2 -2
  235. data/db/migrate/20110414163140_remove_display_name_from_elements.rb +3 -3
  236. data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +2 -2
  237. data/db/migrate/20110529130500_add_cell_id_to_elements.rb +3 -3
  238. data/db/migrate/20110530102804_change_pages_page_layout_column.rb +3 -3
  239. data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +1 -1
  240. data/db/migrate/20111116125112_namespace_alchemy_models.rb +21 -21
  241. data/lib/alchemy/auth_engine.rb +5 -5
  242. data/lib/alchemy/capistrano.rb +64 -64
  243. data/lib/alchemy/config.rb +47 -44
  244. data/lib/alchemy/engine.rb +41 -41
  245. data/lib/alchemy/essence.rb +50 -51
  246. data/lib/alchemy/i18n.rb +48 -48
  247. data/lib/alchemy/modules.rb +30 -30
  248. data/lib/alchemy/mount_point.rb +6 -6
  249. data/lib/alchemy/page_layout.rb +94 -93
  250. data/lib/alchemy/resource.rb +82 -0
  251. data/lib/alchemy/resources_helper.rb +56 -0
  252. data/lib/alchemy/scoped_pagination_url_helper.rb +8 -8
  253. data/lib/alchemy/seeder.rb +88 -88
  254. data/lib/alchemy/tinymce.rb +49 -49
  255. data/lib/alchemy/upgrader.rb +103 -103
  256. data/lib/alchemy/version.rb +1 -1
  257. data/lib/alchemy_cms.rb +26 -27
  258. data/lib/extensions/action_view.rb +1 -1
  259. data/lib/extensions/array.rb +3 -3
  260. data/lib/extensions/hash.rb +3 -3
  261. data/lib/middleware/flash_session_cookie.rb +1 -1
  262. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +24 -24
  263. data/lib/rails/generators/alchemy/elements/elements_generator.rb +7 -7
  264. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +17 -17
  265. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +6 -6
  266. data/lib/rails/generators/alchemy/plugin/templates/authorization_rules.rb +8 -8
  267. data/lib/rails/generators/alchemy/scaffold/files/pages.html.erb +7 -7
  268. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +36 -36
  269. data/lib/rails/templates/alchemy.rb +1 -1
  270. data/lib/tasks/ferret.rake +2 -2
  271. data/lib/tasks/fleximage.rake +32 -32
  272. data/lib/tasks/install.rake +12 -12
  273. data/lib/tasks/upgrade.rake +4 -4
  274. data/spec/controllers/admin/clipboard_controller_spec.rb +43 -43
  275. data/spec/controllers/admin/contents_controller_spec.rb +22 -22
  276. data/spec/controllers/admin/elements_controller_spec.rb +13 -13
  277. data/spec/controllers/admin/languages_controller_spec.rb +31 -0
  278. data/spec/controllers/admin/pages_controller_spec.rb +10 -41
  279. data/spec/controllers/admin/resources_controller_spec.rb +19 -0
  280. data/spec/controllers/admin/trash_controller_spec.rb +11 -11
  281. data/spec/controllers/base_controller_spec.rb +46 -46
  282. data/spec/controllers/pages_controller_spec.rb +102 -92
  283. data/spec/dummy/app/controllers/admin/events_controller.rb +3 -0
  284. data/spec/dummy/app/controllers/errors_controller.rb +5 -0
  285. data/spec/dummy/app/models/event.rb +3 -0
  286. data/spec/dummy/config.ru +1 -1
  287. data/spec/dummy/config/application.rb +3 -0
  288. data/spec/dummy/config/authorization_rules.rb +7 -0
  289. data/spec/dummy/config/environments/development.rb +8 -1
  290. data/spec/dummy/config/environments/production.rb +1 -1
  291. data/spec/dummy/config/environments/test.rb +5 -2
  292. data/spec/dummy/config/routes.rb +9 -1
  293. data/spec/dummy/db/schema.rb +47 -35
  294. data/spec/dummy/public/404.html +19 -7
  295. data/spec/dummy/public/404.html.bak +26 -0
  296. data/spec/dummy/public/422.html +19 -7
  297. data/spec/dummy/public/500.html +19 -7
  298. data/spec/dummy/script/rails +2 -2
  299. data/spec/factories.rb +76 -76
  300. data/spec/helpers/admin/base_helper_spec.rb +21 -21
  301. data/spec/helpers/admin/contents_helper_spec.rb +14 -14
  302. data/spec/helpers/admin/elements_helper_spec.rb +40 -40
  303. data/spec/helpers/admin/essences_helper_spec.rb +7 -7
  304. data/spec/helpers/elements_helper_spec.rb +154 -154
  305. data/spec/helpers/essences_helper_spec.rb +10 -10
  306. data/spec/helpers/pages_helper_spec.rb +369 -372
  307. data/spec/helpers/pictures_helper_spec.rb +14 -0
  308. data/spec/helpers/url_helpers_spec.rb +29 -34
  309. data/spec/integration/admin/pages_controller_spec.rb +50 -50
  310. data/spec/integration/admin/resources_integration_spec.rb +100 -0
  311. data/spec/integration/navigation_spec.rb +1 -1
  312. data/spec/integration/pages_controller_spec.rb +205 -207
  313. data/spec/integration/security_spec.rb +47 -47
  314. data/spec/javascripts/alchemy/link_overlay_spec.js.coffee +42 -0
  315. data/spec/javascripts/alchemy_integration_spec.coffee +12 -0
  316. data/spec/javascripts/fixtures/select.html +3 -0
  317. data/spec/javascripts/helpers/.gitkeep +0 -0
  318. data/spec/javascripts/helpers/jasmine-jquery-1.3.1.js +289 -0
  319. data/spec/javascripts/helpers/mock-ajax.js +207 -0
  320. data/spec/javascripts/helpers/test_responses/test_responses.js +1 -0
  321. data/spec/javascripts/spec.css +3 -0
  322. data/spec/javascripts/spec.js +2 -0
  323. data/spec/libraries/resource_spec.rb +122 -0
  324. data/spec/libraries/resources_helper_spec.rb +105 -0
  325. data/spec/models/content_spec.rb +67 -67
  326. data/spec/models/element_spec.rb +133 -133
  327. data/spec/models/essence_picture_spec.rb +5 -5
  328. data/spec/models/essence_richtext_spec.rb +4 -4
  329. data/spec/models/language_spec.rb +89 -89
  330. data/spec/models/page_spec.rb +436 -506
  331. data/spec/models/picture_spec.rb +34 -34
  332. data/spec/models/user_spec.rb +2 -2
  333. data/spec/page_layout_spec.rb +24 -20
  334. data/spec/routing_spec.rb +253 -253
  335. data/spec/spec_helper.rb +51 -50
  336. data/spec/support/alchemy/controller_hacks.rb +25 -25
  337. data/spec/support/alchemy/specs_helpers.rb +25 -25
  338. data/spec/support/integration_spec_helper.rb +24 -0
  339. data/vendor/assets/javascripts/jquery_plugins/jquery.html5uploader.js +271 -0
  340. data/vendor/assets/javascripts/jquery_plugins/jquery.in-place-edit.js +86 -85
  341. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +380 -377
  342. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +285 -279
  343. data/vendor/assets/javascripts/swfupload/SWFObject License.txt +3 -3
  344. data/vendor/assets/javascripts/swfupload/swfupload.cookies.js +47 -47
  345. data/vendor/assets/javascripts/swfupload/swfupload.js +612 -612
  346. data/vendor/assets/javascripts/swfupload/swfupload.queue.js +93 -93
  347. data/vendor/assets/javascripts/swfupload/swfupload.speed.js +337 -337
  348. data/vendor/assets/javascripts/swfupload/swfupload.swfobject.js +706 -102
  349. data/vendor/assets/javascripts/tiny_mce/license.txt +6 -6
  350. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +97 -97
  351. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +386 -376
  352. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +30 -30
  353. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +45 -45
  354. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +20 -17
  355. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +12 -12
  356. data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +183 -173
  357. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +4 -4
  358. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +7 -7
  359. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +3 -3
  360. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +282 -280
  361. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +15 -15
  362. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +204 -204
  363. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +435 -435
  364. data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +24 -22
  365. data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +144 -136
  366. data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +184 -168
  367. data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +62 -46
  368. data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +17 -16
  369. data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +56 -47
  370. data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +67 -54
  371. data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +852 -1
  372. data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +79 -69
  373. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +48 -48
  374. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +28 -28
  375. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +317 -317
  376. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +248 -246
  377. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +246 -246
  378. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +146 -146
  379. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +31 -31
  380. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -1
  381. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -1
  382. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -1
  383. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
  384. data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +53 -46
  385. data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +57 -45
  386. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +182 -47
  387. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +399 -92
  388. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +891 -187
  389. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +102 -24
  390. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +377 -78
  391. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +452 -77
  392. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +167 -45
  393. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +399 -92
  394. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +890 -190
  395. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +33 -7
  396. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +15 -4
  397. data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +18 -15
  398. data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +46 -46
  399. data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +124 -124
  400. data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +112 -112
  401. data/vendor/assets/javascripts/tiny_mce/utils/validate.js +213 -213
  402. metadata +102 -115
  403. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +0 -216
  404. data/lib/tasks/routes.rake +0 -29
  405. data/spec/integration/admin/resources_spec.rb +0 -19
@@ -1,115 +1,115 @@
1
1
  module Alchemy
2
- module Admin
3
- class AttachmentsController < Alchemy::Admin::BaseController
2
+ module Admin
3
+ class AttachmentsController < Alchemy::Admin::BaseController
4
4
 
5
- protect_from_forgery :except => [:create]
5
+ protect_from_forgery :except => [:create]
6
6
 
7
- def index
8
- if in_overlay?
9
- archive_overlay
10
- else
11
- @attachments = Attachment.find_paginated(params, per_page_value_for_screen_size)
12
- end
13
- end
7
+ def index
8
+ if in_overlay?
9
+ archive_overlay
10
+ else
11
+ @attachments = Attachment.find_paginated(params, per_page_value_for_screen_size)
12
+ end
13
+ end
14
14
 
15
- def new
16
- @attachment = Attachment.new
17
- if in_overlay?
18
- @while_assigning = true
19
- @content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
20
- @swap = params[:swap]
21
- @options = hashified_options
22
- end
23
- render :layout => false
24
- end
15
+ def new
16
+ @attachment = Attachment.new
17
+ if in_overlay?
18
+ @while_assigning = true
19
+ @content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
20
+ @swap = params[:swap]
21
+ @options = hashified_options
22
+ end
23
+ render :layout => !request.xhr?
24
+ end
25
25
 
26
- def create
27
- @attachment = Attachment.new(:uploaded_data => params[:Filedata])
28
- @attachment.name = @attachment.filename
29
- @attachment.save
30
- if in_overlay?
31
- @while_assigning = true
32
- @content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
33
- @swap = params[:swap]
34
- @options = hashified_options
35
- end
36
- @attachments = Attachment.find_paginated(params, per_page_value_for_screen_size)
37
- @message = t('File %{name} uploaded succesfully', :name => @attachment.name)
38
- # Are we using the Flash uploader? Or the plain html file uploader?
39
- if params[Rails.application.config.session_options[:key]].blank?
40
- flash[:notice] = @message
41
- redirect_to :action => :index
42
- end
43
- end
26
+ def create
27
+ @attachment = Attachment.new(:uploaded_data => params[:Filedata])
28
+ @attachment.name = @attachment.filename
29
+ @attachment.save
30
+ if in_overlay?
31
+ @while_assigning = true
32
+ @content = Content.find(params[:content_id], :select => 'id') if !params[:content_id].blank?
33
+ @swap = params[:swap]
34
+ @options = hashified_options
35
+ end
36
+ @attachments = Attachment.find_paginated(params, per_page_value_for_screen_size)
37
+ @message = t('File %{name} uploaded succesfully', :name => @attachment.name)
38
+ # Are we using the Flash uploader? Or the plain html file uploader?
39
+ if params[Rails.application.config.session_options[:key]].blank?
40
+ flash[:notice] = @message
41
+ redirect_to :action => :index
42
+ end
43
+ end
44
44
 
45
- def edit
46
- @attachment = Attachment.find(params[:id])
47
- render :layout => false
48
- end
45
+ def edit
46
+ @attachment = Attachment.find(params[:id])
47
+ render :layout => false
48
+ end
49
49
 
50
- def update
51
- @attachment = Attachment.find(params[:id])
52
- oldname = @attachment.name
53
- if @attachment.update_attributes(params[:attachment], :as => current_user.role.to_sym)
54
- flash[:notice] = t("File renamed successfully from: '%{from}' to '%{to}'", :from => oldname, :to => @attachment.name)
55
- else
56
- render :action => "edit"
57
- end
58
- redirect_to admin_attachments_path(:page => params[:page], :query => params[:query], :per_page => params[:per_page])
59
- end
50
+ def update
51
+ @attachment = Attachment.find(params[:id])
52
+ oldname = @attachment.name
53
+ if @attachment.update_attributes(params[:attachment], :as => current_user.role.to_sym)
54
+ flash[:notice] = t("File renamed successfully from: '%{from}' to '%{to}'", :from => oldname, :to => @attachment.name)
55
+ else
56
+ render :action => "edit"
57
+ end
58
+ redirect_to admin_attachments_path(:page => params[:page], :query => params[:query], :per_page => params[:per_page])
59
+ end
60
60
 
61
- def destroy
62
- @attachment = Attachment.find(params[:id])
63
- name = @attachment.name
64
- @attachment.destroy
65
- flash[:notice] = t("File: '%{name}' deleted successfully", :name => name)
66
- end
61
+ def destroy
62
+ @attachment = Attachment.find(params[:id])
63
+ name = @attachment.name
64
+ @attachment.destroy
65
+ flash[:notice] = t("File: '%{name}' deleted successfully", :name => name)
66
+ end
67
67
 
68
- def show
69
- @attachment = Attachment.find(params[:id])
70
- send_file(
71
- @attachment.public_filename,
72
- {
73
- :name => @attachment.filename,
74
- :type => @attachment.content_type,
75
- :disposition => 'inline'
76
- }
77
- )
78
- end
68
+ def show
69
+ @attachment = Attachment.find(params[:id])
70
+ send_file(
71
+ @attachment.public_filename,
72
+ {
73
+ :name => @attachment.filename,
74
+ :type => @attachment.content_type,
75
+ :disposition => 'inline'
76
+ }
77
+ )
78
+ end
79
79
 
80
- def download
81
- @attachment = Attachment.find(params[:id])
82
- send_file(
83
- @attachment.full_filename, {
84
- :name => @attachment.filename,
85
- :type => @attachment.content_type,
86
- :disposition => 'attachment'
87
- }
88
- )
89
- end
80
+ def download
81
+ @attachment = Attachment.find(params[:id])
82
+ send_file(
83
+ @attachment.full_filename, {
84
+ :name => @attachment.filename,
85
+ :type => @attachment.content_type,
86
+ :disposition => 'attachment'
87
+ }
88
+ )
89
+ end
90
90
 
91
- private
91
+ private
92
92
 
93
- def in_overlay?
94
- !params[:content_id].blank?
95
- end
93
+ def in_overlay?
94
+ !params[:content_id].blank?
95
+ end
96
96
 
97
- def archive_overlay
98
- @content = Content.find(params[:content_id])
99
- @options = params[:options]
100
- if !params[:only].blank?
101
- condition = "filename LIKE '%.#{params[:only].join("' OR filename LIKE '%.")}'"
102
- elsif !params[:except].blank?
103
- condition = "filename NOT LIKE '%.#{params[:except].join("' OR filename NOT LIKE '%.")}'"
104
- else
105
- condition = ""
106
- end
107
- @attachments = Attachment.where(condition).order(:name)
108
- respond_to do |format|
109
- format.html { render :partial => 'archive_overlay' }
110
- end
111
- end
97
+ def archive_overlay
98
+ @content = Content.find(params[:content_id])
99
+ @options = params[:options]
100
+ if !params[:only].blank?
101
+ condition = "filename LIKE '%.#{params[:only].join("' OR filename LIKE '%.")}'"
102
+ elsif !params[:except].blank?
103
+ condition = "filename NOT LIKE '%.#{params[:except].join("' OR filename NOT LIKE '%.")}'"
104
+ else
105
+ condition = ""
106
+ end
107
+ @attachments = Attachment.where(condition).order(:name)
108
+ respond_to do |format|
109
+ format.html { render :partial => 'archive_overlay' }
110
+ end
111
+ end
112
112
 
113
- end
114
- end
113
+ end
114
+ end
115
115
  end
@@ -1,118 +1,118 @@
1
1
  module Alchemy
2
- module Admin
3
- class BaseController < Alchemy::BaseController
4
-
5
- include Userstamp
6
-
7
- before_filter :set_translation
8
-
9
- helper_method :clipboard_empty?, :trash_empty?, :get_clipboard, :is_admin?
10
-
11
- filter_access_to :all
12
-
13
- rescue_from Exception, :with => :exception_handler
14
-
15
- layout 'alchemy/admin'
16
-
17
- private
18
-
19
- # Setting the Alchemy GUI translation to users preffered language, or taking default translation.
20
- # You can set the default translation in your +config/application.rb+ file
21
- def set_translation
22
- if current_user && current_user.language
23
- ::I18n.locale = current_user.language
24
- end
25
- end
26
-
27
- # Handles exceptions
28
- def exception_handler(e)
29
- exception_logger(e)
30
- show_error_notice(e)
31
- end
32
-
33
- # Logs the current exception to the error log.
34
- def exception_logger(e)
35
- message = "\n+++++++++ Error: #{e} +++++++++++++\n\n"
36
- e.backtrace.each do |line|
37
- message += "#{line}\n"
38
- end
39
- logger.error(message)
40
- end
41
-
42
- # Displays an error notice in the Alchemy backend.
43
- def show_error_notice(e)
44
- @notice = "Error: #{e}"
45
- @trace = e.backtrace
46
- if request.xhr?
47
- render :action => "error_notice", :layout => false
48
- else
49
- flash.now[:error] = @notice
50
- render '500', :status => 500
51
- end
52
- end
53
-
54
- def redirect_back_or_to_default(default_path = admin_dashboard_path)
55
- if request.env["HTTP_REFERER"].blank?
56
- redirect_to default_path
57
- else
58
- redirect_to :back
59
- end
60
- end
61
-
62
- def get_clipboard(category = nil)
63
- clipboard = (session[:clipboard] ||= {})
64
- clipboard[category.to_s.pluralize] ||= [] if category
65
- end
66
-
67
- def clipboard_empty?(category = nil)
68
- return true if session[:clipboard].blank?
69
- if category
70
- session[:clipboard][category.pluralize].blank?
71
- else
72
- false
73
- end
74
- end
75
-
76
- def trash_empty?(category)
77
- "alchemy/#{category.singularize}".classify.constantize.trashed.blank?
78
- end
79
-
80
- def set_stamper
81
- User.stamper = self.current_user
82
- end
83
-
84
- def reset_stamper
85
- User.reset_stamper
86
- end
87
-
88
- # Returns true if the current_user (The logged-in Alchemy User) has the admin role.
89
- def is_admin?
90
- return false if !current_user
91
- current_user.admin?
92
- end
93
-
94
- def render_errors_or_redirect(object, redirect_url, flash_notice, button = nil)
95
- if object.errors.empty?
96
- @redirect_url = redirect_url
97
- flash[:notice] = t(flash_notice)
98
- render :action => :redirect
99
- else
100
- render_remote_errors(object, button)
101
- end
102
- end
103
-
104
- def render_remote_errors(object, button = nil)
105
- @button = button
106
- @errors = ("<ul>" + object.errors.full_messages.map { |e| "<li>#{e}</li>" }.join + "</ul>").html_safe
107
- render :action => :remote_errors
108
- end
109
-
110
- def per_page_value_for_screen_size
111
- return 25 if session[:screen_size].blank?
112
- screen_height = session[:screen_size].split('x').last.to_i
113
- (screen_height / 30) - 12
114
- end
115
-
116
- end
117
- end
2
+ module Admin
3
+ class BaseController < Alchemy::BaseController
4
+
5
+ include Userstamp
6
+
7
+ before_filter :set_translation
8
+
9
+ helper_method :clipboard_empty?, :trash_empty?, :get_clipboard, :is_admin?
10
+
11
+ filter_access_to :all
12
+
13
+ rescue_from Exception, :with => :exception_handler
14
+
15
+ layout 'alchemy/admin'
16
+
17
+ private
18
+
19
+ # Setting the Alchemy GUI translation to users preffered language, or taking default translation.
20
+ # You can set the default translation in your +config/application.rb+ file
21
+ def set_translation
22
+ if current_user && current_user.language
23
+ ::I18n.locale = current_user.language
24
+ end
25
+ end
26
+
27
+ # Handles exceptions
28
+ def exception_handler(e)
29
+ exception_logger(e)
30
+ show_error_notice(e)
31
+ end
32
+
33
+ # Logs the current exception to the error log.
34
+ def exception_logger(e)
35
+ message = "\n+++++++++ Error: #{e} +++++++++++++\n\n"
36
+ e.backtrace.each do |line|
37
+ message += "#{line}\n"
38
+ end
39
+ logger.error(message)
40
+ end
41
+
42
+ # Displays an error notice in the Alchemy backend.
43
+ def show_error_notice(e)
44
+ @notice = "Error: #{e}"
45
+ @trace = e.backtrace
46
+ if request.xhr?
47
+ render :action => "error_notice", :layout => false
48
+ else
49
+ flash.now[:error] = @notice
50
+ render '500', :status => 500
51
+ end
52
+ end
53
+
54
+ def redirect_back_or_to_default(default_path = admin_dashboard_path)
55
+ if request.env["HTTP_REFERER"].blank?
56
+ redirect_to default_path
57
+ else
58
+ redirect_to :back
59
+ end
60
+ end
61
+
62
+ def get_clipboard(category = nil)
63
+ clipboard = (session[:clipboard] ||= {})
64
+ clipboard[category.to_s.pluralize] ||= [] if category
65
+ end
66
+
67
+ def clipboard_empty?(category = nil)
68
+ return true if session[:clipboard].blank?
69
+ if category
70
+ session[:clipboard][category.pluralize].blank?
71
+ else
72
+ false
73
+ end
74
+ end
75
+
76
+ def trash_empty?(category)
77
+ "alchemy/#{category.singularize}".classify.constantize.trashed.blank?
78
+ end
79
+
80
+ def set_stamper
81
+ User.stamper = self.current_user
82
+ end
83
+
84
+ def reset_stamper
85
+ User.reset_stamper
86
+ end
87
+
88
+ # Returns true if the current_user (The logged-in Alchemy User) has the admin role.
89
+ def is_admin?
90
+ return false if !current_user
91
+ current_user.admin?
92
+ end
93
+
94
+ def render_errors_or_redirect(object, redirect_url, flash_notice, button = nil)
95
+ if object.errors.empty?
96
+ @redirect_url = redirect_url
97
+ flash[:notice] = t(flash_notice)
98
+ render :action => :redirect
99
+ else
100
+ render_remote_errors(object, button)
101
+ end
102
+ end
103
+
104
+ def render_remote_errors(object, button = nil)
105
+ @button = button
106
+ @errors = ("<ul>" + object.errors.full_messages.map { |e| "<li>#{e}</li>" }.join + "</ul>").html_safe
107
+ render :action => :remote_errors
108
+ end
109
+
110
+ def per_page_value_for_screen_size
111
+ return 25 if session[:screen_size].blank?
112
+ screen_height = session[:screen_size].split('x').last.to_i
113
+ (screen_height / 30) - 12
114
+ end
115
+
116
+ end
117
+ end
118
118
  end
@@ -1,46 +1,46 @@
1
1
  module Alchemy
2
- module Admin
3
-
4
- class ClipboardController < Alchemy::Admin::BaseController
5
-
6
- def index
7
- clipboard = get_clipboard(params[:remarkable_type])
8
- @clipboard_items = model_class.all_from_clipboard(clipboard)
9
- respond_to do |format|
10
- format.html { render :layout => false }
11
- end
12
- end
13
-
14
- def insert
15
- @clipboard = get_clipboard(params[:remarkable_type])
16
- @item = model_class.find(params[:remarkable_id])
17
- unless @clipboard.collect { |i| i[:id].to_i }.include?(params[:remarkable_id].to_i)
18
- @clipboard.push({:id => params[:remarkable_id].to_i, :action => params[:remove] ? 'cut' : 'copy'})
19
- end
20
- respond_to do |format|
21
- format.js
22
- end
23
- end
24
-
25
- def remove
26
- @clipboard = get_clipboard(params[:remarkable_type])
27
- @item = model_class.find(params[:remarkable_id])
28
- @clipboard.delete_if { |i| i[:id].to_i == params[:remarkable_id].to_i }
29
- respond_to do |format|
30
- format.js
31
- end
32
- end
33
-
34
- def clear
35
- session[:clipboard] = {}
36
- end
37
-
38
- private
39
-
40
- def model_class
41
- "alchemy/#{params[:remarkable_type]}".classify.constantize
42
- end
43
-
44
- end
45
- end
2
+ module Admin
3
+
4
+ class ClipboardController < Alchemy::Admin::BaseController
5
+
6
+ def index
7
+ clipboard = get_clipboard(params[:remarkable_type])
8
+ @clipboard_items = model_class.all_from_clipboard(clipboard)
9
+ respond_to do |format|
10
+ format.html { render :layout => false }
11
+ end
12
+ end
13
+
14
+ def insert
15
+ @clipboard = get_clipboard(params[:remarkable_type])
16
+ @item = model_class.find(params[:remarkable_id])
17
+ unless @clipboard.collect { |i| i[:id].to_s }.include?(params[:remarkable_id])
18
+ @clipboard.push({:id => params[:remarkable_id], :action => params[:remove] ? 'cut' : 'copy'})
19
+ end
20
+ respond_to do |format|
21
+ format.js
22
+ end
23
+ end
24
+
25
+ def remove
26
+ @clipboard = get_clipboard(params[:remarkable_type])
27
+ @item = model_class.find(params[:remarkable_id])
28
+ @clipboard.delete_if { |i| i[:id].to_s == params[:remarkable_id] }
29
+ respond_to do |format|
30
+ format.js
31
+ end
32
+ end
33
+
34
+ def clear
35
+ session[:clipboard] = {}
36
+ end
37
+
38
+ private
39
+
40
+ def model_class
41
+ "alchemy/#{params[:remarkable_type]}".classify.constantize
42
+ end
43
+
44
+ end
45
+ end
46
46
  end