alchemy_cms 2.9.1 → 3.0.0.rc5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -7,36 +7,29 @@ module Alchemy
7
7
  sign_in(admin_user)
8
8
  end
9
9
 
10
- let(:content) { mock_model('Content', essence: essence_file) }
10
+ let(:content) { mock_model('Content', essence: essence_file) }
11
11
  let(:essence_file) { mock_model('EssenceFile', :attachment= => nil) }
12
- let(:attachment) { mock_model('Attachment') }
13
-
12
+ let(:attachment) { mock_model('Attachment') }
13
+
14
14
  describe '#edit' do
15
15
  before do
16
- Content.stub!(:find).with(content.id.to_s).and_return(content)
16
+ Content.stub(find: content)
17
17
  end
18
18
 
19
19
  it "should assign @content with the Content found by id" do
20
- get :edit, id: content.id
20
+ get :edit, content_id: content.id
21
21
  expect(assigns(:content)).to eq(content)
22
22
  end
23
23
 
24
24
  it "should assign @essence_file with content's essence" do
25
- get :edit, id: content.id
25
+ get :edit, content_id: content.id
26
26
  expect(assigns(:essence_file)).to eq(content.essence)
27
27
  end
28
-
29
- context 'xhr request' do
30
- it "should not render a layout" do
31
- xhr :get, :edit, id: content.id
32
- expect(@layouts).to be_empty
33
- end
34
- end
35
28
  end
36
29
 
37
30
  describe '#update' do
38
31
  before do
39
- EssenceFile.stub!(:find).with(essence_file.id.to_s).and_return(essence_file)
32
+ EssenceFile.stub(find: essence_file)
40
33
  end
41
34
 
42
35
  it "should update the attributes of essence_file" do
@@ -47,18 +40,18 @@ module Alchemy
47
40
 
48
41
  describe '#assign' do
49
42
  before do
50
- Content.stub!(:find_by_id).with(content.id.to_s).and_return(content)
51
- Attachment.stub!(:find_by_id).and_return(attachment)
43
+ Content.stub(find_by: content)
44
+ Attachment.stub(find_by: attachment)
52
45
  end
53
46
 
54
47
  it "should assign @attachment with the Attachment found by attachment_id" do
55
- xhr :put, :assign, id: content.id, attachment_id: attachment.id
48
+ xhr :put, :assign, content_id: content.id, attachment_id: attachment.id
56
49
  expect(assigns(:attachment)).to eq(attachment)
57
50
  end
58
51
 
59
52
  it "should assign @content.essence.attachment with the attachment found by id" do
60
53
  content.essence.should_receive(:attachment=).with(attachment)
61
- xhr :put, :assign, id: content.id, attachment_id: attachment.id
54
+ xhr :put, :assign, content_id: content.id, attachment_id: attachment.id
62
55
  end
63
56
 
64
57
  end
@@ -41,7 +41,7 @@ module Alchemy
41
41
  before do
42
42
  picture.image_file_width = 300
43
43
  picture.image_file_height = 250
44
- essence.should_receive(:picture).any_number_of_times.and_return(picture)
44
+ essence.should_receive(:picture).and_return(picture)
45
45
  end
46
46
 
47
47
  context 'with no render_size present in essence' do
@@ -67,30 +67,14 @@ module Alchemy
67
67
  end
68
68
 
69
69
  context 'with render_size present in essence' do
70
- it "sets sizes from these values" do
70
+ before do
71
71
  essence.stub(:render_size).and_return('30x25')
72
-
73
- get :crop, id: 1
74
- expect(assigns(:size_x)).to eq(30)
75
- expect(assigns(:size_y)).to eq(25)
76
72
  end
77
73
 
78
- context 'when width or height is not fixed' do
79
- it 'infers the height from the image file preserving the aspect ratio' do
80
- essence.stub(:render_size).and_return('30')
81
-
82
- get :crop, id: 1
83
- expect(assigns(:size_x)).to eq(30)
84
- expect(assigns(:size_y)).to eq(25)
85
- end
86
-
87
- it 'infers the height from the image file preserving the aspect ratio' do
88
- essence.stub(:render_size).and_return('x25')
89
-
90
- get :crop, id: 1
91
- expect(assigns(:size_x)).to eq(30)
92
- expect(assigns(:size_y)).to eq(25)
93
- end
74
+ it "sets sizes from these values" do
75
+ get :crop, id: 1
76
+ expect(assigns(:size_x)).to eq('30')
77
+ expect(assigns(:size_y)).to eq('25')
94
78
  end
95
79
  end
96
80
 
@@ -154,9 +138,16 @@ module Alchemy
154
138
  Content.should_receive(:find).and_return(content)
155
139
  end
156
140
 
141
+ let(:attributes) { {render_size: '1x1', alt_tag: 'Alt Tag', caption: 'Caption', css_class: 'CSS Class', title: 'Title'} }
142
+
157
143
  it "updates the essence attributes" do
158
- essence.should_receive(:update_attributes).and_return(true)
159
- xhr :put, :update, id: 1, essence_picture: {render_size: '1x1'}
144
+ essence.should_receive(:update).and_return(true)
145
+ xhr :put, :update, id: 1, essence_picture: attributes
146
+ end
147
+
148
+ it "saves the cropping mask" do
149
+ essence.should_receive(:update).and_return(true)
150
+ xhr :put, :update, id: 1, essence_picture: {render_size: '1x1', crop_from: '0x0', crop_size: '100x100'}
160
151
  end
161
152
  end
162
153
 
@@ -13,18 +13,25 @@ describe Alchemy::Admin::LanguagesController do
13
13
 
14
14
  context "when default_language.page_layout is set" do
15
15
  it "should use it as page_layout-default for the new language" do
16
- Alchemy::Config.should_receive(:get).with(:default_language) { {'page_layout' => "new_standard"} }
16
+ # FML :/
17
+ Alchemy::Config.stub(:get) do |arg|
18
+ if arg == :default_language
19
+ {'page_layout' => "new_standard"}
20
+ else
21
+ Alchemy::Config.show[arg.to_s]
22
+ end
23
+ end
17
24
  get :new
18
25
  assigns(:language).page_layout.should eql("new_standard")
19
26
  end
20
27
  end
21
28
 
22
29
  context "when default_language or page_layout aren't configured" do
23
- it "should fallback to 'intro'" do
30
+ it "should fallback to one configured in config.yml" do
24
31
  get :new
25
- assigns(:language).page_layout.should eql("intro")
32
+ assigns(:language).page_layout.should eql("index")
26
33
  end
27
34
  end
28
35
 
29
36
  end
30
- end
37
+ end
@@ -19,9 +19,8 @@ module Alchemy
19
19
  end
20
20
 
21
21
  it "should assign @languages" do
22
- Language.stub!(:all).and_return([])
23
22
  get :index
24
- expect(assigns(:languages)).to eq([])
23
+ expect(assigns(:languages).first).to be_a(Language)
25
24
  end
26
25
  end
27
26
  end
@@ -7,37 +7,62 @@ module Alchemy
7
7
  before { sign_in(user) }
8
8
 
9
9
  describe '#index' do
10
- let(:language_root) { FactoryGirl.build_stubbed(:language_root_page) }
10
+ let(:language) { build_stubbed(:language) }
11
+ let(:language_root) { build_stubbed(:language_root_page) }
11
12
 
12
- it "assigns @page_root variable" do
13
- Page.should_receive(:language_root_for).with(1).and_return(language_root)
14
- get :index
15
- assigns(:page_root).should be(language_root)
13
+ context 'with existing language root page' do
14
+ before do
15
+ Language.should_receive(:current_root_page).and_return(language_root)
16
+ end
17
+
18
+ it "assigns @page_root variable" do
19
+ get :index
20
+ assigns(:page_root).should be(language_root)
21
+ end
22
+ end
23
+
24
+ context 'without language root page' do
25
+ before do
26
+ Language.should_receive(:current_root_page).and_return(nil)
27
+ Language.stub(find_by: language)
28
+ Language.stub(all: [language])
29
+ Language.stub(with_root_page: [language])
30
+ end
31
+
32
+ it "it assigns current language" do
33
+ get :index
34
+ assigns(:language).should be(language)
35
+ end
16
36
  end
17
37
  end
18
38
 
19
39
  describe "#flush" do
40
+ let(:language) { mock_model('Language', code: 'en', pages: double(flushables: [page_1, page_2])) }
41
+ let(:page_1) { build_stubbed(:page) }
42
+ let(:page_2) { build_stubbed(:page) }
20
43
 
21
- it "should remove the cache of all pages" do
22
- post :flush, format: :js
23
- response.status.should == 200
44
+ before do
45
+ Language.stub(current: language)
24
46
  end
25
47
 
48
+ it "should remove the cache of all pages" do
49
+ page_1.should_receive(:publish!)
50
+ page_2.should_receive(:publish!)
51
+ xhr :post, :flush
52
+ end
26
53
  end
27
54
 
28
55
  describe '#new' do
29
56
  context "pages in clipboard" do
30
-
31
57
  let(:clipboard) { session[:clipboard] = Clipboard.new }
32
58
  let(:page) { mock_model(Alchemy::Page, name: 'Foobar') }
33
59
 
34
60
  before { clipboard[:pages] = [{id: page.id, action: 'copy'}] }
35
61
 
36
62
  it "should load all pages from clipboard" do
37
- get :new, {page_id: page.id, format: :js}
63
+ xhr :get, :new, {page_id: page.id}
38
64
  assigns(:clipboard_items).should be_kind_of(Array)
39
65
  end
40
-
41
66
  end
42
67
  end
43
68
 
@@ -54,116 +79,20 @@ module Alchemy
54
79
  expect(assigns(:preview_mode)).to eq(true)
55
80
  end
56
81
 
82
+ it "should store page as current preview" do
83
+ Page.current_preview = nil
84
+ get :show, id: page.id
85
+ Page.current_preview.should == page
86
+ end
87
+
57
88
  it "should set the I18n locale to the pages language code" do
58
89
  get :show, id: page.id
59
90
  expect(::I18n.locale).to eq(:nl)
60
91
  end
61
- end
62
-
63
- describe '#order' do
64
- let(:page_1) { FactoryGirl.create(:page, visible: true) }
65
- let(:page_2) { FactoryGirl.create(:page, visible: true) }
66
- let(:page_3) { FactoryGirl.create(:page, visible: true) }
67
- let(:page_item_1) { {id: page_1.id, slug: page_1.slug, restricted: false, external: page_1.redirects_to_external?, visible: page_1.visible?, children: [page_item_2]} }
68
- let(:page_item_2) { {id: page_2.id, slug: page_2.slug, restricted: false, external: page_2.redirects_to_external?, visible: page_2.visible?, children: [page_item_3]} }
69
- let(:page_item_3) { {id: page_3.id, slug: page_3.slug, restricted: false, external: page_3.redirects_to_external?, visible: page_3.visible? } }
70
- let(:set_of_pages) { [page_item_1] }
71
-
72
- it "stores the new order" do
73
- xhr :post, :order, set: set_of_pages.to_json
74
- page_1.reload
75
- expect(page_1.descendants).to eq([page_2, page_3])
76
- end
77
-
78
- context 'with url nesting enabled' do
79
- before { Alchemy::Config.stub(get: true) }
80
-
81
- it "updates the pages urlnames" do
82
- xhr :post, :order, set: set_of_pages.to_json
83
- [page_1, page_2, page_3].map(&:reload)
84
- expect(page_1.urlname).to eq("#{page_1.slug}")
85
- expect(page_2.urlname).to eq("#{page_1.slug}/#{page_2.slug}")
86
- expect(page_3.urlname).to eq("#{page_1.slug}/#{page_2.slug}/#{page_3.slug}")
87
- end
88
-
89
- context 'with invisible page in tree' do
90
- let(:page_item_2) do
91
- {
92
- id: page_2.id,
93
- slug: page_2.slug,
94
- children: [page_item_3],
95
- visible: false
96
- }
97
- end
98
-
99
- it "does not use this pages slug in urlnames of descendants" do
100
- xhr :post, :order, set: set_of_pages.to_json
101
- [page_1, page_2, page_3].map(&:reload)
102
- expect(page_1.urlname).to eq("#{page_1.slug}")
103
- expect(page_2.urlname).to eq("#{page_1.slug}/#{page_2.slug}")
104
- expect(page_3.urlname).to eq("#{page_1.slug}/#{page_3.slug}")
105
- end
106
- end
107
-
108
- context 'with external page in tree' do
109
- let(:page_item_2) do
110
- {
111
- id: page_2.id,
112
- slug: page_2.slug,
113
- children: [page_item_3],
114
- external: true
115
- }
116
- end
117
-
118
- it "does not use this pages slug in urlnames of descendants" do
119
- xhr :post, :order, set: set_of_pages.to_json
120
- [page_1, page_2, page_3].map(&:reload)
121
- expect(page_3.urlname).to eq("#{page_1.slug}/#{page_3.slug}")
122
- end
123
- end
124
-
125
- context 'with restricted page in tree' do
126
- let(:page_2) { FactoryGirl.create(:page, restricted: true) }
127
- let(:page_item_2) do
128
- {
129
- id: page_2.id,
130
- slug: page_2.slug,
131
- children: [page_item_3],
132
- restricted: true
133
- }
134
- end
135
-
136
- it "updates restricted status of descendants" do
137
- xhr :post, :order, set: set_of_pages.to_json
138
- page_3.reload
139
- expect(page_3.restricted).to be_true
140
- end
141
- end
142
92
 
143
- context 'with page having number as slug' do
144
- let(:page_item_2) do
145
- {
146
- id: page_2.id,
147
- slug: 42,
148
- children: [page_item_3]
149
- }
150
- end
151
-
152
- it "does not raise error" do
153
- expect {
154
- xhr :post, :order, set: set_of_pages.to_json
155
- }.to_not raise_error(TypeError)
156
- [page_1, page_2, page_3].map(&:reload)
157
- expect(page_3.urlname).to eq("#{page_1.slug}/#{page_2.slug}/#{page_3.slug}")
158
- end
159
- end
160
-
161
- it "creates legacy urls" do
162
- xhr :post, :order, set: set_of_pages.to_json
163
- [page_2, page_3].map(&:reload)
164
- expect(page_2.legacy_urls.size).to eq(1)
165
- expect(page_3.legacy_urls.size).to eq(1)
166
- end
93
+ it "renders the application layout" do
94
+ get :show, id: page.id
95
+ expect(response).to render_template(layout: 'application')
167
96
  end
168
97
  end
169
98
 
@@ -175,34 +104,41 @@ module Alchemy
175
104
 
176
105
  it "should always show the slug" do
177
106
  Page.stub(:find).and_return(page)
178
- get :configure, {id: page.id, format: :js}
107
+ xhr :get, :configure, {id: page.id}
179
108
  response.body.should match /value="foobar"/
180
109
  end
181
110
  end
182
111
  end
183
112
 
184
113
  describe '#create' do
185
- let(:language) { mock_model('Language', code: 'kl') }
186
- let(:parent) { mock_model(Alchemy::Page, language: language) }
114
+ let(:language) { mock_model('Language', code: 'kl') }
115
+ let(:parent) { mock_model('Page', language: language) }
187
116
  let(:page_params) { {parent_id: parent.id, name: 'new Page'} }
188
117
 
189
118
  context "a new page" do
190
119
  before do
191
- Page.any_instance.stub(:set_language_from_parent_or_default_language)
192
- Page.any_instance.stub(:save).and_return(true)
120
+ Page.any_instance.stub(:set_language_from_parent_or_default)
121
+ Page.any_instance.stub(save: true)
193
122
  end
194
123
 
195
124
  it "is nested under given parent" do
196
125
  controller.stub(:edit_admin_page_path).and_return('bla')
197
- post :create, {page: page_params, format: :js}
126
+ xhr :post, :create, {page: page_params}
198
127
  expect(assigns(:page).parent_id).to eq(parent.id)
199
128
  end
200
129
 
130
+ it "redirects to edit page template" do
131
+ page = mock_model('Page')
132
+ controller.should_receive(:edit_admin_page_path).and_return('bla')
133
+ post :create, page: page_params
134
+ response.should redirect_to('bla')
135
+ end
136
+
201
137
  context "if new page can not be saved" do
202
- it "should redirect to admin_pages_path" do
138
+ it "renders the create form" do
203
139
  Page.any_instance.stub(:save).and_return(false)
204
- post :create, page: {}
205
- response.should redirect_to(admin_pages_path)
140
+ post :create, page: {name: 'page'}
141
+ response.should render_template('new')
206
142
  end
207
143
  end
208
144
 
@@ -217,10 +153,12 @@ module Alchemy
217
153
  end
218
154
 
219
155
  context "but new page can not be saved" do
220
- it "should redirect to admin_pages_path" do
156
+ render_views
157
+
158
+ it "should render the `new` template" do
221
159
  Page.any_instance.stub(:save).and_return(false)
222
- post :create, page: {}, redirect_to: Alchemy.login_path
223
- response.should redirect_to(admin_pages_path)
160
+ xhr :post, :create, page: {name: 'page'}, redirect_to: admin_pictures_path
161
+ response.body.should match /form.+action=\"\/admin\/pages\"/
224
162
  end
225
163
  end
226
164
  end
@@ -238,75 +176,81 @@ module Alchemy
238
176
  let(:page_in_clipboard) { mock_model(Alchemy::Page) }
239
177
 
240
178
  before do
241
- Page.stub!(:find_by_id).with(parent.id).and_return(parent)
242
- Page.stub!(:find).with(page_in_clipboard.id).and_return(page_in_clipboard)
179
+ Page.stub(:find_by).with(id: "#{parent.id}").and_return(parent)
180
+ Page.stub(:find).with("#{page_in_clipboard.id}").and_return(page_in_clipboard)
243
181
  end
244
182
 
245
- it "should call Page#paste_from_clipboard" do
246
- Page.should_receive(:paste_from_clipboard).with(
183
+ it "should call Page#copy_and_paste" do
184
+ Page.should_receive(:copy_and_paste).with(
247
185
  page_in_clipboard,
248
186
  parent,
249
187
  'pasted Page'
250
188
  ).and_return(
251
189
  mock_model('Page', save: true, name: 'pasted Page', redirects_to_external?: false)
252
190
  )
253
- post :create, {paste_from_clipboard: page_in_clipboard.id, page: {parent_id: parent.id, name: 'pasted Page'}, format: :js}
191
+ xhr :post, :create, {paste_from_clipboard: page_in_clipboard.id, page: {parent_id: parent.id, name: 'pasted Page'}}
254
192
  end
255
193
  end
256
194
  end
257
195
 
258
196
  describe '#copy_language_tree' do
197
+ let(:params) { {languages: {new_lang_id: '2', old_lang_id: '1'}} }
198
+ let(:language_root_to_copy_from) { build_stubbed(:language_root_page) }
199
+ let(:copy_of_language_root) { build_stubbed(:language_root_page) }
200
+ let(:root_page) { mock_model('Page') }
259
201
 
260
- let(:language) { Language.get_default }
261
- let(:new_language) { FactoryGirl.create(:klingonian) }
262
- let(:language_root) { FactoryGirl.create(:language_root_page, language: language) }
263
- let(:new_lang_root) { Page.language_root_for(new_language.id) }
264
-
265
- before(:each) do
266
- level_1 = FactoryGirl.create(:public_page, parent_id: language_root.id, visible: true, name: 'Level 1')
267
- level_2 = FactoryGirl.create(:public_page, parent_id: level_1.id, visible: true, name: 'Level 2')
268
- level_3 = FactoryGirl.create(:public_page, parent_id: level_2.id, visible: true, name: 'Level 3')
269
- level_4 = FactoryGirl.create(:public_page, parent_id: level_3.id, visible: true, name: 'Level 4')
270
- session[:language_code] = new_language.code
271
- session[:language_id] = new_language.id
272
- post :copy_language_tree, {languages: {new_lang_id: new_language.id, old_lang_id: language.id}}
202
+ before do
203
+ Page.stub(copy: copy_of_language_root)
204
+ Page.stub(root: root_page)
205
+ Page.stub(language_root_for: language_root_to_copy_from)
206
+ Page.any_instance.stub(:move_to_child_of)
207
+ Page.any_instance.stub(:copy_children_to)
208
+ controller.stub(:store_current_language)
209
+ Language.stub(:current).and_return(mock_model('Language', language_code: 'it', code: 'it'))
273
210
  end
274
211
 
275
- it "should copy all pages" do
276
- new_lang_root.should_not be_nil
277
- new_lang_root.descendants.count.should == 4
278
- new_lang_root.descendants.collect(&:name).should == ["Level 1 (Copy)", "Level 2 (Copy)", "Level 3 (Copy)", "Level 4 (Copy)"]
212
+ it "should copy the language root page over to the other language" do
213
+ Page.should_receive(:copy).with(language_root_to_copy_from, {language_id: '2', language_code: 'it'})
214
+ post :copy_language_tree, params
279
215
  end
280
216
 
281
- it "should not set layoutpage attribute to nil" do
282
- new_lang_root.layoutpage.should_not be_nil
217
+ it "should move the newly created language-root-page below the absolute root page" do
218
+ copy_of_language_root.should_receive(:move_to_child_of).with(root_page)
219
+ post :copy_language_tree, params
283
220
  end
284
221
 
285
- it "should not set layoutpage attribute to true" do
286
- new_lang_root.layoutpage.should_not be_true
222
+ it "should copy all childs of the original page over to the new created one" do
223
+ controller.stub(language_root_to_copy_from: language_root_to_copy_from)
224
+ controller.stub(copy_of_language_root: copy_of_language_root)
225
+ language_root_to_copy_from.should_receive(:copy_children_to).with(copy_of_language_root)
226
+ post :copy_language_tree, params
287
227
  end
288
228
 
229
+ it "should redirect to admin_pages_path" do
230
+ controller.stub(:copy_of_language_root)
231
+ controller.stub_chain(:language_root_to_copy_from, :copy_children_to)
232
+ post :copy_language_tree, params
233
+ expect(response).to redirect_to(admin_pages_path)
234
+ end
289
235
  end
290
236
 
291
237
  describe '#destroy' do
292
-
293
238
  let(:clipboard) { session[:clipboard] = Clipboard.new }
294
239
  let(:page) { FactoryGirl.create(:public_page) }
295
240
 
296
241
  before { clipboard[:pages] = [{id: page.id}] }
297
242
 
298
243
  it "should also remove the page from clipboard" do
299
- post :destroy, {id: page.id, _method: :delete, format: 'js'}
244
+ xhr :post, :destroy, {id: page.id, _method: :delete}
300
245
  clipboard[:pages].should be_empty
301
246
  end
302
-
303
247
  end
304
248
 
305
249
  describe '#publish' do
306
-
307
250
  let(:page) { stub_model(Page, published_at: nil, public: false, name: "page", parent_id: 1, urlname: "page", language: stub_model(Language), page_layout: "bla") }
251
+
308
252
  before do
309
- @controller.stub!(:load_page).and_return(page)
253
+ @controller.stub(:load_page).and_return(page)
310
254
  @controller.instance_variable_set("@page", page)
311
255
  end
312
256
 
@@ -314,16 +258,15 @@ module Alchemy
314
258
  page.should_receive(:publish!)
315
259
  post :publish, { id: page.id }
316
260
  end
317
-
318
261
  end
319
262
 
320
263
  describe '#visit' do
321
264
  let(:page) { mock_model(Alchemy::Page, urlname: 'home') }
322
265
 
323
266
  before do
324
- Page.stub!(:find).with("#{page.id}").and_return(page)
325
- page.stub!(:unlock!).and_return(true)
326
- @controller.stub!(:multi_language?).and_return(false)
267
+ Page.stub(:find).with("#{page.id}").and_return(page)
268
+ page.stub(:unlock!).and_return(true)
269
+ @controller.stub(:multi_language?).and_return(false)
327
270
  end
328
271
 
329
272
  it "should redirect to the page path" do
@@ -340,7 +283,7 @@ module Alchemy
340
283
 
341
284
  it "should fold the page" do
342
285
  page.should_receive(:fold!).with(user.id, true).and_return(true)
343
- post :fold, id: page.id, format: :js
286
+ xhr :post, :fold, id: page.id
344
287
  end
345
288
  end
346
289
 
@@ -349,7 +292,7 @@ module Alchemy
349
292
 
350
293
  it "should unfold the page" do
351
294
  page.should_receive(:fold!).with(user.id, false).and_return(true)
352
- post :fold, id: page.id, format: :js
295
+ xhr :post, :fold, id: page.id
353
296
  end
354
297
  end
355
298
  end
@@ -358,7 +301,7 @@ module Alchemy
358
301
  before { Page.stub(:language_root_for).and_return(mock_model(Alchemy::Page)) }
359
302
 
360
303
  it "should assign @sorting with true" do
361
- get :sort, format: :js
304
+ xhr :get, :sort
362
305
  expect(assigns(:sorting)).to eq(true)
363
306
  end
364
307
  end
@@ -373,7 +316,7 @@ module Alchemy
373
316
  end
374
317
 
375
318
  it "should unlock the page" do
376
- post :unlock, id: "#{page.id}", format: :js
319
+ xhr :post, :unlock, id: "#{page.id}"
377
320
  end
378
321
 
379
322
  context 'requesting for html format' do
@@ -389,5 +332,32 @@ module Alchemy
389
332
  end
390
333
  end
391
334
 
335
+ describe "#switch_language" do
336
+ let(:language) { build_stubbed(:klingonian)}
337
+
338
+ before do
339
+ Language.stub(:find_by).and_return(language)
340
+ end
341
+
342
+ it "should store the current language in session" do
343
+ get :switch_language, {language_id: language.id}
344
+ expect(session[:alchemy_language_id]).to eq(language.id)
345
+ end
346
+
347
+ it "should redirect to sitemap" do
348
+ expect(get :switch_language, {language_id: language.id}).to redirect_to(admin_pages_path)
349
+ end
350
+
351
+ context "coming from layoutpages" do
352
+ before {
353
+ request.stub(:referer).and_return('admin/layoutpages')
354
+ }
355
+
356
+ it "should redirect to layoutpages" do
357
+ expect(get :switch_language, {language_id: language.id}).to redirect_to(admin_layoutpages_path)
358
+ end
359
+ end
360
+ end
361
+
392
362
  end
393
363
  end