pages_core 3.4.3 → 3.7.0

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 (375) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +74 -15
  3. data/Rakefile +2 -0
  4. data/app/assets/javascripts/pages/admin.jsx +17 -0
  5. data/app/assets/javascripts/pages/admin/components.jsx +2 -0
  6. data/app/assets/javascripts/pages/admin/components/attachment.jsx +130 -0
  7. data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +131 -0
  8. data/app/assets/javascripts/pages/admin/components/attachments.jsx +211 -0
  9. data/app/assets/javascripts/pages/admin/components/date_range_select.jsx +174 -0
  10. data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +174 -0
  11. data/app/assets/javascripts/pages/admin/components/editable_image.jsx +57 -0
  12. data/app/assets/javascripts/pages/admin/components/file_upload_button.jsx +44 -0
  13. data/app/assets/javascripts/pages/admin/components/focal_point.jsx +82 -0
  14. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +124 -0
  15. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +496 -0
  16. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +306 -0
  17. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +176 -0
  18. data/app/assets/javascripts/pages/admin/components/modal.jsx +48 -0
  19. data/app/assets/javascripts/pages/admin/components/modal_store.jsx +20 -0
  20. data/app/assets/javascripts/pages/admin/components/page_dates.jsx +58 -0
  21. data/app/assets/javascripts/pages/admin/components/page_files.jsx +14 -0
  22. data/app/assets/javascripts/pages/admin/components/page_images.jsx +16 -0
  23. data/app/assets/javascripts/pages/admin/components/page_tree.jsx +300 -0
  24. data/app/assets/javascripts/pages/admin/components/page_tree_node.jsx +396 -0
  25. data/app/assets/javascripts/pages/admin/components/page_tree_store.jsx +203 -0
  26. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +64 -0
  27. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +91 -0
  28. data/app/assets/javascripts/pages/admin/components/toast.jsx +34 -0
  29. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +52 -0
  30. data/app/assets/javascripts/pages/admin/features/content_tabs.jsx +72 -0
  31. data/app/assets/javascripts/pages/admin/features/edit_page.jsx +97 -0
  32. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +14 -0
  33. data/app/assets/javascripts/pages/admin/features/tag_editor.jsx +160 -0
  34. data/app/assets/javascripts/pages/admin/lib/tree.jsx +294 -0
  35. data/app/assets/javascripts/pages/login_form.jsx +21 -0
  36. data/app/assets/stylesheets/pages/admin.scss +144 -0
  37. data/app/assets/stylesheets/pages/admin/components/archive.scss +6 -0
  38. data/app/assets/stylesheets/pages/admin/components/attachments.scss +130 -0
  39. data/app/assets/stylesheets/pages/admin/components/buttons.scss +23 -0
  40. data/app/assets/stylesheets/pages/admin/components/forms.scss +169 -0
  41. data/app/assets/stylesheets/pages/admin/components/header.scss +157 -0
  42. data/app/assets/stylesheets/pages/admin/components/image_editor.scss +195 -0
  43. data/app/assets/stylesheets/pages/admin/components/image_grid.scss +181 -0
  44. data/app/assets/stylesheets/pages/admin/components/image_uploader.scss +53 -0
  45. data/app/assets/stylesheets/pages/admin/components/layout.scss +44 -0
  46. data/app/assets/stylesheets/pages/admin/components/links.scss +43 -0
  47. data/app/assets/stylesheets/pages/admin/components/list_table.scss +61 -0
  48. data/app/assets/stylesheets/pages/admin/{login.css.scss.erb → components/login.scss} +3 -9
  49. data/app/assets/stylesheets/pages/admin/components/modal.scss +106 -0
  50. data/app/assets/stylesheets/pages/admin/components/page_tree.scss +179 -0
  51. data/app/assets/stylesheets/pages/admin/components/pagination.scss +49 -0
  52. data/app/assets/stylesheets/pages/admin/components/sidebar.scss +28 -0
  53. data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +59 -0
  54. data/app/assets/stylesheets/pages/admin/components/textarea.scss +6 -0
  55. data/app/assets/stylesheets/pages/admin/components/toast.scss +51 -0
  56. data/app/assets/stylesheets/pages/admin/components/toolbar.scss +108 -0
  57. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +184 -0
  58. data/app/assets/stylesheets/pages/admin/controllers/{users.css.erb → users.scss} +2 -2
  59. data/app/assets/stylesheets/pages/admin/mixins/breakpoints.scss +21 -0
  60. data/app/assets/stylesheets/pages/admin/mixins/clearfix.scss +7 -0
  61. data/app/assets/stylesheets/pages/admin/mixins/gradients.scss +7 -0
  62. data/app/assets/stylesheets/pages/admin/vars.scss +30 -0
  63. data/app/assets/stylesheets/pages/errors.css +2 -0
  64. data/app/controller_dummies/admin/admin_controller.rb +1 -1
  65. data/app/controller_dummies/application_controller.rb +3 -3
  66. data/app/controller_dummies/attachments_controller.rb +4 -0
  67. data/app/controller_dummies/frontend_controller.rb +1 -1
  68. data/app/controller_dummies/images_controller.rb +1 -1
  69. data/app/controller_dummies/page_files_controller.rb +1 -1
  70. data/app/controller_dummies/pages_controller.rb +1 -1
  71. data/app/controller_dummies/sitemaps_controller.rb +1 -1
  72. data/app/controllers/admin/attachments_controller.rb +50 -0
  73. data/app/controllers/admin/categories_controller.rb +3 -4
  74. data/app/controllers/admin/images_controller.rb +29 -18
  75. data/app/controllers/admin/invites_controller.rb +20 -23
  76. data/app/controllers/admin/pages_controller.rb +59 -111
  77. data/app/controllers/admin/password_resets_controller.rb +23 -21
  78. data/app/controllers/admin/users_controller.rb +23 -23
  79. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +67 -0
  80. data/app/controllers/concerns/pages_core/admin/persistent_params.rb +75 -0
  81. data/app/controllers/concerns/pages_core/authentication.rb +4 -3
  82. data/app/controllers/concerns/pages_core/error_renderer.rb +36 -0
  83. data/app/controllers/concerns/pages_core/error_reporting.rb +36 -0
  84. data/app/controllers/concerns/pages_core/policies_helper.rb +16 -13
  85. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +44 -0
  86. data/app/controllers/concerns/pages_core/process_titler.rb +4 -4
  87. data/app/controllers/concerns/pages_core/rss_controller.rb +25 -0
  88. data/app/controllers/concerns/pages_core/static_cache_controller.rb +48 -0
  89. data/app/controllers/errors_controller.rb +20 -30
  90. data/app/controllers/pages_core/admin_controller.rb +21 -70
  91. data/app/controllers/pages_core/attachments_controller.rb +40 -0
  92. data/app/controllers/pages_core/{application_controller.rb → base_controller.rb} +13 -8
  93. data/app/controllers/pages_core/frontend/page_files_controller.rb +7 -24
  94. data/app/controllers/pages_core/frontend/pages_controller.rb +39 -228
  95. data/app/controllers/pages_core/frontend_controller.rb +10 -3
  96. data/app/controllers/pages_core/images_controller.rb +2 -2
  97. data/app/controllers/pages_core/sitemaps_controller.rb +15 -10
  98. data/app/controllers/sessions_controller.rb +4 -14
  99. data/app/formatters/pages_core/html_formatter.rb +52 -48
  100. data/app/formatters/pages_core/image_embedder.rb +79 -0
  101. data/app/formatters/pages_core/link_renderer.rb +17 -0
  102. data/app/helpers/admin/admin_helper.rb +1 -1
  103. data/app/helpers/admin/menu_helper.rb +19 -16
  104. data/app/helpers/admin/pages_helper.rb +27 -30
  105. data/app/helpers/application_helper.rb +1 -1
  106. data/app/helpers/frontend_helper.rb +1 -1
  107. data/app/helpers/pages_core/admin/admin_helper.rb +44 -71
  108. data/app/helpers/pages_core/admin/content_tabs_helper.rb +28 -0
  109. data/app/helpers/pages_core/admin/date_range_helper.rb +55 -0
  110. data/app/helpers/pages_core/admin/form_builder.rb +44 -0
  111. data/app/helpers/pages_core/admin/image_uploads_helper.rb +48 -0
  112. data/app/helpers/pages_core/admin/labelled_field_helper.rb +19 -19
  113. data/app/helpers/pages_core/admin/page_blocks_helper.rb +66 -0
  114. data/app/helpers/pages_core/admin/page_json_helper.rb +23 -0
  115. data/app/helpers/pages_core/admin/tag_editor_helper.rb +16 -14
  116. data/app/helpers/pages_core/application_helper.rb +15 -26
  117. data/app/helpers/pages_core/attachments_helper.rb +40 -0
  118. data/app/helpers/pages_core/form_builder.rb +71 -134
  119. data/app/helpers/pages_core/frontend_helper.rb +2 -8
  120. data/app/helpers/pages_core/head_tags_helper.rb +36 -169
  121. data/app/helpers/pages_core/images_helper.rb +5 -4
  122. data/app/helpers/pages_core/meta_tags_helper.rb +96 -0
  123. data/app/helpers/pages_core/open_graph_tags_helper.rb +51 -0
  124. data/app/helpers/pages_core/page_path_helper.rb +66 -0
  125. data/app/jobs/pages_core/autopublish_job.rb +2 -2
  126. data/app/jobs/pages_core/sweep_cache_job.rb +3 -3
  127. data/app/mailers/admin_mailer.rb +8 -31
  128. data/app/models/attachment.rb +78 -0
  129. data/app/models/autopublisher.rb +7 -4
  130. data/app/models/category.rb +10 -11
  131. data/app/models/concerns/pages_core/has_roles.rb +5 -4
  132. data/app/models/concerns/pages_core/humanizable_param.rb +11 -8
  133. data/app/models/concerns/pages_core/page_model/attachments.rb +41 -0
  134. data/app/models/concerns/pages_core/page_model/autopublishable.rb +25 -0
  135. data/app/models/concerns/pages_core/page_model/dated_page.rb +59 -0
  136. data/app/models/concerns/pages_core/page_model/images.rb +51 -0
  137. data/app/models/concerns/pages_core/page_model/localizable.rb +38 -0
  138. data/app/models/concerns/pages_core/page_model/pathable.rb +114 -0
  139. data/app/models/concerns/pages_core/page_model/redirectable.rb +36 -0
  140. data/app/models/concerns/pages_core/page_model/sortable.rb +53 -0
  141. data/app/models/concerns/pages_core/page_model/status.rb +50 -0
  142. data/app/models/concerns/pages_core/page_model/templateable.rb +85 -0
  143. data/app/models/concerns/pages_core/page_model/tree.rb +134 -0
  144. data/app/models/concerns/pages_core/sweepable.rb +3 -3
  145. data/app/models/concerns/pages_core/taggable.rb +11 -4
  146. data/app/models/image.rb +15 -1
  147. data/app/models/invite.rb +3 -11
  148. data/app/models/invite_role.rb +5 -3
  149. data/app/models/page.rb +49 -234
  150. data/app/models/page_builder.rb +5 -7
  151. data/app/models/page_category.rb +7 -0
  152. data/app/models/page_exporter.rb +100 -0
  153. data/app/models/page_file.rb +26 -50
  154. data/app/models/page_image.rb +7 -40
  155. data/app/models/page_path.rb +52 -0
  156. data/app/models/password_reset_token.rb +7 -9
  157. data/app/models/role.rb +23 -7
  158. data/app/models/tag.rb +28 -19
  159. data/app/models/tagging.rb +6 -5
  160. data/app/models/user.rb +38 -32
  161. data/app/policies/invite_policy.rb +2 -0
  162. data/app/policies/page_file_policy.rb +15 -17
  163. data/app/policies/page_image_policy.rb +15 -17
  164. data/app/policies/page_policy.rb +29 -23
  165. data/app/policies/policy.rb +4 -8
  166. data/app/policies/user_policy.rb +34 -32
  167. data/app/serializers/admin/attachment_serializer.rb +31 -0
  168. data/app/serializers/admin/image_serializer.rb +55 -6
  169. data/app/serializers/admin/page_file_serializer.rb +8 -0
  170. data/app/serializers/admin/page_image_serializer.rb +3 -1
  171. data/app/serializers/page_export_serializer.rb +32 -0
  172. data/app/serializers/page_file_export_serializer.rb +6 -0
  173. data/app/serializers/page_image_export_serializer.rb +42 -0
  174. data/app/serializers/page_image_serializer.rb +4 -0
  175. data/app/serializers/page_serializer.rb +2 -0
  176. data/app/services/pages_core/create_user_service.rb +39 -0
  177. data/app/services/pages_core/destroy_invite_service.rb +25 -0
  178. data/app/services/pages_core/invite_service.rb +43 -0
  179. data/app/views/admin/images/show.json.jbuilder +8 -0
  180. data/app/views/admin/invites/new.html.erb +2 -1
  181. data/app/views/admin/invites/show.html.erb +3 -4
  182. data/app/views/admin/pages/_edit_content.html.erb +11 -2
  183. data/app/views/admin/pages/_edit_files.html.erb +8 -0
  184. data/app/views/admin/pages/_edit_images.html.erb +8 -84
  185. data/app/views/admin/pages/_edit_metadata.html.erb +23 -12
  186. data/app/views/admin/pages/_edit_options.html.erb +25 -25
  187. data/app/views/admin/pages/_list_item.html.erb +50 -0
  188. data/app/views/admin/pages/deleted.html.erb +42 -0
  189. data/app/views/admin/pages/edit.html.erb +11 -91
  190. data/app/views/admin/pages/index.html.erb +10 -54
  191. data/app/views/admin/pages/new.html.erb +5 -4
  192. data/app/views/admin/pages/news.html.erb +61 -47
  193. data/app/views/admin/password_resets/show.html.erb +6 -9
  194. data/app/views/admin/users/_access_control.html.erb +4 -1
  195. data/app/views/admin/users/_list.html.erb +12 -7
  196. data/app/views/admin/users/edit.html.erb +5 -11
  197. data/app/views/admin/users/login.html.erb +58 -15
  198. data/app/views/admin/users/show.html.erb +1 -1
  199. data/app/views/admin_mailer/invite.text.erb +1 -1
  200. data/app/views/admin_mailer/password_reset.text.erb +1 -1
  201. data/app/views/errors/401.html.erb +6 -0
  202. data/app/views/errors/403.html.erb +1 -1
  203. data/app/views/errors/422.html.erb +7 -0
  204. data/app/views/errors/500.html.erb +2 -15
  205. data/app/views/errors/_generic_help.html.erb +1 -1
  206. data/app/views/feeds/pages.rss.builder +2 -2
  207. data/app/views/layouts/admin.html.erb +83 -79
  208. data/app/views/layouts/admin/_analytics.html.erb +1 -3
  209. data/app/views/layouts/admin/_header.html.erb +4 -4
  210. data/app/views/layouts/errors.html.erb +3 -7
  211. data/app/views/sitemaps/show.xml.builder +2 -0
  212. data/config/locales/en.yml +50 -1
  213. data/config/routes.rb +57 -58
  214. data/db/migrate/20111219033112_create_pages_tables.rb +191 -276
  215. data/lib/pages_core.rb +34 -32
  216. data/lib/pages_core/admin_menu_item.rb +18 -4
  217. data/lib/pages_core/archive_finder.rb +49 -20
  218. data/lib/pages_core/attachment_embedder.rb +36 -0
  219. data/lib/pages_core/cache_sweeper.rb +9 -89
  220. data/lib/pages_core/configuration.rb +3 -3
  221. data/lib/pages_core/configuration/base.rb +8 -9
  222. data/lib/pages_core/configuration/pages.rb +8 -9
  223. data/lib/pages_core/digest_verifier.rb +70 -0
  224. data/lib/pages_core/engine.rb +72 -5
  225. data/lib/pages_core/extensions.rb +2 -3
  226. data/lib/pages_core/extensions/string_extensions.rb +2 -2
  227. data/lib/pages_core/page_path_constraint.rb +23 -0
  228. data/lib/pages_core/pages_plugin.rb +13 -2
  229. data/lib/pages_core/plugin.rb +8 -52
  230. data/lib/pages_core/pub_sub.rb +38 -0
  231. data/lib/pages_core/static_cache.rb +26 -0
  232. data/lib/pages_core/static_cache/null_handler.rb +17 -0
  233. data/lib/pages_core/static_cache/page_cache_handler.rb +56 -0
  234. data/lib/pages_core/static_cache/varnish_handler.rb +55 -0
  235. data/lib/pages_core/templates.rb +10 -10
  236. data/lib/pages_core/templates/block_configuration.rb +4 -3
  237. data/lib/pages_core/templates/configuration.rb +115 -34
  238. data/lib/pages_core/templates/configuration_handler.rb +9 -5
  239. data/lib/pages_core/templates/configuration_proxy.rb +12 -12
  240. data/lib/pages_core/templates/controller_actions.rb +1 -1
  241. data/lib/pages_core/templates/template_configuration.rb +102 -98
  242. data/lib/pages_core/version.rb +2 -2
  243. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +11 -16
  244. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +1 -2
  245. data/lib/rails/generators/pages_core/frontend/templates/{application.css.scss.erb → application.scss.erb} +0 -0
  246. data/lib/rails/generators/pages_core/frontend/templates/{base.css.scss.erb → base.scss.erb} +0 -0
  247. data/lib/rails/generators/pages_core/frontend/templates/{breakpoints.css.scss.erb → breakpoints.scss.erb} +0 -0
  248. data/lib/rails/generators/pages_core/frontend/templates/clearfix.scss.erb +7 -0
  249. data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +0 -3
  250. data/lib/rails/generators/pages_core/install/install_generator.rb +25 -66
  251. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +2 -0
  252. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +2 -2
  253. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +1 -1
  254. data/lib/rails/generators/pages_core/install/templates/delayed_job +1 -0
  255. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +16 -1
  256. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +1 -1
  257. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +1 -1
  258. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +12 -1
  259. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +9 -15
  260. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +1 -1
  261. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +5 -23
  262. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +19 -14
  263. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +3 -8
  264. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +2 -0
  265. data/lib/rails/generators/pages_core/rspec/templates/page_templates_spec.rb +26 -0
  266. data/lib/rails/generators/pages_core/rspec/templates/rails_helper.rb +91 -0
  267. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +89 -45
  268. data/lib/tasks/pages.rake +2 -63
  269. data/lib/tasks/pages/cache.rake +12 -5
  270. data/lib/tasks/pages/export.rake +11 -0
  271. data/lib/tasks/pages/page_paths.rake +12 -0
  272. data/template.rb +5 -3
  273. data/vendor/assets/javascripts/ReactCrop.min.js +1 -0
  274. data/vendor/assets/javascripts/reflux.min.js +1 -0
  275. data/vendor/assets/stylesheets/ReactCrop.css +167 -0
  276. metadata +356 -192
  277. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  278. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  279. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  280. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  281. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  282. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  283. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  284. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  285. data/app/assets/javascripts/pages/admin.js.coffee +0 -54
  286. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +0 -4
  287. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +0 -139
  288. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +0 -9
  289. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +0 -47
  290. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +0 -122
  291. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +0 -66
  292. data/app/assets/javascripts/pages/admin/features/page_images.js +0 -329
  293. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +0 -40
  294. data/app/assets/javascripts/pages/admin/features/tag_editor.js +0 -159
  295. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +0 -17
  296. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +0 -21
  297. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +0 -57
  298. data/app/assets/javascripts/pages/login_form.js.coffee +0 -17
  299. data/app/assets/stylesheets/pages/admin.css.erb +0 -404
  300. data/app/assets/stylesheets/pages/admin/buttons.css.erb +0 -5
  301. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +0 -94
  302. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +0 -58
  303. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +0 -178
  304. data/app/assets/stylesheets/pages/admin/editable_image.css.erb +0 -19
  305. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +0 -73
  306. data/app/assets/stylesheets/pages/admin/header.css.erb +0 -129
  307. data/app/assets/stylesheets/pages/admin/images.css.scss.erb +0 -160
  308. data/app/assets/stylesheets/pages/admin/links.css.erb +0 -34
  309. data/app/assets/stylesheets/pages/admin/list_table.css.erb +0 -56
  310. data/app/assets/stylesheets/pages/admin/modal.css.erb +0 -14
  311. data/app/assets/stylesheets/pages/admin/pagination.css.scss +0 -22
  312. data/app/assets/stylesheets/pages/admin/print.css.erb +0 -17
  313. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +0 -39
  314. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +0 -18
  315. data/app/assets/stylesheets/pages/admin/tag_editor.css.scss.erb +0 -48
  316. data/app/assets/stylesheets/pages/admin/textarea.css.erb +0 -55
  317. data/app/controllers/admin/page_comments_controller.rb +0 -61
  318. data/app/controllers/admin/page_files_controller.rb +0 -81
  319. data/app/controllers/admin/page_images_controller.rb +0 -116
  320. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -28
  321. data/app/controllers/concerns/pages_core/exception_handler.rb +0 -114
  322. data/app/helpers/pages_core/login_helper.rb +0 -14
  323. data/app/indices/page_file_index.rb +0 -9
  324. data/app/indices/page_index.rb +0 -29
  325. data/app/indices/user_index.rb +0 -11
  326. data/app/models/concerns/pages_core/page_tree.rb +0 -85
  327. data/app/models/concerns/pages_core/searchable_page.rb +0 -33
  328. data/app/models/concerns/pages_core/templateable.rb +0 -85
  329. data/app/models/localization.rb +0 -27
  330. data/app/models/page_comment.rb +0 -18
  331. data/app/views/admin/pages/_edit_comments.html.erb +0 -21
  332. data/app/views/admin/pages/_pagelisting.html.erb +0 -63
  333. data/app/views/admin/users/_login_form.html.erb +0 -47
  334. data/app/views/admin_mailer/comment_notification.text.erb +0 -7
  335. data/app/views/admin_mailer/error_report.html.erb +0 -70
  336. data/app/views/errors/500_critical.html.erb +0 -7
  337. data/app/views/errors/report.html.erb +0 -4
  338. data/config/removed_migrations.yml +0 -60
  339. data/db/migrate/20120627033112_rename_textbits.rb +0 -19
  340. data/db/migrate/20121010055412_drop_removed_tables.rb +0 -83
  341. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +0 -11
  342. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +0 -11
  343. data/db/migrate/20130303160632_remove_imagesets.rb +0 -24
  344. data/db/migrate/20130303161732_remove_sms_subscribers.rb +0 -16
  345. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -25
  346. data/db/migrate/20140203183900_create_roles.rb +0 -63
  347. data/db/migrate/20140414150500_change_locale_names.rb +0 -13
  348. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +0 -15
  349. data/db/migrate/20140604142100_remove_openid_url.rb +0 -9
  350. data/db/migrate/20140920231700_convert_images_to_dis.rb +0 -79
  351. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +0 -50
  352. data/db/migrate/20141004003100_create_password_reset_tokens.rb +0 -10
  353. data/db/migrate/20141006181300_remove_user_cruft.rb +0 -11
  354. data/db/migrate/20141007173000_create_invites.rb +0 -16
  355. data/db/migrate/20150204130800_update_delayed_job_table.rb +0 -9
  356. data/db/migrate/20150401131300_localize_images.rb +0 -39
  357. data/db/migrate/20150520174300_add_meta_image_to_page.rb +0 -5
  358. data/db/migrate/20150904164200_add_pinned_to_tags.rb +0 -5
  359. data/lib/pages_core/extensions/hash_extensions.rb +0 -23
  360. data/lib/pages_core/localizable.rb +0 -49
  361. data/lib/pages_core/localizable/active_record_extension.rb +0 -41
  362. data/lib/pages_core/localizable/class_methods.rb +0 -51
  363. data/lib/pages_core/localizable/configuration.rb +0 -50
  364. data/lib/pages_core/localizable/instance_methods.rb +0 -130
  365. data/lib/pages_core/localizable/localizer.rb +0 -72
  366. data/lib/pages_core/localizable/scope_extension.rb +0 -22
  367. data/lib/pages_core/paginates.rb +0 -102
  368. data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +0 -8
  369. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -11
  370. data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +0 -12
  371. data/lib/tasks/db.rake +0 -96
  372. data/lib/tasks/pages/assets.rake +0 -65
  373. data/lib/tasks/pages/update.rake +0 -19
  374. data/vendor/assets/javascripts/jquery.dimscreen.js +0 -77
  375. data/vendor/assets/javascripts/jquery.fieldselection.js +0 -59
data/app/models/page.rb CHANGED
@@ -1,79 +1,49 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- class Page < ActiveRecord::Base
3
+ class Page < ApplicationRecord
4
4
  include PagesCore::HumanizableParam
5
- include PagesCore::PageTree
6
- include PagesCore::SearchablePage
7
5
  include PagesCore::Sweepable
8
6
  include PagesCore::Taggable
9
- include PagesCore::Templateable
10
7
 
11
- belongs_to :author, class_name: "User", foreign_key: :user_id
12
-
13
- has_and_belongs_to_many :categories, join_table: "pages_categories"
14
-
15
- belongs_to_image :image
16
- belongs_to_image :meta_image, class_name: "Image"
17
-
18
- has_many :page_images, -> { order("position") }
19
-
20
- has_many :images,
21
- -> { where("`page_images`.`primary` = ?", false).order("position") },
22
- through: :page_images
23
-
24
- has_many :comments,
25
- class_name: "PageComment",
26
- dependent: :destroy
27
-
28
- has_many :page_files,
29
- -> { order("position ASC") },
30
- class_name: "PageFile",
31
- dependent: :destroy
32
-
33
- acts_as_list scope: :parent_page
34
-
35
- localizable do
36
- attribute :name
37
- attribute :body
38
- attribute :excerpt
39
- attribute :headline
40
- attribute :boxout
41
-
42
- attribute :meta_description
43
- attribute :open_graph_title
44
- attribute :open_graph_description
45
-
46
- dictionary -> { PagesCore::Templates::TemplateConfiguration.all_blocks }
47
- end
48
-
49
- validates_format_of :redirect_to,
50
- with: %r{\A(/|https?://)},
51
- allow_nil: true,
52
- allow_blank: true
53
-
54
- validates_format_of :unique_name,
55
- with: /\A[\w\d_\-]+\z/,
56
- allow_nil: true,
57
- allow_blank: true
58
-
59
- validates_uniqueness_of :unique_name, allow_nil: true, allow_blank: true
8
+ include PagesCore::PageModel::Attachments
9
+ include PagesCore::PageModel::Autopublishable
10
+ include PagesCore::PageModel::DatedPage
11
+ include PagesCore::PageModel::Images
12
+ include PagesCore::PageModel::Localizable
13
+ include PagesCore::PageModel::Pathable
14
+ include PagesCore::PageModel::Redirectable
15
+ include PagesCore::PageModel::Sortable
16
+ include PagesCore::PageModel::Status
17
+ include PagesCore::PageModel::Tree
18
+ include PagesCore::PageModel::Templateable
19
+
20
+ belongs_to :author,
21
+ class_name: "User",
22
+ foreign_key: :user_id,
23
+ optional: true,
24
+ inverse_of: :pages
25
+
26
+ has_many :page_categories, dependent: :destroy
27
+ has_many :categories, through: :page_categories
28
+
29
+ validates(:unique_name,
30
+ format: { with: /\A[\w\d_\-]+\z/,
31
+ allow_blank: true },
32
+ uniqueness: { allow_blank: true })
60
33
 
61
34
  validates :template, presence: true
62
- validates :content_order, presence: true
63
35
  validates :published_at, presence: true
64
36
 
65
37
  before_validation :published_at
66
- before_validation :set_autopublish
67
- before_validation :set_content_order
68
- after_save :ensure_page_images_contains_primary_image
69
- after_save :queue_autopublisher
70
- after_save ThinkingSphinx::RealTime.callback_for(:page)
71
38
 
72
- scope :by_date, -> { order("published_at DESC") }
73
- scope :published, -> { where(status: 2, autopublish: false) }
74
- scope :visible, -> { where("status < 4") }
75
- scope :news_pages, -> { visible.where(news_page: true) }
76
- scope :pinned, -> { where(pinned: true) }
39
+ scope :by_date, -> { order("published_at DESC") }
40
+ scope :by_updated_at, -> { order("updated_at DESC") }
41
+ scope :published, -> { where(status: 2, autopublish: false) }
42
+ scope :hidden, -> { where(status: 3) }
43
+ scope :deleted, -> { where(status: 4) }
44
+ scope :visible, -> { where("status < 4") }
45
+ scope :news_pages, -> { visible.where(news_page: true) }
46
+ scope :pinned, -> { where(pinned: true) }
77
47
 
78
48
  class << self
79
49
  def archive_finder
@@ -82,200 +52,45 @@ class Page < ActiveRecord::Base
82
52
 
83
53
  # Find all published and feed enabled pages
84
54
  def enabled_feeds(locale, options = {})
85
- conditions = (options[:include_hidden]) ? "status IN (2,3)" : "status = 2"
55
+ conditions = options[:include_hidden] ? "status IN (2,3)" : "status = 2"
86
56
  Page.where(feed_enabled: true).where(conditions).localized(locale)
87
57
  end
88
-
89
- def status_labels
90
- {
91
- 0 => "Draft",
92
- 1 => "Reviewed",
93
- 2 => "Published",
94
- 3 => "Hidden",
95
- 4 => "Deleted"
96
- }
97
- end
98
-
99
- def order_by_tags(tags)
100
- joins(
101
- "LEFT JOIN taggings ON taggings.taggable_id = pages.id AND " \
102
- "taggable_type = \"Page\"",
103
- "LEFT JOIN tags ON tags.id = taggings.tag_id AND tags.id IN (" +
104
- tags.map(&:id).join(",") +
105
- ")"
106
- )
107
- .group("pages.id, localizations.id")
108
- .reorder("COUNT(tags.id) DESC, position ASC")
109
- end
110
- end
111
-
112
- def comments_closed_after_time?
113
- if PagesCore.config.close_comments_after.nil?
114
- false
115
- else
116
- (Time.now - published_at) > PagesCore.config.close_comments_after
117
- end
118
- end
119
-
120
- def comments_allowed?
121
- if self.comments_closed_after_time?
122
- false
123
- else
124
- self[:comments_allowed]
125
- end
126
- end
127
-
128
- def extended?
129
- excerpt? && body?
130
58
  end
131
59
 
132
60
  def empty?
133
61
  !body? && !excerpt?
134
62
  end
135
- alias_method :blank?, :empty?
63
+ alias blank? empty?
136
64
 
137
65
  def excerpt_or_body
138
66
  excerpt? ? excerpt : body
139
67
  end
140
68
 
141
- def image
142
- super.try { |i| i.localize(locale) }
143
- end
144
-
145
- def images
146
- super.in_locale(locale)
147
- end
148
-
149
- def page_images
150
- super.in_locale(locale)
151
- end
152
-
153
- def files
154
- page_files.in_locale(locale)
69
+ def extended?
70
+ excerpt? && body?
155
71
  end
156
72
 
157
73
  def headline_or_name
158
74
  headline? ? headline : name
159
75
  end
160
76
 
161
- # Does this page have an image?
162
- def image?
163
- self.image_id?
164
- end
165
-
166
- # Get subpages
167
- def pages(_options = nil)
168
- if self.locale?
169
- subpages.published.localized(locale)
170
- else
171
- subpages.published
77
+ def move(parent:, position:)
78
+ Page.transaction do
79
+ update(parent: parent) unless self.parent == parent
80
+ insert_at(position)
172
81
  end
173
82
  end
174
83
 
175
- def subpages
176
- children.order(pinned_content_order)
177
- end
178
-
179
- # Return the status of the page as a string
180
- def status_label
181
- self.class.status_labels[status]
182
- end
183
-
184
- def flag_as_deleted!
185
- update(status: 4)
186
- end
187
-
188
84
  # Get publication date, which defaults to the creation date
189
85
  def published_at
190
- if self.created_at?
191
- self[:published_at] ||= created_at
192
- else
193
- self[:published_at] ||= Time.now
194
- end
195
- end
196
-
197
- # Returns boolean true if page has a valid redirect
198
- def redirects?
199
- self.redirect_to?
200
- end
201
-
202
- def redirect_path(params = {})
203
- path = redirect_to.dup
204
- if path.start_with? "/"
205
- params.each do |key, value|
206
- unless value.is_a?(String) || value.is_a?(Symbol)
207
- fail "redirect_url param must be a string or a symbol"
208
- end
209
- path.gsub!("/:#{key}", "/#{value}")
210
- end
211
- end
212
- path
213
- end
214
-
215
- # Returns true if this page's children is reorderable
216
- def reorderable_children?
217
- !self.content_order? || content_order =~ /position/
218
- end
219
-
220
- # Returns true if this page is reorderable
221
- def reorderable?
222
- !parent || !parent.content_order? || parent.content_order =~ /position/
223
- end
224
-
225
- def draft?
226
- status == 0
227
- end
228
-
229
- def reviewed?
230
- status == 1
231
- end
232
-
233
- def published?
234
- status == 2 && !autopublish?
235
- end
236
-
237
- def hidden?
238
- status == 3
239
- end
240
-
241
- def deleted?
242
- status == 4
86
+ self[:published_at] ||= if created_at?
87
+ created_at
88
+ else
89
+ Time.now.utc
90
+ end
243
91
  end
244
92
 
245
93
  def to_param
246
- humanized_param(name)
247
- end
248
-
249
- def content_order
250
- self[:content_order] || "position"
251
- end
252
-
253
- private
254
-
255
- def ensure_page_images_contains_primary_image
256
- return if !image_id? || !image_id_changed?
257
- page_image = page_images.where(image_id: image_id).first
258
- if page_image
259
- page_image.update(primary: true)
260
- else
261
- page_images.create(image_id: image_id, primary: true)
262
- end
263
- end
264
-
265
- def pinned_content_order
266
- self.news_page? ? "pages.pinned DESC, #{content_order}" : content_order
267
- end
268
-
269
- def set_autopublish
270
- self.autopublish = published_at? && published_at > Time.now
271
- true
272
- end
273
-
274
- def set_content_order
275
- self[:content_order] ||= "position"
276
- end
277
-
278
- def queue_autopublisher
279
- Autopublisher.queue! if self.autopublish?
94
+ humanized_param(transliterated_name)
280
95
  end
281
96
  end
@@ -1,4 +1,4 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  # # PageBuilder
4
4
  #
@@ -30,16 +30,14 @@ class PageBuilder
30
30
  @parent = parent
31
31
  end
32
32
 
33
- def page(name, options={}, &block)
33
+ def page(name, options = {}, &block)
34
34
  page = Page.create(
35
- { name: name }
36
- .merge(default_options)
37
- .merge(options)
35
+ { name: name }.merge(default_options).merge(options)
38
36
  )
39
37
  if block_given?
40
38
  self.class
41
- .new(user, locale: locale, parent: page)
42
- .run(&block)
39
+ .new(user, locale: locale, parent: page)
40
+ .run(&block)
43
41
  end
44
42
  page
45
43
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PageCategory < ApplicationRecord
4
+ belongs_to :page
5
+ belongs_to :category
6
+ validates :page_id, :category_id, presence: true
7
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+
5
+ class PageExporter
6
+ attr_reader :base_dir, :progress_bar
7
+
8
+ def initialize(base_dir, progress_bar: false)
9
+ @base_dir = base_dir
10
+ @progress_bar = progress_bar
11
+ end
12
+
13
+ def export
14
+ Page.roots.in_locale(I18n.default_locale).each { |p| export_page(p) }
15
+ end
16
+
17
+ private
18
+
19
+ def bar
20
+ @bar ||= ProgressBar.new(Page.count)
21
+ end
22
+
23
+ def export_page(page)
24
+ bar.increment! if progress_bar
25
+ export_page_contents(page)
26
+ export_images(page)
27
+ export_files(page)
28
+ page.subpages.in_locale(I18n.default_locale).each { |p| export_page(p) }
29
+ end
30
+
31
+ def export_files(page)
32
+ path = page_path(page).join("files")
33
+ page.attachments.each do |file|
34
+ write_file(
35
+ path.join([file.content_hash, file.filename].join("-")),
36
+ file.data
37
+ )
38
+ end
39
+ end
40
+
41
+ def export_images(page)
42
+ path = page_path(page).join("images")
43
+ page.page_images.each do |pi|
44
+ write_file(
45
+ path.join([pi.image.content_hash, pi.image.filename].join("-")),
46
+ pi.image.data
47
+ )
48
+ end
49
+ end
50
+
51
+ def export_page_contents(page)
52
+ path = page_path(page)
53
+ localized_pages(page).each do |p|
54
+ export_page_json(path, page)
55
+ write_file(path.join("page.#{p.locale}.txt"), text_page(p))
56
+ end
57
+ end
58
+
59
+ def export_page_json(path, page)
60
+ json = PageExportSerializer.new(page).to_json
61
+ write_file(path.join("page.#{page.locale}.json"), json)
62
+ write_file(path.join("page.#{page.locale}.yml"), JSON.parse(json).to_yaml)
63
+ end
64
+
65
+ def localized_pages(page)
66
+ page.locales.map { |l| page.localize(l) }
67
+ end
68
+
69
+ def page_path(page)
70
+ base_dir.join(page.self_and_ancestors
71
+ .reverse
72
+ .map { |p| page_path_segment(p) }.join("/pages/"))
73
+ end
74
+
75
+ def page_file_name(page)
76
+ [page.path_segment,
77
+ page.to_param[0..250]].reject(&:blank?).first
78
+ end
79
+
80
+ def page_path_segment(page)
81
+ prefix = page.deleted? ? "_deleted/" : ""
82
+ if page&.parent&.news_page?
83
+ prefix += "[#{page.published_at.to_date.iso8601}] "
84
+ end
85
+ prefix + page_file_name(page)
86
+ end
87
+
88
+ def text_page(page)
89
+ PagesCore::Templates::TemplateConfiguration
90
+ .all_blocks
91
+ .select { |attr| page.send("#{attr}?".to_sym) }
92
+ .map { |attr| ["-- #{attr}: --", page.send(attr).strip].join("\n\n") }
93
+ .join("\n\n\n")
94
+ end
95
+
96
+ def write_file(path, data)
97
+ FileUtils.mkdir_p(File.dirname(path))
98
+ File.open(path, "wb") { |fh| fh.write(data) }
99
+ end
100
+ end