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
@@ -11,17 +11,22 @@ module Alchemy
11
11
  end
12
12
  end
13
13
 
14
- describe '#persisted?' do
15
- it "should return false" do
16
- expect(message.persisted?).to eq(false)
14
+ it "has attributes writers and getters for all fields defined in mailer config" do
15
+ Config.get(:mailer)['fields'].each do |field|
16
+ expect(message).to respond_to(field)
17
+ expect(message).to respond_to("#{field}=")
17
18
  end
18
19
  end
19
20
 
20
- describe '#attributes' do
21
- it "should call .attributes" do
22
- Message.should_receive(:attributes)
23
- message.attributes
21
+ it "validates attributes defined in mailer config" do
22
+ Config.get(:mailer)['validate_fields'].each do |field|
23
+ expect(message).to have(1).error_on(field)
24
24
  end
25
25
  end
26
+
27
+ it "validates email format" do
28
+ message.email = 'wrong email format'
29
+ expect(message.errors_on(:email)).to include("is invalid")
30
+ end
26
31
  end
27
32
  end
@@ -6,10 +6,10 @@ module Alchemy
6
6
  describe Page do
7
7
 
8
8
  let(:rootpage) { Page.root }
9
- let(:language) { Language.get_default }
9
+ let(:language) { Language.default }
10
10
  let(:klingonian) { FactoryGirl.create(:klingonian) }
11
11
  let(:language_root) { FactoryGirl.create(:language_root_page) }
12
- let(:page) { mock(:page, :page_layout => 'foo') }
12
+ let(:page) { mock_model(Page, :page_layout => 'foo') }
13
13
  let(:public_page) { FactoryGirl.create(:public_page) }
14
14
  let(:news_page) { FactoryGirl.create(:public_page, :page_layout => 'news', :do_not_autogenerate => false) }
15
15
 
@@ -18,12 +18,15 @@ module Alchemy
18
18
 
19
19
  context 'validations' do
20
20
  context "Creating a normal content page" do
21
- let(:contentpage) { FactoryGirl.build(:page) }
21
+ let(:contentpage) { FactoryGirl.build(:page) }
22
+ let(:with_same_urlname) { FactoryGirl.create(:page, urlname: "existing_twice") }
23
+ let(:global_with_same_urlname) { FactoryGirl.create(:page, urlname: "existing_twice", layoutpage: true) }
22
24
 
23
25
  context "when its urlname exists as global page" do
26
+ before { global_with_same_urlname }
27
+
24
28
  it "it should be possible to save." do
25
29
  contentpage.urlname = "existing_twice"
26
- global_with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice", :layoutpage => true)
27
30
  contentpage.should be_valid
28
31
  end
29
32
  end
@@ -40,25 +43,30 @@ module Alchemy
40
43
  contentpage.should have(1).error_on(:parent_id)
41
44
  end
42
45
 
43
- it "should validate the uniqueness of urlname" do
44
- with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
45
- contentpage.urlname = 'existing_twice'
46
- contentpage.should_not be_valid
46
+ context 'with page having same urlname' do
47
+ before { with_same_urlname }
48
+
49
+ it "should not be valid" do
50
+ contentpage.urlname = 'existing_twice'
51
+ contentpage.should_not be_valid
52
+ end
47
53
  end
48
54
 
49
55
  context "with url_nesting set to true" do
50
- before { Config.stub!(:get).and_return(true) }
56
+ let(:other_parent) { FactoryGirl.create(:page, parent_id: Page.root.id) }
57
+
58
+ before do
59
+ Config.stub(:get).and_return(true)
60
+ with_same_urlname
61
+ end
51
62
 
52
63
  it "should only validate urlname dependent of parent" do
53
- other_parent = FactoryGirl.create(:page, parent_id: Page.root.id)
54
- with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
55
64
  contentpage.urlname = 'existing_twice'
56
65
  contentpage.parent_id = other_parent.id
57
66
  contentpage.should be_valid
58
67
  end
59
68
 
60
69
  it "should validate urlname dependent of parent" do
61
- with_same_urlname = FactoryGirl.create(:page, :urlname => "existing_twice")
62
70
  contentpage.urlname = 'existing_twice'
63
71
  contentpage.should_not be_valid
64
72
  end
@@ -170,18 +178,18 @@ module Alchemy
170
178
 
171
179
  context "with cells" do
172
180
  before do
173
- @page.stub!(:definition).and_return({'name' => 'with_cells', 'cells' => ['header', 'main']})
181
+ @page.stub(:definition).and_return({'name' => 'with_cells', 'cells' => ['header', 'main']})
174
182
  end
175
183
 
176
184
  it "should have the generated elements in their cells" do
177
- @page.stub!(:cell_definitions).and_return([{'name' => 'header', 'elements' => ['article']}])
185
+ @page.stub(:cell_definitions).and_return([{'name' => 'header', 'elements' => ['article']}])
178
186
  @page.save
179
187
  @page.cells.where(:name => 'header').first.elements.should_not be_empty
180
188
  end
181
189
 
182
190
  context "and no elements in cell definitions" do
183
191
  it "should have the elements in the nil cell" do
184
- @page.stub!(:cell_definitions).and_return([{'name' => 'header', 'elements' => []}])
192
+ @page.stub(:cell_definitions).and_return([{'name' => 'header', 'elements' => []}])
185
193
  @page.save
186
194
  @page.cells.collect(&:elements).flatten.should be_empty
187
195
  end
@@ -242,17 +250,19 @@ module Alchemy
242
250
  end
243
251
 
244
252
  context "after changing the page layout" do
245
- let(:news_element) { FactoryGirl.create(:element, :name => 'news') }
253
+ let(:news_element) { news_page.elements.find_by(name: 'news') }
246
254
 
247
255
  it "all elements not allowed on this page should be trashed" do
248
- news_page.elements << news_element
249
- news_page.update_attributes :page_layout => 'standard'
250
- news_page.elements.trashed.should include(news_element)
256
+ expect(news_page.elements.trashed).to be_empty
257
+ news_page.update_attributes(page_layout: 'standard')
258
+ trashed = news_page.elements.trashed.pluck(:name)
259
+ expect(trashed).to eq(['news'])
260
+ expect(trashed).to_not include('article', 'header')
251
261
  end
252
262
 
253
263
  it "should autogenerate elements" do
254
- news_page.update_attributes :page_layout => 'standard'
255
- news_page.elements.available.collect(&:name).should include('header')
264
+ news_page.update_attributes(page_layout: 'contact')
265
+ news_page.elements.pluck(:name).should include('contactform')
256
266
  end
257
267
  end
258
268
  end
@@ -376,7 +386,7 @@ module Alchemy
376
386
  context "page with autogenerate elements" do
377
387
  before do
378
388
  page = FactoryGirl.create(:page)
379
- page.stub!(:definition).and_return({'name' => 'standard', 'elements' => ['headline'], 'autogenerate' => ['headline']})
389
+ page.stub(:definition).and_return({'name' => 'standard', 'elements' => ['headline'], 'autogenerate' => ['headline']})
380
390
  end
381
391
 
382
392
  it "the copy should not autogenerate elements" do
@@ -404,6 +414,13 @@ module Alchemy
404
414
  page.urlname.should == 'klingon-stoessel'
405
415
  end
406
416
 
417
+ context "with no name set" do
418
+ it "should not set a urlname" do
419
+ page = Page.create(name: '', language: language, parent_id: language_root.id)
420
+ expect(page.urlname).to be_blank
421
+ end
422
+ end
423
+
407
424
  it "should generate a three letter urlname from two letter name" do
408
425
  page = FactoryGirl.create(:page, :name => 'Au', :language => language, :parent_id => language_root.id)
409
426
  page.urlname.should == '-au'
@@ -421,7 +438,52 @@ module Alchemy
421
438
 
422
439
  it "should add a user stamper" do
423
440
  page = FactoryGirl.create(:page, :name => 'A', :language => language, :parent_id => language_root.id)
424
- page.class.stamper_class.to_s.should == 'User'
441
+ page.class.stamper_class.to_s.should == 'DummyUser'
442
+ end
443
+
444
+ context "with language given" do
445
+ it "does not set the language from parent" do
446
+ Page.any_instance.should_not_receive(:set_language_from_parent_or_default)
447
+ Page.create!(name: 'A', parent_id: language_root.id, page_layout: 'standard', language: language)
448
+ end
449
+ end
450
+
451
+ context "with no language given" do
452
+ it "sets the language from parent" do
453
+ Page.any_instance.should_receive(:set_language_from_parent_or_default)
454
+ Page.create!(name: 'A', parent_id: language_root.id, page_layout: 'standard')
455
+ end
456
+ end
457
+ end
458
+ end
459
+
460
+ describe '.find_or_create_layout_root_for' do
461
+ subject { Page.find_or_create_layout_root_for(language_id) }
462
+
463
+ let(:language) { mock_model('Language', name: 'English') }
464
+ let(:language_id) { language.id }
465
+
466
+ before { Language.stub(:find).and_return(language) }
467
+
468
+ context 'if no layout root page for given language id could be found' do
469
+ before do
470
+ Page.should_receive(:create!).and_return(page)
471
+ end
472
+
473
+ it "creates one" do
474
+ should eq(page)
475
+ end
476
+ end
477
+
478
+ context 'if layout root page for given language id could be found' do
479
+ let(:page) { mock_model('Page') }
480
+
481
+ before do
482
+ Page.should_receive(:layout_root_for).and_return(page)
483
+ end
484
+
485
+ it "returns layout root page" do
486
+ should eq(page)
425
487
  end
426
488
  end
427
489
  end
@@ -591,9 +653,9 @@ module Alchemy
591
653
  describe '#cell_definitions' do
592
654
  before do
593
655
  @page = FactoryGirl.build(:page, :page_layout => 'foo')
594
- @page.stub!(:layout_description).and_return({'name' => "foo", 'cells' => ["foo_cell"]})
656
+ @page.stub(:layout_description).and_return({'name' => "foo", 'cells' => ["foo_cell"]})
595
657
  @cell_descriptions = [{'name' => "foo_cell", 'elements' => ["1", "2"]}]
596
- Cell.stub!(:definitions).and_return(@cell_descriptions)
658
+ Cell.stub(:definitions).and_return(@cell_descriptions)
597
659
  end
598
660
 
599
661
  it "should return all cell definitions for its page_layout" do
@@ -601,21 +663,30 @@ module Alchemy
601
663
  end
602
664
 
603
665
  it "should return empty array if no cells defined in page layout" do
604
- @page.stub!(:layout_description).and_return({'name' => "foo"})
666
+ @page.stub(:layout_description).and_return({'name' => "foo"})
605
667
  @page.cell_definitions.should == []
606
668
  end
607
669
  end
608
670
 
609
671
  describe '#destroy' do
610
672
  context "with trashed but still assigned elements" do
611
-
612
673
  before { news_page.elements.map(&:trash!) }
613
674
 
614
675
  it "should not delete the trashed elements" do
615
676
  news_page.destroy
616
677
  Element.trashed.should_not be_empty
617
678
  end
679
+ end
680
+ end
618
681
 
682
+ describe '#element_definitions' do
683
+ let(:page) { FactoryGirl.build_stubbed(:page) }
684
+ subject { page.element_definitions }
685
+ before { Element.should_receive(:definitions).and_return([{'name' => 'article'}, {'name' => 'header'}]) }
686
+
687
+ it "returns all element definitions that could be placed on current page" do
688
+ should include({'name' => 'article'})
689
+ should include({'name' => 'header'})
619
690
  end
620
691
  end
621
692
 
@@ -677,7 +748,7 @@ module Alchemy
677
748
  'elements' => ['header', 'text'],
678
749
  'autogenerate' => ['header', 'text']
679
750
  })
680
- Cell.stub!(:definitions).and_return([{
751
+ Cell.stub(:definitions).and_return([{
681
752
  'name' => "header",
682
753
  'elements' => ["header"]
683
754
  }])
@@ -697,7 +768,7 @@ module Alchemy
697
768
  describe '#feed_elements' do
698
769
  it "should return all rss feed elements" do
699
770
  news_page.feed_elements.should_not be_empty
700
- news_page.feed_elements.should == Element.find_all_by_name('news')
771
+ news_page.feed_elements.should == Element.where(name: 'news').to_a
701
772
  end
702
773
  end
703
774
 
@@ -709,23 +780,23 @@ module Alchemy
709
780
 
710
781
  context "with show_non_public argument TRUE" do
711
782
  it "should return all elements from empty options" do
712
- public_page.find_elements({}, true).all.should == public_page.elements.all
783
+ public_page.find_elements({}, true).to_a.should == public_page.elements.to_a
713
784
  end
714
785
 
715
786
  it "should only return the elements passed as options[:only]" do
716
- public_page.find_elements({:only => ['article']}, true).all.should == public_page.elements.named('article').all
787
+ public_page.find_elements({:only => ['article']}, true).to_a.should == public_page.elements.named('article').to_a
717
788
  end
718
789
 
719
790
  it "should not return the elements passed as options[:except]" do
720
- public_page.find_elements({:except => ['article']}, true).all.should == public_page.elements - public_page.elements.named('article').all
791
+ public_page.find_elements({:except => ['article']}, true).to_a.should == public_page.elements - public_page.elements.named('article').to_a
721
792
  end
722
793
 
723
794
  it "should return elements offsetted" do
724
- public_page.find_elements({:offset => 2}, true).all.should == public_page.elements.offset(2)
795
+ public_page.find_elements({:offset => 2}, true).to_a.should == public_page.elements.offset(2)
725
796
  end
726
797
 
727
798
  it "should return elements limitted in count" do
728
- public_page.find_elements({:count => 1}, true).all.should == public_page.elements.limit(1)
799
+ public_page.find_elements({:count => 1}, true).to_a.should == public_page.elements.limit(1)
729
800
  end
730
801
  end
731
802
 
@@ -750,7 +821,7 @@ module Alchemy
750
821
  }
751
822
 
752
823
  it "returns empty set" do
753
- public_page.elements.should_receive(:where).with('1 = 0').and_return(elements)
824
+ Element.should_receive(:none).and_return(elements)
754
825
  public_page.find_elements(from_cell: 'Lolo').to_a.should == []
755
826
  end
756
827
 
@@ -773,23 +844,23 @@ module Alchemy
773
844
 
774
845
  context "with show_non_public argument FALSE" do
775
846
  it "should return all elements from empty arguments" do
776
- public_page.find_elements().all.should == public_page.elements.published.all
847
+ public_page.find_elements().to_a.should == public_page.elements.published.to_a
777
848
  end
778
849
 
779
850
  it "should only return the public elements passed as options[:only]" do
780
- public_page.find_elements(:only => ['article']).all.should == public_page.elements.published.named('article').all
851
+ public_page.find_elements(:only => ['article']).to_a.should == public_page.elements.published.named('article').to_a
781
852
  end
782
853
 
783
854
  it "should return all public elements except the ones passed as options[:except]" do
784
- public_page.find_elements(:except => ['article']).all.should == public_page.elements.published.all - public_page.elements.published.named('article').all
855
+ public_page.find_elements(:except => ['article']).to_a.should == public_page.elements.published.to_a - public_page.elements.published.named('article').to_a
785
856
  end
786
857
 
787
858
  it "should return elements offsetted" do
788
- public_page.find_elements({:offset => 2}).all.should == public_page.elements.published.offset(2)
859
+ public_page.find_elements({:offset => 2}).to_a.should == public_page.elements.published.offset(2)
789
860
  end
790
861
 
791
862
  it "should return elements limitted in count" do
792
- public_page.find_elements({:count => 1}).all.should == public_page.elements.published.limit(1)
863
+ public_page.find_elements({:count => 1}).to_a.should == public_page.elements.published.limit(1)
793
864
  end
794
865
  end
795
866
  end
@@ -810,7 +881,7 @@ module Alchemy
810
881
  end
811
882
 
812
883
  context 'folding' do
813
- let(:user) { mock_model('User') }
884
+ let(:user) { mock_model('DummyUser') }
814
885
 
815
886
  describe '#fold!' do
816
887
  context "with folded status set to true" do
@@ -848,12 +919,20 @@ module Alchemy
848
919
  end
849
920
  end
850
921
 
851
- describe '#lock!' do
852
- let(:page) { FactoryGirl.create(:page) }
853
- let(:user) { mock_model('User') }
922
+ describe '#get_language_root' do
923
+ subject { public_page.get_language_root }
924
+
925
+ it "returns the language root page" do
926
+ should eq language_root
927
+ end
928
+ end
929
+
930
+ describe '#lock_to!' do
931
+ let(:page) { create(:page) }
932
+ let(:user) { mock_model('DummyUser') }
854
933
 
855
934
  it "should set locked to true" do
856
- page.lock!(user)
935
+ page.lock_to!(user)
857
936
  page.reload
858
937
  page.locked.should == true
859
938
  end
@@ -863,19 +942,19 @@ module Alchemy
863
942
  end
864
943
 
865
944
  it "should set locked_by to the users id" do
866
- page.lock!(user)
945
+ page.lock_to!(user)
867
946
  page.reload
868
947
  page.locked_by.should == user.id
869
948
  end
870
949
  end
871
950
 
872
- describe '#paste_from_clipboard' do
951
+ describe '#copy_and_paste' do
873
952
  let(:source) { FactoryGirl.build_stubbed(:page) }
874
953
  let(:new_parent) { FactoryGirl.build_stubbed(:page) }
875
954
  let(:page_name) { "Pagename (pasted)" }
876
955
  let(:copied_page) { mock_model('Page') }
877
956
 
878
- subject { Page.paste_from_clipboard(source, new_parent, page_name) }
957
+ subject { Page.copy_and_paste(source, new_parent, page_name) }
879
958
 
880
959
  it "should copy the source page with the given name to the new parent" do
881
960
  Page.should_receive(:copy).with(source, {
@@ -888,14 +967,14 @@ module Alchemy
888
967
  end
889
968
 
890
969
  it "should return the copied page" do
891
- Page.stub!(:copy).and_return(copied_page)
970
+ Page.stub(:copy).and_return(copied_page)
892
971
  expect(subject).to be_a(copied_page.class)
893
972
  end
894
973
 
895
974
  context "if source page has children" do
896
975
  it "should also copy and paste the children" do
897
- Page.stub!(:copy).and_return(copied_page)
898
- source.stub!(:children).and_return([mock_model('Page')])
976
+ Page.stub(:copy).and_return(copied_page)
977
+ source.stub(:children).and_return([mock_model('Page')])
899
978
  source.should_receive(:copy_children_to).with(copied_page)
900
979
  subject
901
980
  end
@@ -971,22 +1050,28 @@ module Alchemy
971
1050
 
972
1051
  describe '#publish!' do
973
1052
  let(:page) { FactoryGirl.build_stubbed(:page, public: false) }
1053
+ let(:current_time) { Time.now }
974
1054
 
975
1055
  before do
976
- page.stub!(:save).and_return(true)
1056
+ current_time
1057
+ Time.stub(:now).and_return(current_time)
977
1058
  page.publish!
978
1059
  end
979
1060
 
980
1061
  it "sets public attribute to true" do
981
1062
  page.public.should == true
982
1063
  end
1064
+
1065
+ it "sets published_at attribute to current time" do
1066
+ page.published_at.should == current_time
1067
+ end
983
1068
  end
984
1069
 
985
- describe '#set_language_from_parent_or_default_language' do
1070
+ describe '#set_language_from_parent_or_default' do
986
1071
  let(:default_language) { mock_model('Language', code: 'es') }
987
1072
  let(:page) { Page.new }
988
1073
 
989
- before { page.stub!(:parent).and_return(parent) }
1074
+ before { page.stub(:parent).and_return(parent) }
990
1075
 
991
1076
  subject { page }
992
1077
 
@@ -994,23 +1079,21 @@ module Alchemy
994
1079
  let(:parent) { mock_model('Page', language: default_language, language_id: default_language.id, language_code: default_language.code) }
995
1080
 
996
1081
  before do
997
- page.set_language_from_parent_or_default_language
1082
+ page.send(:set_language_from_parent_or_default)
998
1083
  end
999
1084
 
1000
1085
  its(:language_id) { should eq(parent.language_id) }
1001
- its(:language_code) { should eq(parent.language_code) }
1002
1086
  end
1003
1087
 
1004
1088
  context "parent has no language" do
1005
1089
  let(:parent) { mock_model('Page', language: nil, language_id: nil, language_code: nil) }
1006
1090
 
1007
1091
  before do
1008
- Language.stub!(:get_default).and_return(default_language)
1009
- page.set_language_from_parent_or_default_language
1092
+ Language.stub(:default).and_return(default_language)
1093
+ page.send(:set_language_from_parent_or_default)
1010
1094
  end
1011
1095
 
1012
1096
  its(:language_id) { should eq(default_language.id) }
1013
- its(:language_code) { should eq(default_language.code) }
1014
1097
  end
1015
1098
  end
1016
1099
 
@@ -1043,7 +1126,11 @@ module Alchemy
1043
1126
  describe '#unlock!' do
1044
1127
  let(:page) { FactoryGirl.create(:page, locked: true, locked_by: 1) }
1045
1128
 
1046
- its "should set the locked status to false" do
1129
+ before do
1130
+ page.stub(:save).and_return(true)
1131
+ end
1132
+
1133
+ it "should set the locked status to false" do
1047
1134
  page.unlock!
1048
1135
  page.reload
1049
1136
  page.locked.should == false
@@ -1058,6 +1145,12 @@ module Alchemy
1058
1145
  page.reload
1059
1146
  page.locked_by.should == nil
1060
1147
  end
1148
+
1149
+ it "sets current preview to nil" do
1150
+ Page.current_preview = page
1151
+ page.unlock!
1152
+ Page.current_preview.should be_nil
1153
+ end
1061
1154
  end
1062
1155
 
1063
1156
  context 'urlname updating' do
@@ -1068,7 +1161,7 @@ module Alchemy
1068
1161
  let(:contact) { FactoryGirl.create(:page, parent_id: invisible.id, name: 'contact', visible: true) }
1069
1162
 
1070
1163
  context "with activated url_nesting" do
1071
- before { Config.stub!(:get).and_return(true) }
1164
+ before { Config.stub(:get).and_return(true) }
1072
1165
 
1073
1166
  it "should store all parents urlnames delimited by slash" do
1074
1167
  page.urlname.should == 'parentparent/parent/page'
@@ -1096,10 +1189,10 @@ module Alchemy
1096
1189
  end
1097
1190
 
1098
1191
  it "should create a legacy url" do
1099
- page.stub!(:slug).and_return('foo')
1192
+ page.stub(:slug).and_return('foo')
1100
1193
  page.update_urlname!
1101
1194
  page.legacy_urls.should_not be_empty
1102
- page.legacy_urls.collect(&:urlname).should include('parentparent/parent/page')
1195
+ page.legacy_urls.pluck(:urlname).should include('parentparent/parent/page')
1103
1196
  end
1104
1197
  end
1105
1198
 
@@ -1115,7 +1208,7 @@ module Alchemy
1115
1208
  end
1116
1209
 
1117
1210
  context "with disabled url_nesting" do
1118
- before { Config.stub!(:get).and_return(false) }
1211
+ before { Config.stub(:get).and_return(false) }
1119
1212
 
1120
1213
  it "should only store my urlname" do
1121
1214
  page.urlname.should == 'page'
@@ -1123,124 +1216,6 @@ module Alchemy
1123
1216
  end
1124
1217
  end
1125
1218
 
1126
- describe "#update_node!" do
1127
-
1128
- let(:original_url) { "sample-url" }
1129
- let(:page) { FactoryGirl.create(:page, :language => language, :parent_id => language_root.id, :urlname => original_url, restricted: false) }
1130
- let(:node) { TreeNode.new(10, 11, 12, 13, "another-url", true) }
1131
-
1132
- context "when nesting is enabled" do
1133
- before { Alchemy::Config.stub(:get).with(:url_nesting) { true } }
1134
-
1135
- context "when page is not external" do
1136
-
1137
- before { page.stub(redirects_to_external?: false)}
1138
-
1139
- it "should update all attributes" do
1140
- page.update_node!(node)
1141
- page.reload
1142
- expect(page.lft).to eq(node.left)
1143
- expect(page.rgt).to eq(node.right)
1144
- expect(page.parent_id).to eq(node.parent)
1145
- expect(page.depth).to eq(node.depth)
1146
- expect(page.urlname).to eq(node.url)
1147
- expect(page.restricted).to eq(node.restricted)
1148
- end
1149
-
1150
- context "when url is the same" do
1151
- let(:node) { TreeNode.new(10, 11, 12, 13, original_url, true) }
1152
-
1153
- it "should not create a legacy url" do
1154
- page.update_node!(node)
1155
- page.reload
1156
- expect(page.legacy_urls.size).to eq(0)
1157
- end
1158
- end
1159
-
1160
- context "when url is not the same" do
1161
- it "should create a legacy url" do
1162
- page.update_node!(node)
1163
- page.reload
1164
- expect(page.legacy_urls.size).to eq(1)
1165
- end
1166
- end
1167
- end
1168
-
1169
- context "when page is external" do
1170
-
1171
- before { page.stub(redirects_to_external?: true) }
1172
-
1173
- it "should update all attributes except url" do
1174
- page.update_node!(node)
1175
- page.reload
1176
- expect(page.lft).to eq(node.left)
1177
- expect(page.rgt).to eq(node.right)
1178
- expect(page.parent_id).to eq(node.parent)
1179
- expect(page.depth).to eq(node.depth)
1180
- expect(page.urlname).to eq(original_url)
1181
- expect(page.restricted).to eq(node.restricted)
1182
- end
1183
-
1184
- it "should not create a legacy url" do
1185
- page.update_node!(node)
1186
- page.reload
1187
- expect(page.legacy_urls.size).to eq(0)
1188
- end
1189
- end
1190
- end
1191
-
1192
- context "when nesting is disabled" do
1193
- before { Alchemy::Config.stub(:get).with(:url_nesting) { false } }
1194
-
1195
- context "when page is not external" do
1196
-
1197
- before { page.stub(redirects_to_external?: false)}
1198
-
1199
- it "should update all attributes except url" do
1200
- page.update_node!(node)
1201
- page.reload
1202
- expect(page.lft).to eq(node.left)
1203
- expect(page.rgt).to eq(node.right)
1204
- expect(page.parent_id).to eq(node.parent)
1205
- expect(page.depth).to eq(node.depth)
1206
- expect(page.urlname).to eq(original_url)
1207
- expect(page.restricted).to eq(node.restricted)
1208
- end
1209
-
1210
- it "should not create a legacy url" do
1211
- page.update_node!(node)
1212
- page.reload
1213
- expect(page.legacy_urls.size).to eq(0)
1214
- end
1215
-
1216
- end
1217
-
1218
- context "when page is external" do
1219
-
1220
- before { page.stub(redirects_to_external?: true) }
1221
-
1222
- before { Alchemy::Config.stub(get: true) }
1223
-
1224
- it "should update all attributes except url" do
1225
- page.update_node!(node)
1226
- page.reload
1227
- expect(page.lft).to eq(node.left)
1228
- expect(page.rgt).to eq(node.right)
1229
- expect(page.parent_id).to eq(node.parent)
1230
- expect(page.depth).to eq(node.depth)
1231
- expect(page.urlname).to eq(original_url)
1232
- expect(page.restricted).to eq(node.restricted)
1233
- end
1234
-
1235
- it "should not create a legacy url" do
1236
- page.update_node!(node)
1237
- page.reload
1238
- expect(page.legacy_urls.size).to eq(0)
1239
- end
1240
- end
1241
- end
1242
- end
1243
-
1244
1219
  describe '#slug' do
1245
1220
  context "with parents path saved in urlname" do
1246
1221
  let(:page) { FactoryGirl.build(:page, urlname: 'root/parent/my-name')}
@@ -1299,7 +1274,7 @@ module Alchemy
1299
1274
  let(:page) { Page.new }
1300
1275
 
1301
1276
  context 'with user class having a name accessor' do
1302
- let(:user) { Alchemy.user_class_name = double(name: 'Paul Page') }
1277
+ let(:user) { double(name: 'Paul Page') }
1303
1278
 
1304
1279
  describe '#creator_name' do
1305
1280
  before { page.stub(:creator).and_return(user) }
@@ -1360,8 +1335,8 @@ module Alchemy
1360
1335
 
1361
1336
  context 'if the page has a custom controller defined in its description' do
1362
1337
  before do
1363
- page.stub!(:has_controller?).and_return(true)
1364
- page.stub!(:layout_description).and_return({'controller' => 'comments', 'action' => 'index'})
1338
+ page.stub(:has_controller?).and_return(true)
1339
+ page.stub(:layout_description).and_return({'controller' => 'comments', 'action' => 'index'})
1365
1340
  end
1366
1341
  it "should return a Hash with controller and action key-value pairs" do
1367
1342
  expect(page.controller_and_action).to eq({controller: '/comments', action: 'index'})
@@ -1369,5 +1344,37 @@ module Alchemy
1369
1344
  end
1370
1345
  end
1371
1346
 
1347
+ it_behaves_like "having a hint" do
1348
+ let(:subject) { Page.new }
1349
+ end
1350
+
1351
+ describe '#layout_partial_name' do
1352
+ let(:page) { Page.new(page_layout: 'Standard Page') }
1353
+
1354
+ it "returns a partial renderer compatible name" do
1355
+ expect(page.layout_partial_name).to eq('standard_page')
1356
+ end
1357
+ end
1358
+
1359
+ describe '#published_at' do
1360
+ context 'with published_at date set' do
1361
+ let(:published_at) { Time.now }
1362
+ let(:page) { build_stubbed(:page, published_at: published_at) }
1363
+
1364
+ it "returns the published_at value from database" do
1365
+ expect(page.published_at).to eq(published_at)
1366
+ end
1367
+ end
1368
+
1369
+ context 'with published_at is nil' do
1370
+ let(:updated_at) { Time.now }
1371
+ let(:page) { build_stubbed(:page, published_at: nil, updated_at: updated_at) }
1372
+
1373
+ it "returns the updated_at value" do
1374
+ expect(page.published_at).to eq(updated_at)
1375
+ end
1376
+ end
1377
+ end
1378
+
1372
1379
  end
1373
1380
  end