pages_core 3.5.1 → 3.6.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 (312) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +7 -13
  3. data/app/assets/javascripts/pages/{admin.es6.jsx → admin.jsx} +2 -4
  4. data/app/assets/javascripts/pages/admin/components.jsx +2 -0
  5. data/app/assets/javascripts/pages/admin/components/attachment.jsx +130 -0
  6. data/app/assets/javascripts/pages/admin/components/attachment_editor.jsx +131 -0
  7. data/app/assets/javascripts/pages/admin/components/attachments.jsx +211 -0
  8. data/app/assets/javascripts/pages/admin/components/date_range_select.jsx +174 -0
  9. data/app/assets/javascripts/pages/admin/components/drag_uploader.jsx +174 -0
  10. data/app/assets/javascripts/pages/admin/components/editable_image.jsx +57 -0
  11. data/app/assets/javascripts/pages/admin/components/file_upload_button.jsx +44 -0
  12. data/app/assets/javascripts/pages/admin/components/focal_point.jsx +82 -0
  13. data/app/assets/javascripts/pages/admin/components/grid_image.jsx +124 -0
  14. data/app/assets/javascripts/pages/admin/components/image_editor.jsx +496 -0
  15. data/app/assets/javascripts/pages/admin/components/image_grid.jsx +301 -0
  16. data/app/assets/javascripts/pages/admin/components/image_uploader.jsx +171 -0
  17. data/app/assets/javascripts/pages/admin/components/modal.jsx +48 -0
  18. data/app/assets/javascripts/pages/admin/components/modal_store.jsx +20 -0
  19. data/app/assets/javascripts/pages/admin/components/page_dates.jsx +58 -0
  20. data/app/assets/javascripts/pages/admin/components/page_files.jsx +14 -0
  21. data/app/assets/javascripts/pages/admin/components/page_images.jsx +16 -0
  22. data/app/assets/javascripts/pages/admin/components/{page_tree.es6.jsx → page_tree.jsx} +7 -37
  23. data/app/assets/javascripts/pages/admin/components/{page_tree_node.es6.jsx → page_tree_node.jsx} +32 -10
  24. data/app/assets/javascripts/pages/admin/components/page_tree_store.jsx +203 -0
  25. data/app/assets/javascripts/pages/admin/components/rich_text_area.jsx +63 -0
  26. data/app/assets/javascripts/pages/admin/components/rich_text_toolbar.jsx +58 -0
  27. data/app/assets/javascripts/pages/admin/components/toast.jsx +37 -0
  28. data/app/assets/javascripts/pages/admin/components/toast_store.jsx +52 -0
  29. data/app/assets/javascripts/pages/admin/features/{content_tabs.es6.jsx → content_tabs.jsx} +11 -2
  30. data/app/assets/javascripts/pages/admin/features/{edit_page.es6.jsx → edit_page.jsx} +7 -51
  31. data/app/assets/javascripts/pages/admin/features/rich_text.jsx +14 -0
  32. data/app/assets/javascripts/pages/admin/features/{tag_editor.es6.jsx → tag_editor.jsx} +0 -0
  33. data/app/assets/javascripts/pages/admin/lib/{tree.es6.jsx → tree.jsx} +0 -0
  34. data/app/assets/javascripts/pages/{login_form.es6.jsx → login_form.jsx} +0 -0
  35. data/app/assets/stylesheets/pages/admin.scss +9 -13
  36. data/app/assets/stylesheets/pages/admin/components/archive.scss +6 -0
  37. data/app/assets/stylesheets/pages/admin/components/attachments.scss +130 -0
  38. data/app/assets/stylesheets/pages/admin/components/buttons.scss +18 -0
  39. data/app/assets/stylesheets/pages/admin/components/forms.scss +99 -21
  40. data/app/assets/stylesheets/pages/admin/components/header.scss +16 -28
  41. data/app/assets/stylesheets/pages/admin/components/image_editor.scss +195 -0
  42. data/app/assets/stylesheets/pages/admin/components/image_grid.scss +181 -0
  43. data/app/assets/stylesheets/pages/admin/components/image_uploader.scss +53 -0
  44. data/app/assets/stylesheets/pages/admin/components/links.scss +1 -1
  45. data/app/assets/stylesheets/pages/admin/components/list_table.scss +8 -5
  46. data/app/assets/stylesheets/pages/admin/components/login.scss +2 -8
  47. data/app/assets/stylesheets/pages/admin/components/modal.scss +91 -0
  48. data/app/assets/stylesheets/pages/admin/components/page_tree.scss +12 -6
  49. data/app/assets/stylesheets/pages/admin/components/pagination.scss +34 -16
  50. data/app/assets/stylesheets/pages/admin/components/sidebar.scss +9 -6
  51. data/app/assets/stylesheets/pages/admin/components/tag_editor.scss +20 -15
  52. data/app/assets/stylesheets/pages/admin/components/textarea.scss +1 -71
  53. data/app/assets/stylesheets/pages/admin/components/toast.scss +51 -0
  54. data/app/assets/stylesheets/pages/admin/components/toolbar.scss +108 -0
  55. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +9 -21
  56. data/app/assets/stylesheets/pages/admin/controllers/users.scss +2 -2
  57. data/app/assets/stylesheets/pages/admin/vars.scss +26 -4
  58. data/app/controller_dummies/admin/admin_controller.rb +0 -2
  59. data/app/controller_dummies/application_controller.rb +2 -4
  60. data/app/controller_dummies/attachments_controller.rb +2 -0
  61. data/app/controller_dummies/frontend_controller.rb +0 -2
  62. data/app/controller_dummies/images_controller.rb +0 -2
  63. data/app/controller_dummies/page_files_controller.rb +0 -2
  64. data/app/controller_dummies/pages_controller.rb +0 -2
  65. data/app/controller_dummies/sitemaps_controller.rb +0 -2
  66. data/app/controllers/admin/attachments_controller.rb +48 -0
  67. data/app/controllers/admin/categories_controller.rb +2 -5
  68. data/app/controllers/admin/images_controller.rb +25 -19
  69. data/app/controllers/admin/invites_controller.rb +16 -26
  70. data/app/controllers/admin/pages_controller.rb +50 -32
  71. data/app/controllers/admin/password_resets_controller.rb +11 -18
  72. data/app/controllers/admin/users_controller.rb +16 -22
  73. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +21 -14
  74. data/app/controllers/concerns/pages_core/authentication.rb +0 -2
  75. data/app/controllers/concerns/pages_core/domain_based_cache.rb +0 -2
  76. data/app/controllers/concerns/pages_core/error_renderer.rb +33 -0
  77. data/app/controllers/concerns/pages_core/policies_helper.rb +9 -13
  78. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +3 -5
  79. data/app/controllers/concerns/pages_core/process_titler.rb +1 -3
  80. data/app/controllers/concerns/pages_core/rss_controller.rb +0 -2
  81. data/app/controllers/errors_controller.rb +52 -26
  82. data/app/controllers/pages_core/admin_controller.rb +22 -13
  83. data/app/controllers/pages_core/attachments_controller.rb +36 -0
  84. data/app/controllers/pages_core/{application_controller.rb → base_controller.rb} +16 -5
  85. data/app/controllers/pages_core/frontend/page_files_controller.rb +5 -24
  86. data/app/controllers/pages_core/frontend/pages_controller.rb +4 -8
  87. data/app/controllers/pages_core/frontend_controller.rb +0 -2
  88. data/app/controllers/pages_core/images_controller.rb +0 -2
  89. data/app/controllers/pages_core/sitemaps_controller.rb +3 -5
  90. data/app/controllers/sessions_controller.rb +3 -15
  91. data/app/formatters/pages_core/html_formatter.rb +60 -16
  92. data/app/formatters/pages_core/link_renderer.rb +15 -0
  93. data/app/helpers/admin/admin_helper.rb +0 -2
  94. data/app/helpers/admin/menu_helper.rb +2 -4
  95. data/app/helpers/admin/pages_helper.rb +47 -9
  96. data/app/helpers/application_helper.rb +0 -2
  97. data/app/helpers/frontend_helper.rb +0 -2
  98. data/app/helpers/pages_core/admin/admin_helper.rb +75 -20
  99. data/app/helpers/pages_core/admin/form_builder.rb +36 -0
  100. data/app/helpers/pages_core/admin/labelled_field_helper.rb +6 -8
  101. data/app/helpers/pages_core/admin/tag_editor_helper.rb +0 -2
  102. data/app/helpers/pages_core/application_helper.rb +1 -2
  103. data/app/helpers/pages_core/attachments_helper.rb +36 -0
  104. data/app/helpers/pages_core/form_builder.rb +7 -11
  105. data/app/helpers/pages_core/frontend_helper.rb +0 -6
  106. data/app/helpers/pages_core/head_tags_helper.rb +8 -4
  107. data/app/helpers/pages_core/images_helper.rb +0 -2
  108. data/app/helpers/pages_core/meta_tags_helper.rb +3 -5
  109. data/app/helpers/pages_core/open_graph_tags_helper.rb +1 -3
  110. data/app/helpers/pages_core/page_path_helper.rb +14 -9
  111. data/app/jobs/pages_core/autopublish_job.rb +0 -2
  112. data/app/jobs/pages_core/sweep_cache_job.rb +0 -2
  113. data/app/mailers/admin_mailer.rb +3 -16
  114. data/app/models/attachment.rb +76 -0
  115. data/app/models/autopublisher.rb +3 -3
  116. data/app/models/category.rb +0 -3
  117. data/app/models/concerns/pages_core/has_roles.rb +1 -2
  118. data/app/models/concerns/pages_core/humanizable_param.rb +4 -4
  119. data/app/models/concerns/pages_core/page_model/attachments.rb +39 -0
  120. data/app/models/concerns/pages_core/page_model/autopublishable.rb +0 -2
  121. data/app/models/concerns/pages_core/page_model/dated_page.rb +59 -0
  122. data/app/models/concerns/pages_core/page_model/images.rb +12 -15
  123. data/app/models/concerns/pages_core/page_model/localizable.rb +10 -3
  124. data/app/models/concerns/pages_core/page_model/pathable.rb +8 -10
  125. data/app/models/concerns/pages_core/page_model/redirectable.rb +0 -2
  126. data/app/models/concerns/pages_core/page_model/sortable.rb +1 -3
  127. data/app/models/concerns/pages_core/page_model/status.rb +1 -3
  128. data/app/models/concerns/pages_core/page_model/templateable.rb +2 -4
  129. data/app/models/concerns/pages_core/page_model/tree.rb +24 -5
  130. data/app/models/concerns/pages_core/sweepable.rb +0 -2
  131. data/app/models/concerns/pages_core/taggable.rb +4 -3
  132. data/app/models/image.rb +1 -0
  133. data/app/models/invite.rb +0 -10
  134. data/app/models/page.rb +17 -21
  135. data/app/models/page_builder.rb +0 -2
  136. data/app/models/page_category.rb +0 -2
  137. data/app/models/page_exporter.rb +87 -0
  138. data/app/models/page_file.rb +24 -48
  139. data/app/models/page_image.rb +3 -37
  140. data/app/models/page_path.rb +0 -2
  141. data/app/models/password_reset_token.rb +0 -4
  142. data/app/models/role.rb +15 -2
  143. data/app/models/tag.rb +15 -6
  144. data/app/models/tagging.rb +1 -3
  145. data/app/models/user.rb +29 -25
  146. data/app/policies/page_file_policy.rb +13 -17
  147. data/app/policies/page_image_policy.rb +13 -17
  148. data/app/policies/page_policy.rb +26 -26
  149. data/app/policies/policy.rb +2 -8
  150. data/app/policies/user_policy.rb +32 -32
  151. data/app/serializers/admin/attachment_serializer.rb +29 -0
  152. data/app/serializers/admin/image_serializer.rb +53 -6
  153. data/app/serializers/admin/page_file_serializer.rb +6 -0
  154. data/app/serializers/admin/page_image_serializer.rb +1 -1
  155. data/app/serializers/page_export_serializer.rb +30 -0
  156. data/app/serializers/page_file_export_serializer.rb +4 -0
  157. data/app/serializers/page_image_export_serializer.rb +40 -0
  158. data/app/serializers/page_image_serializer.rb +2 -0
  159. data/app/services/pages_core/create_user_service.rb +36 -0
  160. data/app/services/pages_core/invite_service.rb +41 -0
  161. data/app/views/admin/images/show.json.jbuilder +6 -0
  162. data/app/views/admin/pages/_edit_content.html.erb +7 -0
  163. data/app/views/admin/pages/_edit_files.html.erb +8 -0
  164. data/app/views/admin/pages/_edit_images.html.erb +8 -95
  165. data/app/views/admin/pages/_edit_options.html.erb +7 -15
  166. data/app/views/admin/pages/_list_item.html.erb +50 -0
  167. data/app/views/admin/pages/deleted.html.erb +42 -0
  168. data/app/views/admin/pages/edit.html.erb +9 -94
  169. data/app/views/admin/pages/index.html.erb +9 -12
  170. data/app/views/admin/pages/new.html.erb +2 -1
  171. data/app/views/admin/pages/news.html.erb +59 -45
  172. data/app/views/admin/password_resets/show.html.erb +6 -9
  173. data/app/views/admin/users/_access_control.html.erb +4 -1
  174. data/app/views/admin/users/_list.html.erb +12 -7
  175. data/app/views/admin/users/edit.html.erb +5 -11
  176. data/app/views/admin/users/login.html.erb +58 -15
  177. data/app/views/admin/users/show.html.erb +1 -1
  178. data/app/views/admin_mailer/invite.text.erb +1 -1
  179. data/app/views/admin_mailer/password_reset.text.erb +1 -1
  180. data/app/views/errors/401.html.erb +6 -0
  181. data/app/views/errors/403.html.erb +1 -1
  182. data/app/views/errors/500.html.erb +11 -6
  183. data/app/views/errors/500_critical.html.erb +1 -1
  184. data/app/views/feeds/pages.rss.builder +1 -3
  185. data/app/views/layouts/admin.html.erb +83 -83
  186. data/app/views/layouts/admin/_analytics.html.erb +1 -3
  187. data/app/views/layouts/admin/_header.html.erb +2 -2
  188. data/app/views/layouts/errors.html.erb +3 -7
  189. data/config/locales/en.yml +12 -0
  190. data/config/routes.rb +38 -55
  191. data/db/migrate/20111219033112_create_pages_tables.rb +6 -8
  192. data/db/migrate/20120627033112_rename_textbits.rb +1 -3
  193. data/db/migrate/20121010055412_drop_removed_tables.rb +1 -3
  194. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +1 -3
  195. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +1 -3
  196. data/db/migrate/20130303160632_remove_imagesets.rb +1 -3
  197. data/db/migrate/20130303161732_remove_sms_subscribers.rb +1 -3
  198. data/db/migrate/20130823133208_update_page_redirect_to.rb +1 -3
  199. data/db/migrate/20140203183900_create_roles.rb +1 -1
  200. data/db/migrate/20140414150500_change_locale_names.rb +1 -3
  201. data/db/migrate/20140604142100_remove_openid_url.rb +1 -1
  202. data/db/migrate/20140920231700_convert_images_to_dis.rb +1 -1
  203. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +1 -1
  204. data/db/migrate/20141004003100_create_password_reset_tokens.rb +1 -1
  205. data/db/migrate/20141006181300_remove_user_cruft.rb +1 -1
  206. data/db/migrate/20141007173000_create_invites.rb +1 -1
  207. data/db/migrate/20150204130800_update_delayed_job_table.rb +1 -1
  208. data/db/migrate/20150401131300_localize_images.rb +1 -1
  209. data/db/migrate/20150520174300_add_meta_image_to_page.rb +1 -1
  210. data/db/migrate/20150904164200_add_pinned_to_tags.rb +1 -1
  211. data/db/migrate/20151002174800_create_page_paths.rb +2 -2
  212. data/db/migrate/20151021103400_drop_binaries_table.rb +1 -1
  213. data/db/migrate/20151204151000_remove_page_content_order.rb +1 -1
  214. data/db/migrate/20160330220900_rename_pages_categories.rb +1 -1
  215. data/db/migrate/20160405202700_change_localization_limit.rb +1 -1
  216. data/db/migrate/20170716040500_remove_page_comments.rb +23 -0
  217. data/db/migrate/20170716213400_remove_sessions.rb +15 -0
  218. data/db/migrate/20180207134000_add_dates_to_pages.rb +11 -0
  219. data/db/migrate/20190211154800_create_attachments.rb +73 -0
  220. data/lib/pages_core.rb +6 -9
  221. data/lib/pages_core/admin_menu_item.rb +0 -2
  222. data/lib/pages_core/archive_finder.rb +21 -15
  223. data/lib/pages_core/attachment_embedder.rb +38 -0
  224. data/lib/pages_core/cache_sweeper.rb +14 -23
  225. data/lib/pages_core/configuration.rb +0 -2
  226. data/lib/pages_core/configuration/base.rb +0 -2
  227. data/lib/pages_core/configuration/pages.rb +2 -8
  228. data/lib/pages_core/digest_verifier.rb +70 -0
  229. data/lib/pages_core/engine.rb +6 -13
  230. data/lib/pages_core/extensions.rb +0 -3
  231. data/lib/pages_core/extensions/string_extensions.rb +0 -2
  232. data/lib/pages_core/page_path_constraint.rb +0 -2
  233. data/lib/pages_core/pages_plugin.rb +0 -2
  234. data/lib/pages_core/plugin.rb +0 -2
  235. data/lib/pages_core/pub_sub.rb +36 -0
  236. data/lib/pages_core/templates.rb +0 -2
  237. data/lib/pages_core/templates/block_configuration.rb +1 -3
  238. data/lib/pages_core/templates/configuration.rb +88 -10
  239. data/lib/pages_core/templates/configuration_handler.rb +6 -4
  240. data/lib/pages_core/templates/configuration_proxy.rb +4 -2
  241. data/lib/pages_core/templates/controller_actions.rb +0 -2
  242. data/lib/pages_core/templates/template_configuration.rb +41 -37
  243. data/lib/pages_core/version.rb +1 -3
  244. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +10 -17
  245. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +1 -2
  246. data/lib/rails/generators/pages_core/frontend/templates/{application.css.scss.erb → application.scss.erb} +0 -0
  247. data/lib/rails/generators/pages_core/frontend/templates/{base.css.scss.erb → base.scss.erb} +0 -0
  248. data/lib/rails/generators/pages_core/frontend/templates/{breakpoints.css.scss.erb → breakpoints.scss.erb} +0 -0
  249. data/lib/rails/generators/pages_core/frontend/templates/clearfix.scss.erb +7 -0
  250. data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +0 -3
  251. data/lib/rails/generators/pages_core/install/install_generator.rb +4 -15
  252. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +1 -3
  253. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +0 -2
  254. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +0 -5
  255. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +0 -2
  256. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +0 -2
  257. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +0 -2
  258. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +7 -15
  259. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +0 -2
  260. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +2 -19
  261. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +2 -4
  262. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +1 -1
  263. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +4 -13
  264. data/lib/tasks/pages.rake +0 -62
  265. data/lib/tasks/pages/cache.rake +6 -2
  266. data/lib/tasks/pages/export.rake +9 -0
  267. data/lib/tasks/pages/page_paths.rake +0 -2
  268. data/lib/tasks/pages/update.rake +0 -2
  269. data/template.rb +3 -3
  270. data/vendor/assets/javascripts/ReactCrop.min.js +1 -0
  271. data/vendor/assets/javascripts/reflux.min.js +1 -1
  272. data/vendor/assets/stylesheets/ReactCrop.css +167 -0
  273. metadata +200 -175
  274. data/app/assets/javascripts/pages/admin/components.es6.jsx +0 -1
  275. data/app/assets/javascripts/pages/admin/components/page_tree_actions.es6.jsx +0 -8
  276. data/app/assets/javascripts/pages/admin/components/page_tree_store.es6.jsx +0 -161
  277. data/app/assets/javascripts/pages/admin/features/editable_image.es6.jsx +0 -145
  278. data/app/assets/javascripts/pages/admin/features/modal.es6.jsx +0 -90
  279. data/app/assets/javascripts/pages/admin/features/page_images.es6.jsx +0 -338
  280. data/app/assets/javascripts/pages/admin/features/rich_text.es6.jsx +0 -124
  281. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.es6.jsx +0 -21
  282. data/app/assets/javascripts/pages/admin/lib/center_on_screen.es6.jsx +0 -22
  283. data/app/assets/stylesheets/pages/admin/components/editable_image.scss +0 -18
  284. data/app/assets/stylesheets/pages/admin/components/images.scss +0 -155
  285. data/app/assets/stylesheets/pages/admin/print.scss +0 -17
  286. data/app/controllers/admin/page_comments_controller.rb +0 -61
  287. data/app/controllers/admin/page_files_controller.rb +0 -79
  288. data/app/controllers/admin/page_images_controller.rb +0 -111
  289. data/app/controllers/concerns/pages_core/add_comments_controller.rb +0 -67
  290. data/app/controllers/concerns/pages_core/exception_handler.rb +0 -137
  291. data/app/controllers/concerns/pages_core/search_pages_controller.rb +0 -40
  292. data/app/helpers/pages_core/login_helper.rb +0 -14
  293. data/app/indices/page_file_index.rb +0 -9
  294. data/app/indices/page_index.rb +0 -29
  295. data/app/indices/user_index.rb +0 -11
  296. data/app/models/concerns/pages_core/page_model/commentable.rb +0 -29
  297. data/app/models/concerns/pages_core/page_model/searchable.rb +0 -41
  298. data/app/models/page_comment.rb +0 -18
  299. data/app/serializers/page_tree_serializer.rb +0 -15
  300. data/app/views/admin/pages/_edit_comments.html.erb +0 -37
  301. data/app/views/admin/pages/_pagelisting.html.erb +0 -63
  302. data/app/views/admin/users/_login_form.html.erb +0 -47
  303. data/app/views/admin_mailer/comment_notification.text.erb +0 -7
  304. data/lib/pages_core/extensions/hash_extensions.rb +0 -23
  305. data/lib/pages_core/file_embedder.rb +0 -40
  306. data/lib/pages_core/paginates.rb +0 -102
  307. data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +0 -8
  308. data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +0 -12
  309. data/lib/tasks/db.rake +0 -96
  310. data/lib/tasks/pages/assets.rake +0 -65
  311. data/vendor/assets/javascripts/jquery.dimscreen.js +0 -77
  312. data/vendor/assets/javascripts/jquery.fieldselection.js +0 -59
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module PageModel
5
3
  module Status
@@ -27,7 +25,7 @@ module PagesCore
27
25
  end
28
26
 
29
27
  def draft?
30
- status == 0
28
+ status.zero?
31
29
  end
32
30
 
33
31
  def reviewed?
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module PageModel
5
3
  module Templateable
@@ -14,7 +12,7 @@ module PagesCore
14
12
  end
15
13
 
16
14
  def template
17
- return self[:template] unless self[:template].blank?
15
+ return self[:template] if self[:template].present?
18
16
  inherited_or_default_template
19
17
  end
20
18
 
@@ -46,7 +44,7 @@ module PagesCore
46
44
 
47
45
  def base_template
48
46
  template.split(/_/)
49
- .reject { |w| %w(index list archive liste arkiv).include?(w) }
47
+ .reject { |w| %w[index list archive liste arkiv].include?(w) }
50
48
  .join(" ")
51
49
  end
52
50
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module PageModel
5
3
  module Tree
@@ -9,7 +7,9 @@ module PagesCore
9
7
  belongs_to :parent,
10
8
  class_name: "Page",
11
9
  foreign_key: :parent_page_id,
12
- inverse_of: :children
10
+ inverse_of: :children,
11
+ optional: true,
12
+ touch: true
13
13
 
14
14
  has_many :children,
15
15
  class_name: "Page",
@@ -23,6 +23,24 @@ module PagesCore
23
23
  end
24
24
 
25
25
  module ClassMethods
26
+ def admin_list(locale)
27
+ left_outer_joins(:parent)
28
+ .where("pages.status < 4")
29
+ .order(
30
+ Arel.sql(
31
+ <<-QUERY
32
+ pages.parent_page_id,
33
+ parents_pages.news_page,
34
+ case when parents_pages.news_page
35
+ then pages.pinned end desc,
36
+ case when parents_pages.news_page
37
+ then pages.published_at end desc,
38
+ position asc
39
+ QUERY
40
+ )
41
+ ).in_locale(locale)
42
+ end
43
+
26
44
  # Returns all root pages
27
45
  def roots
28
46
  where(parent_page_id: nil).order("position ASC")
@@ -59,7 +77,8 @@ module PagesCore
59
77
  # Finds the page's next sibling. Returns nil if there isn't one.
60
78
  def next_sibling
61
79
  return unless siblings.any?
62
- siblings[(siblings.index(self) + 1)...siblings.length].try(&:first)
80
+ siblings[(siblings.to_a.index(self) + 1)...siblings.length]
81
+ .try(&:first)
63
82
  end
64
83
 
65
84
  # Returns the pages parent
@@ -75,7 +94,7 @@ module PagesCore
75
94
  # Finds the page's next sibling. Returns nil if there isn't one.
76
95
  def previous_sibling
77
96
  return unless siblings.any?
78
- siblings[0...siblings.index(self)].try(&:last)
97
+ siblings[0...siblings.to_a.index(self)].try(&:last)
79
98
  end
80
99
 
81
100
  # Returns the root node of the tree.
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module Sweepable
5
3
  extend ActiveSupport::Concern
@@ -1,11 +1,12 @@
1
- # encoding: utf-8
2
-
3
1
  module PagesCore
4
2
  module Taggable
5
3
  extend ActiveSupport::Concern
6
4
 
7
5
  included do
8
- has_many :taggings, as: :taggable, dependent: :destroy
6
+ has_many :taggings,
7
+ as: :taggable,
8
+ dependent: :destroy,
9
+ inverse_of: :taggable
9
10
  has_many :tags, through: :taggings
10
11
  end
11
12
 
data/app/models/image.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  class Image < ActiveRecord::Base
2
2
  include DynamicImage::Model
3
+ include PagesCore::Sweepable
3
4
 
4
5
  localizable do
5
6
  attribute :alternative
data/app/models/invite.rb CHANGED
@@ -15,16 +15,6 @@ class Invite < ActiveRecord::Base
15
15
 
16
16
  validates :token, presence: true
17
17
 
18
- def create_user(attributes)
19
- user = User.create(attributes.merge(
20
- role_names: role_names,
21
- creator: self.user,
22
- activated: true
23
- ))
24
- destroy if user.valid?
25
- user
26
- end
27
-
28
18
  private
29
19
 
30
20
  def ensure_token
data/app/models/page.rb CHANGED
@@ -1,32 +1,29 @@
1
- # encoding: utf-8
2
-
3
1
  class Page < ActiveRecord::Base
4
2
  include PagesCore::HumanizableParam
5
3
  include PagesCore::Sweepable
6
4
  include PagesCore::Taggable
7
5
 
6
+ include PagesCore::PageModel::Attachments
8
7
  include PagesCore::PageModel::Autopublishable
9
- include PagesCore::PageModel::Commentable
8
+ include PagesCore::PageModel::DatedPage
10
9
  include PagesCore::PageModel::Images
11
10
  include PagesCore::PageModel::Localizable
12
11
  include PagesCore::PageModel::Pathable
13
12
  include PagesCore::PageModel::Redirectable
14
- include PagesCore::PageModel::Searchable
15
13
  include PagesCore::PageModel::Sortable
16
14
  include PagesCore::PageModel::Status
17
15
  include PagesCore::PageModel::Tree
18
16
  include PagesCore::PageModel::Templateable
19
17
 
20
- belongs_to :author, class_name: "User", foreign_key: :user_id
18
+ belongs_to :author,
19
+ class_name: "User",
20
+ foreign_key: :user_id,
21
+ optional: true,
22
+ inverse_of: :pages
21
23
 
22
24
  has_many :page_categories, dependent: :destroy
23
25
  has_many :categories, through: :page_categories
24
26
 
25
- has_many :page_files,
26
- -> { order("position ASC") },
27
- class_name: "PageFile",
28
- dependent: :destroy
29
-
30
27
  validates(:unique_name,
31
28
  format: { with: /\A[\w\d_\-]+\z/,
32
29
  allow_nil: true,
@@ -38,11 +35,14 @@ class Page < ActiveRecord::Base
38
35
 
39
36
  before_validation :published_at
40
37
 
41
- scope :by_date, -> { order("published_at DESC") }
42
- scope :published, -> { where(status: 2, autopublish: false) }
43
- scope :visible, -> { where("status < 4") }
44
- scope :news_pages, -> { visible.where(news_page: true) }
45
- scope :pinned, -> { where(pinned: true) }
38
+ scope :by_date, -> { order("published_at DESC") }
39
+ scope :by_updated_at, -> { order("updated_at DESC") }
40
+ scope :published, -> { where(status: 2, autopublish: false) }
41
+ scope :hidden, -> { where(status: 3) }
42
+ scope :deleted, -> { where(status: 4) }
43
+ scope :visible, -> { where("status < 4") }
44
+ scope :news_pages, -> { visible.where(news_page: true) }
45
+ scope :pinned, -> { where(pinned: true) }
46
46
 
47
47
  class << self
48
48
  def archive_finder
@@ -51,7 +51,7 @@ class Page < ActiveRecord::Base
51
51
 
52
52
  # Find all published and feed enabled pages
53
53
  def enabled_feeds(locale, options = {})
54
- conditions = (options[:include_hidden]) ? "status IN (2,3)" : "status = 2"
54
+ conditions = options[:include_hidden] ? "status IN (2,3)" : "status = 2"
55
55
  Page.where(feed_enabled: true).where(conditions).localized(locale)
56
56
  end
57
57
  end
@@ -69,10 +69,6 @@ class Page < ActiveRecord::Base
69
69
  excerpt? && body?
70
70
  end
71
71
 
72
- def files
73
- page_files.in_locale(locale)
74
- end
75
-
76
72
  def headline_or_name
77
73
  headline? ? headline : name
78
74
  end
@@ -94,6 +90,6 @@ class Page < ActiveRecord::Base
94
90
  end
95
91
 
96
92
  def to_param
97
- humanized_param(name)
93
+ humanized_param(transliterated_name)
98
94
  end
99
95
  end
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  # # PageBuilder
4
2
  #
5
3
  # PageBuilder is a simple DSL for building pages, for use in ie. seeds.rb
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  class PageCategory < ActiveRecord::Base
4
2
  belongs_to :page
5
3
  belongs_to :category
@@ -0,0 +1,87 @@
1
+ require "fileutils"
2
+
3
+ class PageExporter
4
+ attr_reader :base_dir
5
+
6
+ def initialize(base_dir)
7
+ @base_dir = base_dir
8
+ end
9
+
10
+ def export
11
+ Page.roots.in_locale(I18n.default_locale).each { |p| export_page(p) }
12
+ puts
13
+ end
14
+
15
+ private
16
+
17
+ def export_page(page)
18
+ print "."
19
+ export_page_contents(page)
20
+ export_images(page)
21
+ export_files(page)
22
+ page.subpages.in_locale(I18n.default_locale).each { |p| export_page(p) }
23
+ end
24
+
25
+ def export_files(page)
26
+ path = page_path(page).join("files")
27
+ page.attachments.each do |file|
28
+ write_file(
29
+ path.join([file.content_hash, file.filename].join("-")),
30
+ file.data
31
+ )
32
+ end
33
+ end
34
+
35
+ def export_images(page)
36
+ path = page_path(page).join("images")
37
+ page.page_images.each do |pi|
38
+ write_file(
39
+ path.join([pi.image.content_hash, pi.image.filename].join("-")),
40
+ pi.image.data
41
+ )
42
+ end
43
+ end
44
+
45
+ def export_page_contents(page)
46
+ path = page_path(page)
47
+ page.locales.map { |l| page.localize(l) }.each do |p|
48
+ json = PageExportSerializer.new(p).to_json
49
+ basename = path.join("#{page_file_name(p)}.#{p.locale}")
50
+ write_file(path.join("page.#{p.locale}.json"), json)
51
+ write_file(path.join("page.#{p.locale}.yml"), JSON.parse(json).to_yaml)
52
+ write_file(path.join("page.#{p.locale}.txt"), text_page(p))
53
+ end
54
+ end
55
+
56
+ def page_path(page)
57
+ base_dir.join(page.self_and_ancestors
58
+ .reverse
59
+ .map { |p| page_path_segment(p) }.join("/pages/"))
60
+ end
61
+
62
+ def page_file_name(page)
63
+ [page.path_segment,
64
+ page.to_param[0..250]].reject(&:blank?).first
65
+ end
66
+
67
+ def page_path_segment(page)
68
+ prefix = page.deleted? ? "_deleted/" : ""
69
+ if page&.parent&.news_page?
70
+ prefix += "[#{page.published_at.to_date.iso8601}] "
71
+ end
72
+ prefix + page_file_name(page)
73
+ end
74
+
75
+ def text_page(page)
76
+ PagesCore::Templates::TemplateConfiguration
77
+ .all_blocks
78
+ .select { |attr| page.send("#{attr}?".to_sym) }
79
+ .map { |attr| ["-- #{attr}: --", page.send(attr).strip].join("\n\n") }
80
+ .join("\n\n\n")
81
+ end
82
+
83
+ def write_file(path, data)
84
+ FileUtils.mkdir_p(File.dirname(path))
85
+ File.open(path, "wb") { |fh| fh.write(data) }
86
+ end
87
+ end
@@ -1,72 +1,48 @@
1
- # encoding: utf-8
2
-
3
1
  class PageFile < ActiveRecord::Base
4
- include Dis::Model
2
+ include PagesCore::Sweepable
5
3
 
6
4
  belongs_to :page
7
-
8
- validates_data_presence
9
- validates :content_type, presence: true
10
- validates :filename, presence: true
11
- validates :content_length, presence: true
5
+ belongs_to :attachment
12
6
 
13
7
  acts_as_list scope: :page
14
8
 
15
- localizable do
16
- attribute :description
17
- end
9
+ accepts_nested_attributes_for :attachment
18
10
 
19
- before_validation :set_name_from_filename
11
+ localizable
20
12
 
21
- after_save ThinkingSphinx::RealTime.callback_for(:page_file)
13
+ delegate :published, to: :page
22
14
 
23
- class << self
24
- def formats
25
- {
26
- "audio/mpeg" => :mp3,
27
- "image/gif" => :gif,
28
- "image/jpeg" => :jpg,
29
- "image/jpg" => :jpg,
30
- "image/pjpeg" => :jpg,
31
- "image/png" => :png,
32
- "application/pdf" => :pdf
33
- }
34
- end
15
+ def attachment
16
+ super&.localize!(locale)
35
17
  end
36
18
 
37
- def format?
38
- content_type && self.class.formats.keys.include?(content_type)
19
+ def name
20
+ attachment&.name
39
21
  end
40
22
 
41
- def format
42
- self.class.formats[content_type]
23
+ def description
24
+ attachment&.description
43
25
  end
44
26
 
45
- def filename_extension
46
- if filename_extension?
47
- filename.match(/\.([^\.]+)$/)[1]
48
- else
49
- ""
50
- end
27
+ def filename
28
+ attachment&.filename
51
29
  end
52
30
 
53
- def filename_extension?
54
- filename =~ /\./
31
+ def format?
32
+ attachment&.format?
55
33
  end
56
34
 
57
- def to_param
58
- if filename_extension?
59
- "#{id}-#{content_hash}.#{filename_extension}"
60
- else
61
- "#{id}-#{content_hash}"
62
- end
35
+ def format
36
+ attachment&.format
63
37
  end
64
38
 
65
- delegate :published, to: :page
66
-
67
- private
39
+ def to_param
40
+ return id unless attachment
68
41
 
69
- def set_name_from_filename
70
- self.name = File.basename(filename, ".*") if filename? && !name?
42
+ if attachment.filename_extension?
43
+ "#{id}-#{attachment.content_hash}.#{attachment.filename_extension}"
44
+ else
45
+ "#{id}-#{attachment.content_hash}"
46
+ end
71
47
  end
72
48
  end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
-
3
1
  class PageImage < ActiveRecord::Base
2
+ include PagesCore::Sweepable
3
+
4
4
  belongs_to :page
5
5
  belongs_to_image :image
6
6
 
@@ -9,39 +9,10 @@ class PageImage < ActiveRecord::Base
9
9
  accepts_nested_attributes_for :image
10
10
  validates_associated :image
11
11
 
12
- acts_as_list scope: [:page, :primary]
12
+ acts_as_list scope: %i[page primary]
13
13
 
14
14
  localizable
15
15
 
16
- validate do |page_image|
17
- if page_image.page && page_image.page.page_images.count < 1
18
- page_image.primary = true
19
- end
20
- end
21
-
22
- after_save do |page_image|
23
- if page_image.primary_changed?
24
- # Make sure only one PageImage can be the primary,
25
- # then update image_id on the page.
26
- if page_image.primary?
27
- PageImage.where
28
- page_image.page
29
- .page_images
30
- .where("id != ?", page_image.id)
31
- .update_all(primary: false)
32
- page_image.page.update(image_id: page_image.image_id)
33
-
34
- # Clear image_id on the page if primary is toggled off
35
- else
36
- page_image.page.update(image_id: nil)
37
- end
38
- end
39
- end
40
-
41
- after_destroy do |page_image|
42
- page_image.page.update(image_id: nil) if page_image.primary?
43
- end
44
-
45
16
  class << self
46
17
  def cleanup!
47
18
  all.find_each do |page_image|
@@ -53,9 +24,4 @@ class PageImage < ActiveRecord::Base
53
24
  def image
54
25
  super.localize!(locale)
55
26
  end
56
-
57
- def to_json(options = {})
58
- options = { include: [:image] }.merge(options)
59
- super(options)
60
- end
61
27
  end