alchemy_cms 2.9.1 → 3.0.0.rc5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (695) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.travis.yml +14 -3
  4. data/CONTRIBUTING.md +73 -0
  5. data/Gemfile +25 -24
  6. data/LICENSE +19 -16
  7. data/README.md +16 -33
  8. data/alchemy_cms.gemspec +62 -59
  9. data/app/assets/images/alchemy/alchemy-logo.svg +70 -0
  10. data/app/assets/images/alchemy/favicon.ico +0 -0
  11. data/app/assets/images/alchemy/icon.svg +14 -0
  12. data/app/assets/javascripts/alchemy/alchemy.autocomplete.js.coffee +30 -0
  13. data/app/assets/javascripts/alchemy/alchemy.base.js.coffee +28 -30
  14. data/app/assets/javascripts/alchemy/alchemy.browser.js.coffee +20 -26
  15. data/app/assets/javascripts/alchemy/alchemy.confirm_dialog.js.coffee +80 -0
  16. data/app/assets/javascripts/alchemy/alchemy.dialog.js.coffee +261 -0
  17. data/app/assets/javascripts/alchemy/alchemy.dirty.js.coffee +15 -15
  18. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js.coffee +4 -1
  19. data/app/assets/javascripts/alchemy/alchemy.element_editors.js.coffee +20 -9
  20. data/app/assets/javascripts/alchemy/alchemy.elements_window.js.coffee +67 -68
  21. data/app/assets/javascripts/alchemy/alchemy.file_progress.js.coffee +63 -0
  22. data/app/assets/javascripts/alchemy/alchemy.growler.js.coffee +1 -1
  23. data/app/assets/javascripts/alchemy/alchemy.gui.js.coffee +2 -1
  24. data/app/assets/javascripts/alchemy/alchemy.hotkeys.js.coffee +32 -14
  25. data/app/assets/javascripts/alchemy/alchemy.i18n.js.coffee +21 -0
  26. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js.coffee +4 -1
  27. data/app/assets/javascripts/alchemy/{alchemy.onload.js.coffee → alchemy.initializer.js.coffee} +22 -5
  28. data/app/assets/javascripts/alchemy/alchemy.js +13 -11
  29. data/app/assets/javascripts/alchemy/alchemy.link_dialog.js.coffee +221 -0
  30. data/app/assets/javascripts/alchemy/alchemy.list_filter.js.coffee +2 -2
  31. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +0 -2
  32. data/app/assets/javascripts/alchemy/alchemy.preview.js.coffee +37 -35
  33. data/app/assets/javascripts/alchemy/alchemy.preview_window.js.coffee +42 -69
  34. data/app/assets/javascripts/alchemy/alchemy.sitemap.js.coffee +1 -1
  35. data/app/assets/javascripts/alchemy/alchemy.spinner.js.coffee +4 -4
  36. data/app/assets/javascripts/alchemy/alchemy.tinymce.js.coffee.erb +3 -7
  37. data/app/assets/javascripts/alchemy/alchemy.translations.js.coffee +107 -19
  38. data/app/assets/javascripts/alchemy/alchemy.uploader.js.coffee +97 -0
  39. data/app/assets/javascripts/alchemy/alchemy.windows.js.coffee +14 -273
  40. data/app/assets/javascripts/alchemy/menubar.js.coffee +8 -0
  41. data/app/assets/javascripts/alchemy/preview.js +0 -2
  42. data/app/assets/javascripts/tinymce/plugins/alchemy_link/plugin.min.js +19 -0
  43. data/app/assets/stylesheets/alchemy/{defaults.scss → _defaults.scss} +2 -0
  44. data/app/assets/stylesheets/alchemy/{extends.scss → _extends.scss} +7 -61
  45. data/app/assets/stylesheets/alchemy/_mixins.scss +112 -0
  46. data/app/assets/stylesheets/alchemy/{variables.scss → _variables.scss} +31 -11
  47. data/app/assets/stylesheets/alchemy/admin.css.scss +6 -3
  48. data/app/assets/stylesheets/alchemy/archive.scss +27 -32
  49. data/app/assets/stylesheets/alchemy/base.scss +93 -127
  50. data/app/assets/stylesheets/alchemy/buttons.scss +227 -0
  51. data/app/assets/stylesheets/alchemy/dashboard.scss +14 -1
  52. data/app/assets/stylesheets/alchemy/dialogs.scss +209 -0
  53. data/app/assets/stylesheets/alchemy/elements.scss +173 -210
  54. data/app/assets/stylesheets/alchemy/errors.scss +5 -15
  55. data/app/assets/stylesheets/alchemy/flash.scss +12 -11
  56. data/app/assets/stylesheets/alchemy/form_fields.scss +56 -0
  57. data/app/assets/stylesheets/alchemy/forms.scss +161 -0
  58. data/app/assets/stylesheets/alchemy/frame.scss +8 -6
  59. data/app/assets/stylesheets/alchemy/icon-font.css.scss +40 -40
  60. data/app/assets/stylesheets/alchemy/icons.scss +14 -6
  61. data/app/assets/stylesheets/alchemy/jquery-ui.scss +11 -629
  62. data/app/assets/stylesheets/alchemy/menubar.css.scss +27 -72
  63. data/app/assets/stylesheets/alchemy/notices.scss +6 -5
  64. data/app/assets/stylesheets/alchemy/pagination.scss +1 -1
  65. data/app/assets/stylesheets/alchemy/search.scss +4 -3
  66. data/app/assets/stylesheets/alchemy/selects.scss +199 -0
  67. data/app/assets/stylesheets/alchemy/sitemap.scss +31 -60
  68. data/app/assets/stylesheets/alchemy/tables.scss +0 -77
  69. data/app/assets/stylesheets/alchemy/toolbar.scss +0 -2
  70. data/app/assets/stylesheets/alchemy/upload.scss +60 -57
  71. data/app/assets/stylesheets/tinymce/skins/alchemy/content.min.css.scss +81 -0
  72. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/readme.md +1 -0
  73. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.eot +0 -0
  74. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.svg +175 -0
  75. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.ttf +0 -0
  76. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce-small.woff +0 -0
  77. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.eot +0 -0
  78. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.svg +153 -0
  79. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.ttf +0 -0
  80. data/app/assets/stylesheets/tinymce/skins/alchemy/fonts/tinymce.woff +0 -0
  81. data/app/assets/stylesheets/tinymce/skins/alchemy/img/anchor.gif +0 -0
  82. data/app/assets/stylesheets/tinymce/skins/alchemy/img/loader.gif +0 -0
  83. data/app/assets/stylesheets/tinymce/skins/alchemy/img/object.gif +0 -0
  84. data/{vendor/assets/javascripts/tiny_mce/themes/advanced → app/assets/stylesheets/tinymce/skins/alchemy}/img/trans.gif +0 -0
  85. data/app/assets/stylesheets/tinymce/skins/alchemy/img/wline.gif +0 -0
  86. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.ie7.min.css +1 -0
  87. data/app/assets/stylesheets/tinymce/skins/alchemy/skin.min.css.scss +1813 -0
  88. data/app/controllers/alchemy/admin/attachments_controller.rb +39 -50
  89. data/app/controllers/alchemy/admin/base_controller.rb +32 -32
  90. data/app/controllers/alchemy/admin/clipboard_controller.rb +2 -2
  91. data/app/controllers/alchemy/admin/contents_controller.rb +12 -7
  92. data/app/controllers/alchemy/admin/dashboard_controller.rb +1 -1
  93. data/app/controllers/alchemy/admin/elements_controller.rb +41 -32
  94. data/app/controllers/alchemy/admin/essence_files_controller.rb +4 -3
  95. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +13 -16
  96. data/app/controllers/alchemy/admin/languages_controller.rb +0 -1
  97. data/app/controllers/alchemy/admin/layoutpages_controller.rb +2 -1
  98. data/app/controllers/alchemy/admin/pages_controller.rb +106 -166
  99. data/app/controllers/alchemy/admin/pictures_controller.rb +54 -80
  100. data/app/controllers/alchemy/admin/resources_controller.rb +25 -9
  101. data/app/controllers/alchemy/admin/tags_controller.rb +26 -14
  102. data/app/controllers/alchemy/admin/trash_controller.rb +5 -2
  103. data/app/controllers/alchemy/attachments_controller.rb +8 -8
  104. data/app/controllers/alchemy/base_controller.rb +23 -89
  105. data/app/controllers/alchemy/contents_controller.rb +17 -0
  106. data/app/controllers/alchemy/elements_controller.rb +7 -30
  107. data/app/controllers/alchemy/messages_controller.rb +18 -18
  108. data/app/controllers/alchemy/pages_controller.rb +73 -48
  109. data/app/controllers/alchemy/pictures_controller.rb +45 -46
  110. data/app/helpers/alchemy/admin/attachments_helper.rb +1 -0
  111. data/app/helpers/alchemy/admin/base_helper.rb +95 -90
  112. data/app/helpers/alchemy/admin/contents_helper.rb +34 -37
  113. data/app/helpers/alchemy/admin/elements_helper.rb +4 -5
  114. data/app/helpers/alchemy/admin/essences_helper.rb +13 -90
  115. data/app/helpers/alchemy/admin/form_helper.rb +30 -0
  116. data/app/helpers/alchemy/admin/navigation_helper.rb +34 -2
  117. data/app/helpers/alchemy/base_helper.rb +3 -3
  118. data/app/helpers/alchemy/elements_helper.rb +105 -142
  119. data/app/helpers/alchemy/essences_helper.rb +17 -53
  120. data/app/helpers/alchemy/pages_helper.rb +148 -177
  121. data/app/helpers/alchemy/url_helper.rb +5 -25
  122. data/app/models/alchemy/attachment.rb +39 -14
  123. data/app/models/alchemy/cell.rb +18 -4
  124. data/app/models/alchemy/content.rb +69 -79
  125. data/app/models/alchemy/content/factory.rb +2 -6
  126. data/app/models/alchemy/element.rb +94 -89
  127. data/app/models/alchemy/essence_boolean.rb +13 -2
  128. data/app/models/alchemy/essence_date.rb +15 -8
  129. data/app/models/alchemy/essence_file.rb +25 -1
  130. data/app/models/alchemy/essence_html.rb +13 -6
  131. data/app/models/alchemy/essence_link.rb +16 -7
  132. data/app/models/alchemy/essence_picture.rb +102 -21
  133. data/app/models/alchemy/essence_richtext.rb +15 -37
  134. data/app/models/alchemy/essence_select.rb +13 -2
  135. data/app/models/alchemy/essence_text.rb +17 -42
  136. data/app/models/alchemy/folded_page.rb +10 -0
  137. data/app/models/alchemy/language.rb +62 -48
  138. data/app/models/alchemy/legacy_page_url.rb +12 -2
  139. data/app/models/alchemy/message.rb +11 -43
  140. data/app/models/alchemy/page.rb +107 -88
  141. data/app/models/alchemy/page/{page_cells.rb → cells.rb} +2 -2
  142. data/app/models/alchemy/page/{page_elements.rb → elements.rb} +5 -6
  143. data/app/models/alchemy/page/{page_naming.rb → naming.rb} +6 -11
  144. data/app/models/alchemy/page/{page_natures.rb → natures.rb} +29 -5
  145. data/app/models/alchemy/page/{page_scopes.rb → scopes.rb} +14 -14
  146. data/app/models/alchemy/page/{page_users.rb → users.rb} +4 -4
  147. data/app/models/alchemy/picture.rb +113 -41
  148. data/app/models/alchemy/picture/sweeping.rb +17 -0
  149. data/app/models/alchemy/site.rb +14 -2
  150. data/app/models/alchemy/tag.rb +8 -0
  151. data/app/serializers/alchemy/attachment_serializer.rb +15 -0
  152. data/app/serializers/alchemy/cell_serializer.rb +18 -0
  153. data/app/serializers/alchemy/content_serializer.rb +27 -0
  154. data/app/serializers/alchemy/element_serializer.rb +17 -0
  155. data/app/serializers/alchemy/essence_boolean_serializer.rb +11 -0
  156. data/app/serializers/alchemy/essence_date_serializer.rb +11 -0
  157. data/app/serializers/alchemy/essence_file_serializer.rb +12 -0
  158. data/app/serializers/alchemy/essence_html_serializer.rb +11 -0
  159. data/app/serializers/alchemy/essence_link_serializer.rb +14 -0
  160. data/app/serializers/alchemy/essence_picture_serializer.rb +28 -0
  161. data/app/serializers/alchemy/essence_richtext_serializer.rb +12 -0
  162. data/app/serializers/alchemy/essence_select_serializer.rb +11 -0
  163. data/app/serializers/alchemy/essence_text_serializer.rb +22 -0
  164. data/app/serializers/alchemy/page_serializer.rb +29 -0
  165. data/app/serializers/alchemy/picture_serializer.rb +16 -0
  166. data/app/views/alchemy/_menubar.html.erb +16 -0
  167. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +27 -29
  168. data/app/views/alchemy/admin/attachments/_attachment.html.erb +24 -24
  169. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +1 -1
  170. data/app/views/alchemy/admin/attachments/_files_list.html.erb +1 -1
  171. data/app/views/alchemy/admin/attachments/_overlay_file_list.html.erb +2 -2
  172. data/app/views/alchemy/admin/attachments/archive_overlay.js.erb +7 -4
  173. data/app/views/alchemy/admin/attachments/create.js.erb +11 -9
  174. data/app/views/alchemy/admin/attachments/edit.html.erb +9 -26
  175. data/app/views/alchemy/admin/attachments/index.html.erb +4 -4
  176. data/app/views/alchemy/admin/attachments/new.html.erb +13 -10
  177. data/app/views/alchemy/admin/attachments/show.html.erb +1 -1
  178. data/app/views/alchemy/admin/clipboard/clear.js.erb +3 -7
  179. data/app/views/alchemy/admin/clipboard/index.html.erb +21 -22
  180. data/app/views/alchemy/admin/clipboard/insert.js.erb +19 -14
  181. data/app/views/alchemy/admin/contents/_missing.html.erb +10 -12
  182. data/app/views/alchemy/admin/contents/create.js.erb +32 -36
  183. data/app/views/alchemy/admin/contents/destroy.js.coffee +3 -3
  184. data/app/views/alchemy/admin/contents/new.html.erb +9 -21
  185. data/app/views/alchemy/admin/contents/order.js.erb +2 -5
  186. data/app/views/alchemy/admin/dashboard/help.html.erb +21 -0
  187. data/app/views/alchemy/admin/dashboard/index.html.erb +5 -7
  188. data/app/views/alchemy/admin/dashboard/info.html.erb +13 -9
  189. data/app/views/alchemy/admin/elements/_add_picture.html.erb +6 -6
  190. data/app/views/alchemy/admin/elements/_element.html.erb +4 -1
  191. data/app/views/alchemy/admin/elements/_element_head.html.erb +2 -2
  192. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +20 -27
  193. data/app/views/alchemy/admin/elements/_picture_gallery_editor.html.erb +7 -7
  194. data/app/views/alchemy/admin/elements/_refresh_editor.js.erb +1 -1
  195. data/app/views/alchemy/admin/elements/create.js.erb +6 -6
  196. data/app/views/alchemy/admin/elements/fold.js.erb +10 -10
  197. data/app/views/alchemy/admin/elements/index.html.erb +24 -26
  198. data/app/views/alchemy/admin/elements/list.html.erb +16 -0
  199. data/app/views/alchemy/admin/elements/new.html.erb +12 -28
  200. data/app/views/alchemy/admin/elements/trash.js.erb +3 -3
  201. data/app/views/alchemy/admin/elements/update.js.erb +12 -8
  202. data/app/views/alchemy/admin/essence_files/assign.js.erb +9 -14
  203. data/app/views/alchemy/admin/essence_files/edit.html.erb +17 -27
  204. data/app/views/alchemy/admin/essence_pictures/assign.js.erb +18 -0
  205. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +1 -1
  206. data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +9 -13
  207. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +27 -67
  208. data/app/views/alchemy/admin/essence_pictures/save_link.js.erb +1 -1
  209. data/app/views/alchemy/admin/essence_pictures/update.js.erb +3 -3
  210. data/app/views/alchemy/admin/languages/_form.html.erb +13 -55
  211. data/app/views/alchemy/admin/languages/_language.html.erb +10 -16
  212. data/app/views/alchemy/admin/languages/_table.html.erb +1 -1
  213. data/app/views/alchemy/admin/languages/index.html.erb +4 -4
  214. data/app/views/alchemy/admin/layoutpages/_layoutpage.html.erb +25 -27
  215. data/app/views/alchemy/admin/layoutpages/index.html.erb +5 -5
  216. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +25 -31
  217. data/app/views/alchemy/admin/pages/_external_link.html.erb +24 -35
  218. data/app/views/alchemy/admin/pages/_file_link.html.erb +31 -45
  219. data/app/views/alchemy/admin/pages/_internal_link.html.erb +36 -42
  220. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +8 -26
  221. data/app/views/alchemy/admin/pages/_page.html.erb +76 -75
  222. data/app/views/alchemy/admin/pages/_page_for_links.html.erb +15 -16
  223. data/app/views/alchemy/admin/pages/configure.html.erb +56 -86
  224. data/app/views/alchemy/admin/pages/configure_external.html.erb +32 -39
  225. data/app/views/alchemy/admin/pages/destroy.js.erb +10 -10
  226. data/app/views/alchemy/admin/pages/edit.html.erb +57 -63
  227. data/app/views/alchemy/admin/pages/fold.js.erb +3 -5
  228. data/app/views/alchemy/admin/pages/index.html.erb +11 -13
  229. data/app/views/alchemy/admin/pages/info.html.erb +28 -31
  230. data/app/views/alchemy/admin/pages/link.html.erb +8 -19
  231. data/app/views/alchemy/admin/pages/new.html.erb +11 -35
  232. data/app/views/alchemy/admin/pages/show.html.erb +1 -1
  233. data/app/views/alchemy/admin/pages/sort.js.erb +5 -7
  234. data/app/views/alchemy/admin/pages/update.js.erb +19 -20
  235. data/app/views/alchemy/admin/partials/_autocomplete_tag_list.html.erb +1 -9
  236. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +8 -19
  237. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +1 -1
  238. data/app/views/alchemy/admin/partials/_sub_navigation.html.erb +1 -1
  239. data/app/views/alchemy/admin/partials/_toolbar_button.html.erb +3 -3
  240. data/app/views/alchemy/admin/partials/_upload_form.html.erb +37 -55
  241. data/app/views/alchemy/admin/pictures/_archive.html.erb +3 -3
  242. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +11 -13
  243. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +1 -1
  244. data/app/views/alchemy/admin/pictures/_overlay_picture_list.html.erb +4 -2
  245. data/app/views/alchemy/admin/pictures/_picture.html.erb +37 -37
  246. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +1 -1
  247. data/app/views/alchemy/admin/pictures/archive_overlay.js.erb +8 -5
  248. data/app/views/alchemy/admin/pictures/edit.html.erb +8 -21
  249. data/app/views/alchemy/admin/pictures/edit_multiple.html.erb +15 -33
  250. data/app/views/alchemy/admin/pictures/index.html.erb +9 -7
  251. data/app/views/alchemy/admin/pictures/index.js.erb +2 -2
  252. data/app/views/alchemy/admin/pictures/info.html.erb +35 -40
  253. data/app/views/alchemy/admin/pictures/new.html.erb +15 -11
  254. data/app/views/alchemy/admin/pictures/show.html.erb +5 -5
  255. data/app/views/alchemy/admin/resources/_form.html.erb +7 -31
  256. data/app/views/alchemy/admin/resources/_resource.html.erb +9 -16
  257. data/app/views/alchemy/admin/resources/_table.html.erb +1 -1
  258. data/app/views/alchemy/admin/resources/index.html.erb +5 -5
  259. data/app/views/alchemy/admin/sites/index.html.erb +3 -3
  260. data/app/views/alchemy/admin/tags/_tag.html.erb +15 -15
  261. data/app/views/alchemy/admin/tags/edit.html.erb +20 -37
  262. data/app/views/alchemy/admin/tags/index.html.erb +16 -19
  263. data/app/views/alchemy/admin/tags/new.html.erb +6 -15
  264. data/app/views/alchemy/admin/trash/clear.js.coffee +2 -2
  265. data/app/views/alchemy/admin/trash/index.html.erb +24 -20
  266. data/app/views/alchemy/base/500.html.erb +2 -2
  267. data/app/views/alchemy/base/error_notice.js.erb +1 -1
  268. data/app/views/alchemy/base/leave.html.erb +11 -11
  269. data/app/views/alchemy/base/permission_denied.js.erb +1 -1
  270. data/app/views/alchemy/base/redirect.js.erb +12 -1
  271. data/app/views/alchemy/base/update.js.erb +4 -4
  272. data/app/views/alchemy/breadcrumb/_spacer.html.erb +1 -1
  273. data/app/views/alchemy/elements/show.js.erb +1 -5
  274. data/app/views/alchemy/essences/_essence_boolean_editor.html.erb +1 -1
  275. data/app/views/alchemy/essences/_essence_boolean_view.html.erb +3 -1
  276. data/app/views/alchemy/essences/_essence_date_editor.html.erb +4 -3
  277. data/app/views/alchemy/essences/_essence_date_view.html.erb +9 -5
  278. data/app/views/alchemy/essences/_essence_file_editor.html.erb +33 -32
  279. data/app/views/alchemy/essences/_essence_file_view.html.erb +9 -7
  280. data/app/views/alchemy/essences/_essence_html_view.html.erb +3 -1
  281. data/app/views/alchemy/essences/_essence_link_editor.html.erb +2 -2
  282. data/app/views/alchemy/essences/_essence_link_view.html.erb +5 -1
  283. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +11 -11
  284. data/app/views/alchemy/essences/_essence_picture_view.html.erb +3 -1
  285. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +1 -1
  286. data/app/views/alchemy/essences/_essence_richtext_view.html.erb +3 -4
  287. data/app/views/alchemy/essences/_essence_select_editor.html.erb +1 -1
  288. data/app/views/alchemy/essences/_essence_select_view.html.erb +3 -1
  289. data/app/views/alchemy/essences/_essence_text_editor.html.erb +14 -28
  290. data/app/views/alchemy/essences/_essence_text_view.html.erb +4 -0
  291. data/app/views/alchemy/essences/shared/_essence_picture_tools.html.erb +29 -29
  292. data/app/views/alchemy/essences/shared/_linkable_essence_tools.html.erb +9 -9
  293. data/app/views/alchemy/language_links/_language.html.erb +1 -1
  294. data/app/views/kaminari/{_first_page.html.erb → alchemy/_first_page.html.erb} +1 -1
  295. data/app/views/kaminari/{_gap.html.erb → alchemy/_gap.html.erb} +0 -0
  296. data/app/views/kaminari/{_last_page.html.erb → alchemy/_last_page.html.erb} +1 -1
  297. data/app/views/kaminari/{_next_page.html.erb → alchemy/_next_page.html.erb} +2 -2
  298. data/app/views/kaminari/{_page.html.erb → alchemy/_page.html.erb} +2 -2
  299. data/app/views/kaminari/{_paginator.html.erb → alchemy/_paginator.html.erb} +0 -0
  300. data/app/views/kaminari/{_prev_page.html.erb → alchemy/_prev_page.html.erb} +2 -2
  301. data/app/views/layouts/alchemy/admin.html.erb +17 -17
  302. data/bin/alchemy +179 -44
  303. data/bin/rails +8 -0
  304. data/config/alchemy/config.yml +24 -22
  305. data/config/alchemy/modules.yml +7 -1
  306. data/config/initializers/dragonfly.rb +20 -23
  307. data/config/initializers/simple_form.rb +144 -0
  308. data/config/locales/alchemy.de.yml +42 -33
  309. data/config/locales/alchemy.en.yml +32 -19
  310. data/config/locales/alchemy.nl.yml +937 -0
  311. data/config/locales/simple_form.de.yml +26 -0
  312. data/config/locales/simple_form.en.yml +25 -0
  313. data/config/locales/simple_form.nl.yml +25 -0
  314. data/config/routes.rb +9 -10
  315. data/db/migrate/20130827094554_alchemy_two_point_six.rb +261 -251
  316. data/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +5 -0
  317. data/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +5 -0
  318. data/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +5 -0
  319. data/db/migrate/20140107192720_add_missing_unique_indices_to_tags_and_taggings.rb +21 -0
  320. data/lib/alchemy/auth_accessors.rb +23 -2
  321. data/lib/alchemy/cache_digests/template_tracker.rb +65 -0
  322. data/lib/alchemy/capistrano.rb +28 -38
  323. data/lib/alchemy/controller_actions.rb +130 -0
  324. data/lib/alchemy/engine.rb +54 -47
  325. data/lib/alchemy/essence.rb +83 -63
  326. data/lib/alchemy/forms/builder.rb +23 -0
  327. data/lib/alchemy/hints.rb +57 -0
  328. data/lib/alchemy/locale.rb +63 -0
  329. data/lib/alchemy/modules.rb +17 -17
  330. data/lib/alchemy/mount_point.rb +1 -1
  331. data/lib/alchemy/permissions.rb +199 -0
  332. data/lib/alchemy/picture_attributes.rb +1 -1
  333. data/lib/alchemy/resource.rb +13 -17
  334. data/lib/alchemy/resources_helper.rb +16 -18
  335. data/lib/alchemy/seeder.rb +8 -10
  336. data/lib/alchemy/shell.rb +8 -6
  337. data/lib/alchemy/tasks/helpers.rb +6 -4
  338. data/lib/alchemy/test_support/auth_helpers.rb +3 -3
  339. data/lib/alchemy/test_support/controller_requests.rb +1 -1
  340. data/lib/alchemy/test_support/essence_shared_examples.rb +141 -0
  341. data/lib/alchemy/test_support/factories.rb +27 -9
  342. data/lib/alchemy/test_support/integration_helpers.rb +1 -27
  343. data/lib/alchemy/tinymce.rb +12 -32
  344. data/lib/alchemy/touching.rb +41 -0
  345. data/lib/alchemy/upgrader.rb +17 -12
  346. data/lib/alchemy/upgrader/three_point_zero.rb +62 -0
  347. data/lib/alchemy/version.rb +2 -1
  348. data/lib/alchemy_cms.rb +1 -7
  349. data/lib/rails/generators/alchemy/elements/elements_generator.rb +3 -2
  350. data/lib/rails/generators/alchemy/elements/templates/editor.html.erb +0 -2
  351. data/lib/rails/generators/alchemy/elements/templates/editor.html.haml +2 -3
  352. data/lib/rails/generators/alchemy/elements/templates/editor.html.slim +0 -2
  353. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +23 -23
  354. data/lib/rails/generators/alchemy/elements/templates/view.html.haml +16 -17
  355. data/lib/rails/generators/alchemy/elements/templates/view.html.slim +16 -17
  356. data/lib/rails/generators/alchemy/essence/templates/editor.html.erb +1 -1
  357. data/lib/rails/generators/alchemy/scaffold/files/_article_editor.html.erb +5 -0
  358. data/lib/rails/generators/alchemy/scaffold/files/_article_view.html.erb +7 -0
  359. data/lib/rails/generators/alchemy/scaffold/files/alchemy.de.yml +31 -0
  360. data/lib/rails/generators/alchemy/scaffold/files/alchemy.elements.css.scss +30 -0
  361. data/lib/rails/generators/alchemy/scaffold/files/alchemy.en.yml +31 -0
  362. data/lib/rails/generators/alchemy/scaffold/files/application.html.erb +4 -2
  363. data/lib/rails/generators/alchemy/scaffold/files/elements.yml +16 -0
  364. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +16 -7
  365. data/lib/rails/generators/alchemy/scaffold/templates/page_layouts.yml.tt +3 -2
  366. data/lib/rails/templates/alchemy.rb +3 -6
  367. data/lib/tasks/alchemy/install.rake +29 -38
  368. data/lib/tasks/alchemy/tidy.rake +1 -1
  369. data/spec/controllers/admin/attachments_controller_spec.rb +101 -35
  370. data/spec/controllers/admin/clipboard_controller_spec.rb +16 -18
  371. data/spec/controllers/admin/contents_controller_spec.rb +34 -27
  372. data/spec/controllers/admin/dashboard_controller_spec.rb +2 -4
  373. data/spec/controllers/admin/elements_controller_spec.rb +288 -160
  374. data/spec/controllers/admin/essence_files_controller_spec.rb +11 -18
  375. data/spec/controllers/admin/essence_pictures_controller_spec.rb +15 -24
  376. data/spec/controllers/admin/languages_controller_spec.rb +11 -4
  377. data/spec/controllers/admin/layoutpages_controller_spec.rb +1 -2
  378. data/spec/controllers/admin/pages_controller_spec.rb +137 -167
  379. data/spec/controllers/admin/pictures_controller_spec.rb +286 -14
  380. data/spec/controllers/admin/resources_controller_spec.rb +4 -1
  381. data/spec/controllers/alchemy/admin/tags_controller_spec.rb +63 -0
  382. data/spec/controllers/attachments_controller_spec.rb +3 -3
  383. data/spec/controllers/base_controller_spec.rb +12 -104
  384. data/spec/controllers/elements_controller_spec.rb +2 -5
  385. data/spec/controllers/messages_controller_spec.rb +49 -51
  386. data/spec/controllers/pages_controller_spec.rb +91 -111
  387. data/spec/controllers/pictures_controller_spec.rb +126 -72
  388. data/spec/dummy/Rakefile +0 -1
  389. data/spec/dummy/app/assets/javascripts/application.js +11 -7
  390. data/spec/dummy/app/assets/stylesheets/application.css +11 -5
  391. data/spec/dummy/app/models/ability.rb +9 -0
  392. data/spec/dummy/app/models/dummy_user.rb +7 -0
  393. data/spec/dummy/app/models/event.rb +7 -2
  394. data/spec/dummy/app/models/location.rb +0 -1
  395. data/spec/dummy/app/views/alchemy/elements/_article_editor.html.erb +0 -1
  396. data/spec/dummy/app/views/alchemy/elements/_headline_editor.html.erb +1 -0
  397. data/spec/dummy/app/views/layouts/application.html.erb +3 -1
  398. data/spec/dummy/bin/bundle +3 -0
  399. data/spec/dummy/bin/rails +4 -0
  400. data/spec/dummy/bin/rake +4 -0
  401. data/spec/dummy/config.ru +2 -2
  402. data/spec/dummy/config/alchemy/elements.yml +0 -3
  403. data/spec/dummy/config/alchemy/page_layouts.yml +0 -6
  404. data/spec/dummy/config/application.rb +5 -57
  405. data/spec/dummy/config/boot.rb +4 -9
  406. data/spec/dummy/config/environment.rb +2 -2
  407. data/spec/dummy/config/environments/development.rb +11 -19
  408. data/spec/dummy/config/environments/production.rb +40 -27
  409. data/spec/dummy/config/environments/test.rb +15 -14
  410. data/spec/dummy/config/initializers/alchemy.rb +2 -0
  411. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  412. data/spec/dummy/config/initializers/inflections.rb +9 -3
  413. data/spec/dummy/config/initializers/secret_token.rb +7 -2
  414. data/spec/dummy/config/initializers/session_store.rb +1 -6
  415. data/spec/dummy/config/initializers/wrap_parameters.rb +6 -6
  416. data/spec/dummy/config/routes.rb +3 -1
  417. data/spec/dummy/db/migrate/20130827094554_alchemy_two_point_six.rb +261 -251
  418. data/spec/dummy/db/migrate/20130828121054_remove_do_not_index_from_alchemy_essence_texts.rb +5 -0
  419. data/spec/dummy/db/migrate/20130828121120_remove_do_not_index_from_alchemy_essence_richtexts.rb +5 -0
  420. data/spec/dummy/db/migrate/20130918201742_add_published_at_to_alchemy_pages.rb +5 -0
  421. data/spec/dummy/db/migrate/20131209225243_create_dummy_users.rb +9 -0
  422. data/spec/dummy/db/migrate/20140107192720_add_missing_unique_indices_to_tags_and_taggings.rb +21 -0
  423. data/spec/dummy/db/schema.rb +112 -105
  424. data/spec/dummy/public/404.html +46 -26
  425. data/spec/dummy/public/422.html +46 -26
  426. data/spec/dummy/public/500.html +45 -26
  427. data/spec/features/admin/language_tree_feature_spec.rb +2 -2
  428. data/spec/features/admin/modules_integration_spec.rb +7 -13
  429. data/spec/features/admin/page_creation_feature_spec.rb +50 -0
  430. data/spec/features/admin/page_editing_feature_spec.rb +16 -0
  431. data/spec/features/admin/picture_library_integration_spec.rb +4 -4
  432. data/spec/features/admin/resources_integration_spec.rb +11 -11
  433. data/spec/features/page_feature_spec.rb +225 -0
  434. data/spec/features/translation_integration_spec.rb +7 -7
  435. data/spec/fixtures/500x500.png +0 -0
  436. data/spec/helpers/admin/attachments_helper_spec.rb +15 -0
  437. data/spec/helpers/admin/base_helper_spec.rb +88 -13
  438. data/spec/helpers/admin/contents_helper_spec.rb +53 -12
  439. data/spec/helpers/admin/elements_helper_spec.rb +24 -36
  440. data/spec/helpers/admin/essences_helper_spec.rb +48 -10
  441. data/spec/helpers/admin/navigation_helper_spec.rb +64 -29
  442. data/spec/helpers/admin/pages_helper_spec.rb +22 -1
  443. data/spec/helpers/admin/pictures_helper_spec.rb +29 -0
  444. data/spec/helpers/admin/tags_helper_spec.rb +1 -1
  445. data/spec/helpers/base_helper_spec.rb +6 -13
  446. data/spec/helpers/elements_block_helper_spec.rb +3 -3
  447. data/spec/helpers/elements_helper_spec.rb +203 -167
  448. data/spec/helpers/essences_helper_spec.rb +69 -15
  449. data/spec/helpers/pages_helper_spec.rb +28 -66
  450. data/spec/helpers/url_helper_spec.rb +41 -73
  451. data/spec/javascripts/alchemy/dialog_spec.coffee +82 -0
  452. data/spec/javascripts/alchemy/link_overlay_spec.coffee +25 -0
  453. data/spec/javascripts/alchemy_integration_spec.coffee +3 -12
  454. data/spec/javascripts/helpers/mock-ajax.js +52 -60
  455. data/spec/javascripts/support/jasmine.yml +29 -0
  456. data/spec/libraries/auth_accessors_spec.rb +24 -0
  457. data/spec/libraries/config_spec.rb +3 -3
  458. data/spec/libraries/controller_actions_spec.rb +133 -0
  459. data/spec/libraries/kaminari/scoped_pagination_url_helper_spec.rb +30 -0
  460. data/spec/libraries/modules_spec.rb +17 -0
  461. data/spec/libraries/mount_point_spec.rb +7 -7
  462. data/spec/libraries/page_layout_spec.rb +1 -1
  463. data/spec/libraries/permissions_spec.rb +219 -0
  464. data/spec/libraries/resource_spec.rb +61 -68
  465. data/spec/libraries/resources_helper_spec.rb +51 -51
  466. data/spec/libraries/shell_spec.rb +7 -8
  467. data/spec/libraries/template_tracker_spec.rb +94 -0
  468. data/spec/libraries/tinymce_spec.rb +0 -12
  469. data/spec/libraries/userstamp_spec.rb +10 -0
  470. data/spec/models/attachment_spec.rb +51 -18
  471. data/spec/models/cell_spec.rb +5 -5
  472. data/spec/models/content_spec.rb +103 -15
  473. data/spec/models/element_spec.rb +82 -18
  474. data/spec/models/essence_boolean_spec.rb +3 -8
  475. data/spec/models/essence_date_spec.rb +11 -7
  476. data/spec/models/essence_file_spec.rb +24 -4
  477. data/spec/models/essence_html_spec.rb +8 -3
  478. data/spec/models/essence_link_spec.rb +10 -0
  479. data/spec/models/essence_picture_spec.rb +109 -0
  480. data/spec/models/essence_richtext_spec.rb +6 -35
  481. data/spec/models/essence_select_spec.rb +3 -8
  482. data/spec/models/essence_text_spec.rb +83 -39
  483. data/spec/models/language_spec.rb +20 -54
  484. data/spec/models/message_spec.rb +12 -7
  485. data/spec/models/page_spec.rb +192 -185
  486. data/spec/models/picture_spec.rb +200 -45
  487. data/spec/models/resource_spec.rb +4 -24
  488. data/spec/models/site_spec.rb +69 -3
  489. data/spec/models/tag_spec.rb +6 -6
  490. data/spec/routing/routing_spec.rb +0 -32
  491. data/spec/spec_helper.rb +29 -38
  492. data/spec/support/hint_examples.rb +30 -0
  493. data/spec/support/phantomjs_mavericks_fix.rb +32 -0
  494. data/spec/support/test_tweaks.rb +31 -0
  495. data/spec/views/essences/essence_boolean_view_spec.rb +25 -0
  496. data/spec/views/essences/essence_date_view_spec.rb +39 -0
  497. data/spec/views/essences/essence_file_view_spec.rb +24 -0
  498. data/spec/views/essences/essence_html_view_spec.rb +22 -0
  499. data/spec/views/essences/essence_link_view_spec.rb +30 -0
  500. data/spec/views/essences/essence_picture_view_spec.rb +1 -1
  501. data/spec/views/essences/essence_richtext_view_spec.rb +20 -0
  502. data/spec/views/essences/essence_select_view_spec.rb +12 -0
  503. data/spec/views/essences/essence_text_view_spec.rb +40 -0
  504. data/vendor/assets/javascripts/fileupload/jquery.fileupload-process.js +172 -0
  505. data/vendor/assets/javascripts/fileupload/jquery.fileupload-validate.js +120 -0
  506. data/vendor/assets/javascripts/fileupload/jquery.fileupload.js +1416 -0
  507. data/vendor/assets/javascripts/fileupload/jquery.iframe-transport.js +210 -0
  508. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +381 -352
  509. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +1 -52
  510. data/vendor/assets/javascripts/keymaster.js +296 -0
  511. data/vendor/assets/javascripts/requestAnimationFrame.js +31 -0
  512. data/vendor/assets/javascripts/tinymce/langs/de.js +179 -0
  513. data/vendor/assets/javascripts/tinymce/langs/nl.js +179 -0
  514. data/vendor/assets/javascripts/{tiny_mce → tinymce}/license.txt +504 -504
  515. data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.min.js +1 -0
  516. data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.min.js +1 -0
  517. data/vendor/assets/javascripts/tinymce/plugins/code/plugin.min.js +1 -0
  518. data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.min.js +1 -0
  519. data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.min.js +1 -0
  520. data/vendor/assets/javascripts/tinymce/plugins/link/plugin.min.js +1 -0
  521. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.min.js +1 -0
  522. data/vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.min.js +1 -0
  523. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.min.js +1 -0
  524. data/vendor/assets/javascripts/tinymce/themes/modern/theme.min.js +1 -0
  525. data/vendor/assets/javascripts/tinymce/tinymce.min.js +10 -0
  526. metadata +351 -332
  527. data/.simplecov +0 -14
  528. data/app/assets/images/alchemy/alchemy-logo.png +0 -0
  529. data/app/assets/images/alchemy/swfupload/browse_button.png +0 -0
  530. data/app/assets/javascripts/alchemy/alchemy.file_progress.js +0 -102
  531. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +0 -227
  532. data/app/assets/javascripts/alchemy/alchemy.menubar.js +0 -62
  533. data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +0 -212
  534. data/app/assets/javascripts/alchemy/alchemy.uploader.js +0 -274
  535. data/app/assets/javascripts/alchemy/menubar.js +0 -2
  536. data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +0 -42
  537. data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/langs/de.js +0 -4
  538. data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/langs/en.js +0 -4
  539. data/app/assets/stylesheets/alchemy/form_elements.scss +0 -538
  540. data/app/assets/stylesheets/alchemy/login.scss +0 -55
  541. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +0 -98
  542. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +0 -420
  543. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy-tinymce-dialog/window.css.scss +0 -434
  544. data/app/controllers/alchemy/admin/users_controller.rb +0 -76
  545. data/app/models/alchemy/tree_node.rb +0 -4
  546. data/app/sweepers/alchemy/content_sweeper.rb +0 -41
  547. data/app/sweepers/alchemy/pages_sweeper.rb +0 -44
  548. data/app/sweepers/alchemy/pictures_sweeper.rb +0 -21
  549. data/app/views/alchemy/admin/elements/_elements_select.html.erb +0 -9
  550. data/app/views/alchemy/admin/elements/list.js.erb +0 -22
  551. data/app/views/alchemy/admin/essence_pictures/assign.js.coffee +0 -15
  552. data/app/views/alchemy/admin/pages/_contactform_links.html.erb +0 -62
  553. data/app/views/alchemy/admin/partials/_flash_upload.html.erb +0 -37
  554. data/app/views/alchemy/admin/partials/_pagination_links.html.erb +0 -1
  555. data/app/views/alchemy/admin/pictures/create.js.erb +0 -3
  556. data/app/views/alchemy/admin/resources/_boolean.html.erb +0 -5
  557. data/app/views/alchemy/admin/resources/_date.html.erb +0 -8
  558. data/app/views/alchemy/admin/resources/_datetime.html.erb +0 -1
  559. data/app/views/alchemy/admin/resources/_string.html.erb +0 -5
  560. data/app/views/alchemy/admin/resources/_text.html.erb +0 -5
  561. data/app/views/alchemy/admin/resources/destroy.js.erb +0 -1
  562. data/app/views/alchemy/base/remote_errors.js.erb +0 -6
  563. data/app/views/alchemy/search/_form.html.erb +0 -11
  564. data/app/views/alchemy/search/_result.html.erb +0 -7
  565. data/app/views/alchemy/search/_results.html.erb +0 -27
  566. data/config/authorization_rules.rb +0 -110
  567. data/config/initializers/cache_storage.rb +0 -1
  568. data/lib/alchemy/auth/engine.rb +0 -9
  569. data/lib/alchemy/ferret/search.rb +0 -86
  570. data/lib/alchemy/language_helpers.rb +0 -55
  571. data/lib/alchemy/upgrader/two_point_five.rb +0 -86
  572. data/lib/alchemy/upgrader/two_point_four.rb +0 -25
  573. data/lib/alchemy/upgrader/two_point_nine.rb +0 -33
  574. data/lib/alchemy/upgrader/two_point_one.rb +0 -95
  575. data/lib/alchemy/upgrader/two_point_six.rb +0 -32
  576. data/lib/alchemy/upgrader/two_point_three.rb +0 -25
  577. data/lib/alchemy/upgrader/two_point_two.rb +0 -114
  578. data/lib/alchemy/upgrader/two_point_zero.rb +0 -13
  579. data/lib/middleware/flash_session_cookie.rb +0 -22
  580. data/lib/rails/generators/alchemy/gallery_pictures_migration/gallery_pictures_migration_generator.rb +0 -40
  581. data/lib/tasks/ferret.rake +0 -10
  582. data/script/rails +0 -6
  583. data/spec/dummy/app/models/user.rb +0 -14
  584. data/spec/dummy/app/views/alchemy/elements/_searchresult_view.html.erb +0 -4
  585. data/spec/dummy/config/authorization_rules.rb +0 -7
  586. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  587. data/spec/dummy/script/rails +0 -6
  588. data/spec/fast_specs.rb +0 -15
  589. data/spec/features/admin/element_create_feature_spec.rb +0 -18
  590. data/spec/features/admin/element_trash_feature_spec.rb +0 -21
  591. data/spec/features/admin/pages_controller_spec.rb +0 -59
  592. data/spec/features/pages_controller_spec.rb +0 -262
  593. data/spec/javascripts/alchemy/link_overlay_spec.js.coffee +0 -42
  594. data/spec/javascripts/helpers/.gitkeep +0 -0
  595. data/spec/javascripts/helpers/jasmine-jquery-1.3.1.js +0 -289
  596. data/spec/javascripts/spec.css +0 -3
  597. data/spec/javascripts/spec.js +0 -2
  598. data/spec/libraries/essence_spec.rb +0 -76
  599. data/spec/support/alchemy/controller_hacks.rb +0 -41
  600. data/vendor/assets/javascripts/jquery_plugins/jquery.dialogextend.js +0 -684
  601. data/vendor/assets/javascripts/jquery_plugins/jquery.html5uploader.js +0 -271
  602. data/vendor/assets/javascripts/jquery_plugins/jquery.selectboxit.min.js +0 -11
  603. data/vendor/assets/javascripts/jquery_plugins/preloadCssImages.jQuery_v5.js +0 -152
  604. data/vendor/assets/javascripts/keymage.min.js +0 -6
  605. data/vendor/assets/javascripts/swfupload/SWFObject License.txt +0 -4
  606. data/vendor/assets/javascripts/swfupload/swfupload.cookies.js +0 -53
  607. data/vendor/assets/javascripts/swfupload/swfupload.js +0 -980
  608. data/vendor/assets/javascripts/swfupload/swfupload.queue.js +0 -98
  609. data/vendor/assets/javascripts/swfupload/swfupload.speed.js +0 -342
  610. data/vendor/assets/javascripts/swfupload/swfupload.swf +0 -0
  611. data/vendor/assets/javascripts/swfupload/swfupload.swfobject.js +0 -715
  612. data/vendor/assets/javascripts/tiny_mce/langs/de.js +0 -1
  613. data/vendor/assets/javascripts/tiny_mce/langs/en.js +0 -1
  614. data/vendor/assets/javascripts/tiny_mce/plugins/autoresize/editor_plugin.js +0 -1
  615. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js +0 -1
  616. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -110
  617. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js +0 -1
  618. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +0 -387
  619. data/vendor/assets/javascripts/tiny_mce/plugins/paste/editor_plugin.js +0 -1
  620. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +0 -36
  621. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +0 -51
  622. data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/de_dlg.js +0 -1
  623. data/vendor/assets/javascripts/tiny_mce/plugins/paste/langs/en_dlg.js +0 -1
  624. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +0 -27
  625. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +0 -21
  626. data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +0 -180
  627. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +0 -17
  628. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +0 -25
  629. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +0 -13
  630. data/vendor/assets/javascripts/tiny_mce/plugins/table/editor_plugin.js +0 -1
  631. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +0 -319
  632. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +0 -27
  633. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +0 -254
  634. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +0 -501
  635. data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/de_dlg.js +0 -1
  636. data/vendor/assets/javascripts/tiny_mce/plugins/table/langs/en_dlg.js +0 -1
  637. data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +0 -32
  638. data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +0 -158
  639. data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +0 -188
  640. data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +0 -52
  641. data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +0 -26
  642. data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +0 -55
  643. data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +0 -70
  644. data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +0 -1
  645. data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +0 -80
  646. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/colorpicker.jpg +0 -0
  647. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/flash.gif +0 -0
  648. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
  649. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/iframe.gif +0 -0
  650. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/pagebreak.gif +0 -0
  651. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/quicktime.gif +0 -0
  652. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/realmedia.gif +0 -0
  653. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/shockwave.gif +0 -0
  654. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/video.gif +0 -0
  655. data/vendor/assets/javascripts/tiny_mce/themes/advanced/img/windowsmedia.gif +0 -0
  656. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +0 -73
  657. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +0 -56
  658. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +0 -363
  659. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +0 -345
  660. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +0 -253
  661. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +0 -159
  662. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +0 -78
  663. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +0 -1
  664. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +0 -1
  665. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +0 -1
  666. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +0 -1
  667. data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +0 -57
  668. data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +0 -47
  669. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +0 -50
  670. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +0 -118
  671. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/buttons.png +0 -0
  672. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/items.gif +0 -0
  673. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif +0 -0
  674. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif +0 -0
  675. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/progress.gif +0 -0
  676. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif +0 -0
  677. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +0 -219
  678. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +0 -24
  679. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +0 -106
  680. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +0 -106
  681. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +0 -48
  682. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +0 -118
  683. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png +0 -0
  684. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png +0 -0
  685. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png +0 -0
  686. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +0 -222
  687. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +0 -8
  688. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +0 -5
  689. data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +0 -25
  690. data/vendor/assets/javascripts/tiny_mce/tiny_mce.js +0 -1
  691. data/vendor/assets/javascripts/tiny_mce/tiny_mce_popup.js +0 -5
  692. data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +0 -70
  693. data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +0 -210
  694. data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +0 -162
  695. data/vendor/assets/javascripts/tiny_mce/utils/validate.js +0 -252
@@ -2,37 +2,35 @@ require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
4
  describe Admin::ClipboardController do
5
-
6
- let(:public_page) { FactoryGirl.create(:public_page) }
7
- let(:element) { FactoryGirl.create(:element, :page => public_page) }
8
- let(:another_element) { FactoryGirl.create(:element, :page => public_page) }
5
+ let(:public_page) { build_stubbed(:public_page) }
6
+ let(:element) { build_stubbed(:element, page: public_page) }
7
+ let(:another_element) { build_stubbed(:element, page: public_page) }
9
8
 
10
9
  before do
11
10
  sign_in(admin_user)
12
11
  session[:clipboard] = Clipboard.new
12
+ Element.stub(find: element)
13
13
  end
14
14
 
15
15
  describe "#insert" do
16
-
17
16
  it "should hold element ids" do
18
- post(:insert, {:remarkable_type => :elements, :remarkable_id => element.id, :format => :js})
19
- session[:clipboard][:elements].should == [{:id => element.id, :action => 'copy'}]
17
+ xhr :post, :insert, {remarkable_type: :elements, remarkable_id: element.id}
18
+ session[:clipboard][:elements].should == [{id: element.id, action: 'copy'}]
20
19
  end
21
20
 
22
21
  it "should not have the same element twice" do
23
- session[:clipboard][:elements] = {:id => element.id, :action => 'copy'}
24
- post(:insert, {:remarkable_type => :elements, :remarkable_id => element.id, :format => :js})
22
+ session[:clipboard][:elements] = {id: element.id, action: 'copy'}
23
+ xhr :post, :insert, {remarkable_type: :elements, remarkable_id: element.id}
25
24
  session[:clipboard][:elements].collect { |e| e[:id] }.should_not == [element.id, element.id]
26
25
  end
27
-
28
26
  end
29
27
 
30
28
  describe "#delete" do
31
29
  it "should remove element ids from clipboard" do
32
- session[:clipboard][:elements] = {:id => element.id, :action => 'copy'}
33
- session[:clipboard][:elements] << {:id => another_element.id, :action => 'copy'}
34
- delete(:remove, {:remarkable_type => :elements, :remarkable_id => another_element.id, :format => :js})
35
- session[:clipboard][:elements].should == [{:id => element.id, :action => 'copy'}]
30
+ session[:clipboard][:elements] = {id: element.id, action: 'copy'}
31
+ session[:clipboard][:elements] << {id: another_element.id, action: 'copy'}
32
+ xhr :delete, :remove, {remarkable_type: :elements, remarkable_id: another_element.id}
33
+ session[:clipboard][:elements].should == [{id: element.id, action: 'copy'}]
36
34
  end
37
35
  end
38
36
 
@@ -40,16 +38,16 @@ module Alchemy
40
38
 
41
39
  context "with elements as remarkable_type" do
42
40
  it "should clear the elements clipboard" do
43
- session[:clipboard][:elements] = {:id => element.id}
44
- delete(:clear, {:remarkable_type => :elements, :format => :js})
41
+ session[:clipboard][:elements] = {id: element.id}
42
+ xhr :delete, :clear, {remarkable_type: :elements}
45
43
  session[:clipboard].should be_empty
46
44
  end
47
45
  end
48
46
 
49
47
  context "with pages as remarkable_type" do
50
48
  it "should clear the pages clipboard" do
51
- session[:clipboard][:pages] = {:id => public_page.id}
52
- delete(:clear, {:remarkable_type => :pages, :format => :js})
49
+ session[:clipboard][:pages] = {id: public_page.id}
50
+ xhr :delete, :clear, {remarkable_type: :pages}
53
51
  session[:clipboard].should be_empty
54
52
  end
55
53
  end
@@ -1,23 +1,27 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Alchemy::Admin::ContentsController do
4
- before { sign_in(admin_user) }
3
+ module Alchemy
4
+ describe Admin::ContentsController do
5
+ let(:element) { build_stubbed(:element) }
6
+ let(:content) { build_stubbed(:content, element: element) }
5
7
 
6
- let(:element) { FactoryGirl.create(:element, create_contents_after_create: true) }
8
+ before do
9
+ sign_in(admin_user)
10
+ Element.stub(find: element)
11
+ end
7
12
 
8
- describe '#create' do
9
- let(:element) { FactoryGirl.create(:element, name: 'headline') }
13
+ describe '#create' do
14
+ let(:element) { build_stubbed(:element, name: 'headline') }
10
15
 
11
- it "creates a content from name" do
12
- expect {
16
+ it "creates a content from name" do
17
+ Content.should_receive(:create_from_scratch).and_return(content)
13
18
  xhr :post, :create, {content: {element_id: element.id, name: 'headline'}}
14
- }.to change{element.contents.count}.by(1)
15
- end
19
+ end
16
20
 
17
- it "creates a content from essence_type" do
18
- expect {
21
+ it "creates a content from essence_type" do
22
+ Content.should_receive(:create_from_scratch).and_return(content)
19
23
  xhr :post, :create, {content: {element_id: element.id, essence_type: 'EssencePicture'}}
20
- }.to change{element.contents.count}.by(1)
24
+ end
21
25
  end
22
26
 
23
27
  context 'inside a picture gallery' do
@@ -32,29 +36,32 @@ describe Alchemy::Admin::ContentsController do
32
36
 
33
37
  context 'with picture_id given' do
34
38
  it "assigns the picture" do
35
- Alchemy::Content.any_instance.should_receive(:update_essence).with(picture_id: '1')
39
+ Content.any_instance.should_receive(:update_essence).with(picture_id: '1')
36
40
  xhr :post, :create, attributes.merge(picture_id: '1')
37
41
  end
38
42
  end
39
43
  end
40
- end
41
44
 
42
- describe '#update' do
43
- it "should update a content via ajax" do
44
- xhr :post, :update, {id: element.contents.find_by_name('intro').id, content: {body: 'Peters Petshop'}}
45
- element.ingredient('intro').should == "Peters Petshop"
45
+ describe '#update' do
46
+ before do
47
+ Content.stub(find: content)
48
+ end
49
+
50
+ it "should update a content via ajax" do
51
+ content.essence.should_receive(:update).with('ingredient' => 'Peters Petshop')
52
+ xhr :post, :update, {id: content.id, content: {ingredient: 'Peters Petshop'}}
53
+ end
46
54
  end
47
- end
48
55
 
49
- describe "#order" do
50
- context "with content_ids in params" do
51
- it "should reorder the contents" do
52
- content_ids = element.contents.essence_texts.collect(&:id)
53
- xhr :post, :order, {content_ids: content_ids.reverse}
54
- response.status.should == 200
55
- element.contents.essence_texts.collect(&:id).should == content_ids.reverse
56
+ describe "#order" do
57
+ context "with content_ids in params" do
58
+ it "should reorder the contents" do
59
+ content_ids = element.contents.essence_texts.pluck(:id)
60
+ xhr :post, :order, {content_ids: content_ids.reverse}
61
+ response.status.should == 200
62
+ element.contents.essence_texts.pluck(:id).should == content_ids.reverse
63
+ end
56
64
  end
57
65
  end
58
66
  end
59
-
60
67
  end
@@ -10,8 +10,6 @@ module Alchemy
10
10
  before do
11
11
  Page.stub_chain(:from_current_site, :all_last_edited_from).and_return([])
12
12
  Page.stub_chain(:from_current_site, :all_locked).and_return([])
13
- User.stub(:logged_in).and_return([user])
14
- user.stub(:sign_in_count).and_return(5)
15
13
  end
16
14
 
17
15
  it "assigns @last_edited_pages" do
@@ -26,7 +24,7 @@ module Alchemy
26
24
 
27
25
  context 'with user class having logged_in scope' do
28
26
  context 'with other users online' do
29
- let(:another_user) { mock_model('User') }
27
+ let(:another_user) { mock_model('DummyUser') }
30
28
 
31
29
  before do
32
30
  Alchemy.user_class.should_receive(:logged_in).and_return([another_user])
@@ -60,7 +58,7 @@ module Alchemy
60
58
 
61
59
  it "assigns @sites" do
62
60
  get :index
63
- expect(assigns(:sites)).to eq(Site.scoped)
61
+ expect(assigns(:sites)).to eq(Site.all)
64
62
  end
65
63
  end
66
64
 
@@ -2,256 +2,194 @@ require 'spec_helper'
2
2
 
3
3
  module Alchemy
4
4
  describe Admin::ElementsController do
5
+ let(:alchemy_page) { create(:page) }
6
+ let(:element) { create(:element, :page_id => alchemy_page.id) }
7
+ let(:element_in_clipboard) { create(:element, :page_id => alchemy_page.id) }
8
+ let(:clipboard) { session[:clipboard] = Clipboard.new }
5
9
 
6
- before(:each) do
7
- sign_in(admin_user)
8
- end
9
-
10
- let(:alchemy_page) { FactoryGirl.create(:page, :urlname => 'lulu') }
11
- let(:element) { FactoryGirl.create(:element, :page_id => alchemy_page.id) }
12
- let(:element_in_clipboard) { FactoryGirl.create(:element, :page_id => alchemy_page.id) }
13
- let(:clipboard) { session[:clipboard] = Clipboard.new }
14
-
15
- describe '#create' do
10
+ before { sign_in(author_user) }
16
11
 
17
- before { element }
12
+ describe '#index' do
13
+ let(:alchemy_page) { build_stubbed(:page) }
18
14
 
19
- it "should insert the element at bottom of list" do
20
- post :create, {:element => {:name => 'news', :page_id => alchemy_page.id}, :format => :js}
21
- alchemy_page.elements.count.should == 2
22
- alchemy_page.elements.last.name.should == 'news'
15
+ before do
16
+ Page.stub(find: alchemy_page)
23
17
  end
24
18
 
25
- context "on a page with a setting for insert_elements_at of top" do
19
+ context 'with cells' do
20
+ let(:cell) { build_stubbed(:cell, page: alchemy_page) }
26
21
 
27
- before do
28
- PageLayout.stub(:get).and_return({
29
- 'name' => 'news',
30
- 'elements' => ['news'],
31
- 'insert_elements_at' => 'top'
32
- })
22
+ before { alchemy_page.stub(cells: [cell]) }
23
+
24
+ it "groups elements by cell" do
25
+ alchemy_page.should_receive(:elements_grouped_by_cells)
26
+ get :index, {page_id: alchemy_page.id}
27
+ assigns(:cells).should eq([cell])
33
28
  end
29
+ end
34
30
 
35
- it "should insert the element at top of list" do
36
- post :create, {:element => {:name => 'news', :page_id => alchemy_page.id}, :format => :js}
37
- alchemy_page.elements.count.should == 2
38
- alchemy_page.elements.first.name.should == 'news'
31
+ context 'without cells' do
32
+ before { alchemy_page.stub(cells: []) }
33
+
34
+ it "assigns page elements" do
35
+ alchemy_page.should_receive(:elements).and_return(double(not_trashed: []))
36
+ get :index, {page_id: alchemy_page.id}
39
37
  end
40
38
  end
41
39
  end
42
40
 
43
- describe '#find_or_create_cell' do
41
+ describe '#list' do
42
+ let(:alchemy_page) { build_stubbed(:page) }
44
43
 
45
44
  before do
46
- Cell.stub!(:definition_for).and_return({'name' => 'header', 'elements' => ['header']})
47
- controller.instance_variable_set(:@page, alchemy_page)
45
+ Page.stub(find: alchemy_page)
48
46
  end
49
47
 
50
- context "with element name and cell name in the params" do
51
-
52
- before do
53
- controller.stub(:params).and_return({
54
- :element => {:name => 'header#header'}
55
- })
56
- end
57
-
58
- context "with cell not existing" do
59
- it "should create the cell" do
60
- expect {
61
- controller.send(:find_or_create_cell)
62
- }.to change(alchemy_page.cells, :count).from(0).to(1)
63
- end
48
+ context 'without page_id, but with page_urlname' do
49
+ it "loads page from urlname" do
50
+ Language.stub(:current).and_return(double(code: 'en', pages: double(find_by: double(id: 1001))))
51
+ xhr :get, :list, {page_urlname: 'contact'}
64
52
  end
65
53
 
66
- context "with the cell already present" do
67
-
68
- before { FactoryGirl.create(:cell, :page => alchemy_page, :name => 'header') }
54
+ describe 'view' do
55
+ render_views
69
56
 
70
- it "should load the cell" do
71
- expect {
72
- controller.send(:find_or_create_cell)
73
- }.to_not change(alchemy_page.cells, :count)
57
+ it "should return a select tag with elements" do
58
+ xhr :get, :list, {page_urlname: alchemy_page.urlname}
59
+ response.body.should match(/select(.*)elements_from_page_selector(.*)option/)
74
60
  end
75
-
76
61
  end
77
-
78
62
  end
79
63
 
80
- context "with only the element name in the params" do
81
-
82
- before do
83
- controller.stub(:params).and_return({
84
- :element => {:name => 'header'}
85
- })
86
- end
87
-
88
- it "should return nil" do
89
- controller.send(:find_or_create_cell).should be_nil
64
+ context 'with page_id' do
65
+ it "loads page from urlname" do
66
+ xhr :get, :list, {page_id: alchemy_page.id}
67
+ assigns(:page_id).should eq(alchemy_page.id.to_s)
90
68
  end
91
-
92
69
  end
93
-
94
70
  end
95
71
 
96
- describe '#list' do
72
+ describe '#new' do
73
+ let(:alchemy_page) { build_stubbed(:page) }
97
74
 
98
- render_views
75
+ before { Page.stub(:find_by_id).and_return(alchemy_page) }
99
76
 
100
- it "should return a select tag with elements" do
101
- Alchemy::Page.should_receive(:find_by_urlname_and_language_id).and_return(alchemy_page)
102
- Alchemy::Element.stub_chain([:published, :find_all_by_page_id]).and_return([element])
103
- get :list, {:page_urlname => alchemy_page.urlname, :format => :js}
104
- response.body.should match(/select(.*)elements_from_page_selector(.*)option/)
77
+ it "assign variable for all available element definitions" do
78
+ alchemy_page.should_receive(:available_element_definitions)
79
+ get :new, {page_id: alchemy_page.id}
105
80
  end
106
81
 
107
- end
108
-
109
- describe "#order" do
110
- let(:element_1) { FactoryGirl.create(:element) }
111
- let(:element_2) { FactoryGirl.create(:element) }
112
- let(:element_3) { FactoryGirl.create(:element) }
113
- let(:element_ids) { [element_1.id, element_3.id, element_2.id] }
82
+ context "with elements in clipboard" do
83
+ let(:clipboard_items) { [{:id => element.id, :action => 'copy'}] }
114
84
 
115
- it "sets new position for given element ids" do
116
- xhr :post, :order, element_ids: element_ids
117
- expect(Element.scoped.pluck(:id)).to eq(element_ids)
118
- end
119
-
120
- context "untrashing" do
121
- let(:trashed_element) { FactoryGirl.create(:element, public: false, position: nil, page_id: 58, cell_id: 32) }
85
+ before { clipboard[:elements] = clipboard_items }
122
86
 
123
- before do
124
- # Because of a before_create filter it can not be created with a nil position and needs to be trashed here
125
- trashed_element.trash!
126
- end
127
-
128
- it "sets a list of trashed element ids" do
129
- xhr :post, :order, element_ids: [trashed_element.id]
130
- expect(assigns(:trashed_elements).to_a).to eq [trashed_element.id]
131
- end
132
-
133
- it "should set a new position to the element" do
134
- xhr :post, :order, element_ids: [trashed_element.id]
135
- trashed_element.reload
136
- trashed_element.position.should_not == nil
137
- end
138
-
139
- it "should assign the (new) page_id to the element" do
140
- xhr :post, :order, element_ids: [trashed_element.id], page_id: 1, cell_id: nil
141
- trashed_element.reload
142
- trashed_element.page_id.should == 1
143
- end
144
-
145
- it "should assign the (new) cell_id to the element" do
146
- xhr :post, :order, element_ids: [trashed_element.id], page_id: 1, cell_id: 5
147
- trashed_element.reload
148
- trashed_element.cell_id.should == 5
87
+ it "should load all elements from clipboard" do
88
+ Element.should_receive(:all_from_clipboard_for_page).and_return(clipboard_items)
89
+ get :new, {page_id: alchemy_page.id}
90
+ assigns(:clipboard_items).should == clipboard_items
149
91
  end
150
92
  end
151
93
  end
152
94
 
153
- describe '#new' do
154
-
155
- context "elements in clipboard" do
156
-
157
- let(:clipboard) { session[:clipboard] = Clipboard.new }
95
+ describe '#create' do
96
+ describe 'insertion position' do
97
+ before { element }
158
98
 
159
- before(:each) do
160
- clipboard[:elements] = [{:id => element.id, :action => 'copy'}]
99
+ it "should insert the element at bottom of list" do
100
+ xhr :post, :create, {element: {name: 'news', page_id: alchemy_page.id}}
101
+ alchemy_page.elements.count.should == 2
102
+ alchemy_page.elements.last.name.should == 'news'
161
103
  end
162
104
 
163
- it "should load all elements from clipboard" do
164
- get :new, {:page_id => alchemy_page.id, :format => :js}
165
- assigns(:clipboard_items).should be_kind_of(Array)
166
- end
105
+ context "on a page with a setting for insert_elements_at of top" do
106
+ before do
107
+ PageLayout.stub(:get).and_return({
108
+ 'name' => 'news',
109
+ 'elements' => ['news'],
110
+ 'insert_elements_at' => 'top'
111
+ })
112
+ end
167
113
 
114
+ it "should insert the element at top of list" do
115
+ xhr :post, :create, {element: {name: 'news', page_id: alchemy_page.id}}
116
+ alchemy_page.elements.count.should == 2
117
+ alchemy_page.elements.first.name.should == 'news'
118
+ end
119
+ end
168
120
  end
169
121
 
170
- end
171
-
172
- describe '#create' do
173
-
174
122
  context "if page has cells" do
175
-
176
123
  context "" do
177
-
178
124
  before do
179
- @page = FactoryGirl.create(:public_page, :do_not_autogenerate => false)
180
- @cell = FactoryGirl.create(:cell, :name => 'header', :page => @page)
125
+ @page = create(:public_page, :do_not_autogenerate => false)
126
+ @cell = create(:cell, :name => 'header', :page => @page)
181
127
  PageLayout.stub(:get).and_return({
182
128
  'name' => 'standard',
183
129
  'elements' => ['article'],
184
130
  'cells' => ['header']
185
131
  })
186
- Cell.stub!(:definition_for).and_return({'name' => 'header', 'elements' => ['article']})
132
+ Cell.stub(:definition_for).and_return({'name' => 'header', 'elements' => ['article']})
187
133
  end
188
134
 
189
135
  context "and cell name in element name" do
190
-
191
136
  it "should put the element in the correct cell" do
192
- post :create, {:element => {:name => "article#header", :page_id => @page.id}, :format => :js}
137
+ xhr :post, :create, {:element => {:name => "article#header", :page_id => @page.id}}
193
138
  @cell.elements.first.should be_an_instance_of(Element)
194
139
  end
195
-
196
140
  end
197
141
 
198
142
  context "and no cell name in element name" do
199
-
200
143
  it "should put the element in the main cell" do
201
- post :create, {:element => {:name => "article", :page_id => @page.id}, :format => :js}
144
+ xhr :post, :create, {:element => {:name => "article", :page_id => @page.id}}
202
145
  @page.elements.not_in_cell.first.should be_an_instance_of(Element)
203
146
  end
204
-
205
147
  end
206
-
207
148
  end
208
149
 
209
150
  context "with paste_from_clipboard in parameters" do
210
-
211
151
  context "" do
212
152
  before do
213
- @page = FactoryGirl.create(:public_page, :do_not_autogenerate => false)
214
- @cell = FactoryGirl.create(:cell, :name => 'header', :page => @page)
153
+ @page = create(:public_page, :do_not_autogenerate => false)
154
+ @cell = create(:cell, :name => 'header', :page => @page)
215
155
  PageLayout.stub(:get).and_return({
216
156
  'name' => 'standard',
217
157
  'elements' => ['article'],
218
158
  'cells' => ['header']
219
159
  })
220
- Cell.stub!(:definition_for).and_return({'name' => 'header', 'elements' => ['article']})
160
+ Cell.stub(:definition_for).and_return({'name' => 'header', 'elements' => ['article']})
221
161
  clipboard[:elements] = [{:id => element_in_clipboard.id}]
222
162
  end
223
163
 
224
164
  context "and cell name in element name" do
225
165
  it "should create the element in the correct cell" do
226
- post :create, {:element => {:page_id => @page.id}, :paste_from_clipboard => "#{element_in_clipboard.id}##{@cell.name}", :format => :js}
166
+ xhr :post, :create, {:element => {:page_id => @page.id}, :paste_from_clipboard => "#{element_in_clipboard.id}##{@cell.name}"}
227
167
  @cell.elements.first.should be_an_instance_of(Element)
228
168
  end
229
169
  end
230
170
 
231
171
  context "and no cell name in element name" do
232
172
  it "should create the element in the nil cell" do
233
- post :create, {:element => {:page_id => @page.id}, :paste_from_clipboard => "#{element_in_clipboard.id}", :format => :js}
173
+ xhr :post, :create, {:element => {:page_id => @page.id}, :paste_from_clipboard => "#{element_in_clipboard.id}"}
234
174
  @page.elements.first.cell.should == nil
235
175
  end
236
176
  end
237
177
 
238
178
  context "" do
239
-
240
179
  before { @cell.elements.create(:page_id => @page.id, :name => "article", :create_contents_after_create => false) }
241
180
 
242
181
  it "should set the correct position for the element" do
243
- post :create, {:element => {:page_id => @page.id}, :paste_from_clipboard => "#{element_in_clipboard.id}##{@cell.name}", :format => :js}
182
+ xhr :post, :create, {:element => {:page_id => @page.id}, :paste_from_clipboard => "#{element_in_clipboard.id}##{@cell.name}"}
244
183
  @cell.elements.last.position.should == @cell.elements.count
245
184
  end
246
-
247
185
  end
248
186
  end
249
187
 
250
188
  context "on a page with a setting for insert_elements_at of top" do
251
- let(:alchemy_page) { FactoryGirl.create(:public_page, :name => 'News') }
252
- let(:element_in_clipboard) { FactoryGirl.create(:element, :page => alchemy_page, :name => 'news') }
189
+ let(:alchemy_page) { create(:public_page, :name => 'News') }
190
+ let(:element_in_clipboard) { create(:element, :page => alchemy_page, :name => 'news') }
253
191
  let(:cell) { alchemy_page.cells.first }
254
- let(:element) { FactoryGirl.create(:element, :name => 'news', :page => alchemy_page, :cell => cell) }
192
+ let(:element) { create(:element, :name => 'news', :page => alchemy_page, :cell => cell) }
255
193
 
256
194
  before do
257
195
  PageLayout.stub(:get).and_return({
@@ -260,49 +198,239 @@ module Alchemy
260
198
  'insert_elements_at' => 'top',
261
199
  'cells' => ['news']
262
200
  })
263
- Cell.stub!(:definition_for).and_return({'name' => 'news', 'elements' => ['news']})
201
+ Cell.stub(:definition_for).and_return({'name' => 'news', 'elements' => ['news']})
264
202
  clipboard[:elements] = [{:id => element_in_clipboard.id}]
265
203
  cell.elements << element
266
204
  end
267
205
 
268
206
  it "should insert the element at top of list" do
269
- post :create, {:element => {:name => 'news', :page_id => alchemy_page.id}, :paste_from_clipboard => "#{element_in_clipboard.id}##{cell.name}", :format => :js}
207
+ xhr :post, :create, {:element => {:name => 'news', :page_id => alchemy_page.id}, :paste_from_clipboard => "#{element_in_clipboard.id}##{cell.name}"}
270
208
  cell.elements.count.should == 2
271
209
  cell.elements.first.name.should == 'news'
272
210
  cell.elements.first.should_not == element
273
211
  end
274
212
  end
275
-
276
213
  end
277
-
278
214
  end
279
215
 
280
216
  context "with paste_from_clipboard in parameters" do
281
-
282
217
  render_views
283
218
 
284
- before(:each) do
285
- clipboard[:elements] = [{:id => element_in_clipboard.id, :action => 'cut'}]
219
+ before do
220
+ clipboard[:elements] = [{id: element_in_clipboard.id, action: 'cut'}]
286
221
  end
287
222
 
288
223
  it "should create an element from clipboard" do
289
- post :create, {:paste_from_clipboard => element_in_clipboard.id, :element => {:page_id => alchemy_page.id}, :format => :js}
224
+ xhr :post, :create, {paste_from_clipboard: element_in_clipboard.id, element: {page_id: alchemy_page.id}}
290
225
  response.status.should == 200
291
226
  response.body.should match(/Succesfully added new element/)
292
227
  end
293
228
 
294
229
  context "and with cut as action parameter" do
295
-
296
230
  it "should also remove the element id from clipboard" do
297
- post :create, {:paste_from_clipboard => element_in_clipboard.id, :element => {:page_id => alchemy_page.id}, :format => :js}
231
+ xhr :post, :create, {paste_from_clipboard: element_in_clipboard.id, element: {page_id: alchemy_page.id}}
298
232
  session[:clipboard].contains?(:elements, element_in_clipboard.id).should_not be_true
299
233
  end
234
+ end
235
+ end
236
+
237
+ context 'if element could not be saved' do
238
+ subject { post :create, {element: {page_id: alchemy_page.id}} }
239
+
240
+ before { Element.any_instance.stub(save: false) }
241
+
242
+ it "renders the new template" do
243
+ expect(subject).to render_template(:new)
244
+ end
245
+ end
246
+ end
247
+
248
+ describe '#find_or_create_cell' do
249
+ before do
250
+ Cell.stub(:definition_for).and_return({'name' => 'header', 'elements' => ['header']})
251
+ controller.instance_variable_set(:@page, alchemy_page)
252
+ end
253
+
254
+ context "with element name and cell name in the params" do
255
+ before do
256
+ controller.stub(params: {element: {name: 'header#header'}})
257
+ end
258
+
259
+ context "with cell not existing" do
260
+ it "should create the cell" do
261
+ expect {
262
+ controller.send(:find_or_create_cell)
263
+ }.to change(alchemy_page.cells, :count).from(0).to(1)
264
+ end
265
+ end
266
+
267
+ context "with the cell already present" do
268
+ before do
269
+ create(:cell, page: alchemy_page, name: 'header')
270
+ end
271
+
272
+ it "should load the cell" do
273
+ expect {
274
+ controller.send(:find_or_create_cell)
275
+ }.to_not change(alchemy_page.cells, :count)
276
+ end
277
+ end
278
+ end
300
279
 
280
+ context "with only the element name in the params" do
281
+ before do
282
+ controller.stub(params: {element: {name: 'header'}})
301
283
  end
302
284
 
285
+ it "should return nil" do
286
+ controller.send(:find_or_create_cell).should be_nil
287
+ end
303
288
  end
304
289
 
290
+ context 'with cell definition not found' do
291
+ before do
292
+ controller.stub(params: {element: {name: 'header#header'}})
293
+ Cell.stub(definition_for: nil)
294
+ end
295
+
296
+ it "raises error" do
297
+ expect { controller.send(:find_or_create_cell) }.to raise_error(CellDefinitionError)
298
+ end
299
+ end
305
300
  end
306
301
 
302
+ describe '#update' do
303
+ let(:page) { build_stubbed(:page) }
304
+ let(:element) { build_stubbed(:element, page: page) }
305
+ let(:contents_parameters) { ActionController::Parameters.new(1 => {ingredient: 'Title'}) }
306
+ let(:element_parameters) { ActionController::Parameters.new(tag_list: 'Tag 1', public: false) }
307
+
308
+ before do
309
+ Element.stub(:find).and_return element
310
+ controller.should_receive(:contents_params).and_return(contents_parameters)
311
+ end
312
+
313
+ it "updates all contents in element" do
314
+ element.should_receive(:update_contents).with(contents_parameters)
315
+ xhr :put, :update, {id: element.id}
316
+ end
317
+
318
+ it "updates the element" do
319
+ controller.should_receive(:element_params).and_return(element_parameters)
320
+ element.should_receive(:update_contents).and_return(true)
321
+ element.should_receive(:update_attributes!).with(element_parameters).and_return(true)
322
+ xhr :put, :update, {id: element.id}
323
+ end
324
+
325
+ context "failed validations" do
326
+ it "displays validation failed notice" do
327
+ element.should_receive(:update_contents).and_return(false)
328
+ xhr :put, :update, {id: element.id}
329
+ assigns(:element_validated).should be_false
330
+ end
331
+ end
332
+ end
333
+
334
+ describe 'params security' do
335
+ context "contents params" do
336
+ let(:parameters) { ActionController::Parameters.new(contents: {1 => {ingredient: 'Title'}}) }
337
+
338
+ specify ":contents is required" do
339
+ controller.params.should_receive(:fetch).and_return(parameters)
340
+ controller.send :contents_params
341
+ end
342
+
343
+ specify "everything is permitted" do
344
+ controller.should_receive(:params).and_return(parameters)
345
+ parameters.should_receive(:fetch).and_return(parameters)
346
+ parameters.should_receive(:permit!)
347
+ controller.send :contents_params
348
+ end
349
+ end
350
+
351
+ context "element params" do
352
+ let(:parameters) { ActionController::Parameters.new(element: {public: true}) }
353
+
354
+ specify ":element is required" do
355
+ controller.params.should_receive(:require).with(:element).and_return(parameters)
356
+ controller.send :element_params
357
+ end
358
+
359
+ specify ":public and :tag_list is permitted" do
360
+ controller.should_receive(:params).and_return(parameters)
361
+ parameters.should_receive(:require).with(:element).and_return(parameters)
362
+ parameters.should_receive(:permit).with(:public, :tag_list)
363
+ controller.send :element_params
364
+ end
365
+ end
366
+ end
367
+
368
+ describe '#trash' do
369
+ subject { xhr :delete, :trash, {id: element.id} }
370
+
371
+ let(:element) { build_stubbed(:element) }
372
+
373
+ before { Element.stub(find: element) }
374
+
375
+ it "trashes the element instead of deleting it" do
376
+ element.should_receive(:trash!).and_return(true)
377
+ subject
378
+ end
379
+ end
380
+
381
+ describe '#fold' do
382
+ subject { xhr :post, :fold, {id: element.id} }
383
+
384
+ let(:element) { build_stubbed(:element) }
385
+
386
+ before do
387
+ element.stub(save: true)
388
+ Element.stub(find: element)
389
+ end
390
+
391
+ context 'if element is folded' do
392
+ before { element.stub(folded: true) }
393
+
394
+ it "sets folded to false." do
395
+ element.should_receive(:folded=).with(false).and_return(true)
396
+ subject
397
+ end
398
+ end
399
+
400
+ context 'if element is not folded' do
401
+ before { element.stub(folded: false) }
402
+
403
+ it "sets folded to true." do
404
+ element.should_receive(:folded=).with(true).and_return(true)
405
+ subject
406
+ end
407
+ end
408
+ end
409
+
410
+ describe "untrashing" do
411
+ before do
412
+ @element = create(:element, :public => false, :position => nil, :page_id => 58, :cell_id => 32)
413
+ # Because of a before_create filter it can not be created with a nil position and needs to be trashed here
414
+ @element.trash!
415
+ end
416
+
417
+ it "should set a new position to the element" do
418
+ xhr :post, :order, {:element_ids => ["#{@element.id}"]}
419
+ @element.reload
420
+ @element.position.should_not == nil
421
+ end
422
+
423
+ it "should assign the (new) page_id to the element" do
424
+ xhr :post, :order, {:element_ids => ["#{@element.id}"], :page_id => 1, :cell_id => nil}
425
+ @element.reload
426
+ @element.page_id.should == 1
427
+ end
428
+
429
+ it "should assign the (new) cell_id to the element" do
430
+ xhr :post, :order, {:element_ids => ["#{@element.id}"], :page_id => 1, :cell_id => 5}
431
+ @element.reload
432
+ @element.cell_id.should == 5
433
+ end
434
+ end
307
435
  end
308
436
  end