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
@@ -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