pages_core 3.4.3 → 3.5.1

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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +81 -15
  3. data/Rakefile +1 -1
  4. data/app/assets/javascripts/pages/admin.es6.jsx +19 -0
  5. data/app/assets/javascripts/pages/admin/components.es6.jsx +1 -0
  6. data/app/assets/javascripts/pages/admin/components/page_tree.es6.jsx +330 -0
  7. data/app/assets/javascripts/pages/admin/components/page_tree_actions.es6.jsx +8 -0
  8. data/app/assets/javascripts/pages/admin/components/page_tree_node.es6.jsx +374 -0
  9. data/app/assets/javascripts/pages/admin/components/page_tree_store.es6.jsx +161 -0
  10. data/app/assets/javascripts/pages/admin/features/content_tabs.es6.jsx +63 -0
  11. data/app/assets/javascripts/pages/admin/features/edit_page.es6.jsx +141 -0
  12. data/app/assets/javascripts/pages/admin/features/editable_image.es6.jsx +145 -0
  13. data/app/assets/javascripts/pages/admin/features/modal.es6.jsx +90 -0
  14. data/app/assets/javascripts/pages/admin/features/page_images.es6.jsx +338 -0
  15. data/app/assets/javascripts/pages/admin/features/rich_text.es6.jsx +124 -0
  16. data/app/assets/javascripts/pages/admin/features/tag_editor.es6.jsx +160 -0
  17. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.es6.jsx +21 -0
  18. data/app/assets/javascripts/pages/admin/lib/center_on_screen.es6.jsx +22 -0
  19. data/app/assets/javascripts/pages/admin/lib/tree.es6.jsx +294 -0
  20. data/app/assets/javascripts/pages/login_form.es6.jsx +21 -0
  21. data/app/assets/stylesheets/pages/admin.scss +148 -0
  22. data/app/assets/stylesheets/pages/admin/components/buttons.scss +5 -0
  23. data/app/assets/stylesheets/pages/admin/{editable_image.css.erb → components/editable_image.scss} +7 -8
  24. data/app/assets/stylesheets/pages/admin/components/forms.scss +71 -0
  25. data/app/assets/stylesheets/pages/admin/components/header.scss +169 -0
  26. data/app/assets/stylesheets/pages/admin/{images.css.scss.erb → components/images.scss} +6 -11
  27. data/app/assets/stylesheets/pages/admin/components/layout.scss +44 -0
  28. data/app/assets/stylesheets/pages/admin/components/links.scss +43 -0
  29. data/app/assets/stylesheets/pages/admin/components/list_table.scss +58 -0
  30. data/app/assets/stylesheets/pages/admin/{login.css.scss.erb → components/login.scss} +1 -1
  31. data/app/assets/stylesheets/pages/admin/{modal.css.erb → components/modal.scss} +3 -2
  32. data/app/assets/stylesheets/pages/admin/components/page_tree.scss +173 -0
  33. data/app/assets/stylesheets/pages/admin/{pagination.css.scss → components/pagination.scss} +13 -4
  34. data/app/assets/stylesheets/pages/admin/components/sidebar.scss +25 -0
  35. data/app/assets/stylesheets/pages/admin/{tag_editor.css.scss.erb → components/tag_editor.scss} +6 -0
  36. data/app/assets/stylesheets/pages/admin/components/textarea.scss +76 -0
  37. data/app/assets/stylesheets/pages/admin/controllers/pages.scss +196 -0
  38. data/app/assets/stylesheets/pages/admin/controllers/{users.css.erb → users.scss} +0 -0
  39. data/app/assets/stylesheets/pages/admin/mixins/breakpoints.scss +21 -0
  40. data/app/assets/stylesheets/pages/admin/mixins/clearfix.scss +7 -0
  41. data/app/assets/stylesheets/pages/admin/mixins/gradients.scss +7 -0
  42. data/app/assets/stylesheets/pages/admin/{print.css.erb → print.scss} +0 -0
  43. data/app/assets/stylesheets/pages/admin/vars.scss +8 -0
  44. data/app/controllers/admin/invites_controller.rb +10 -6
  45. data/app/controllers/admin/page_files_controller.rb +6 -8
  46. data/app/controllers/admin/page_images_controller.rb +14 -19
  47. data/app/controllers/admin/pages_controller.rb +44 -97
  48. data/app/controllers/admin/password_resets_controller.rb +7 -2
  49. data/app/controllers/concerns/pages_core/add_comments_controller.rb +67 -0
  50. data/app/controllers/concerns/pages_core/admin/news_page_controller.rb +58 -0
  51. data/app/controllers/concerns/pages_core/authentication.rb +1 -1
  52. data/app/controllers/concerns/pages_core/exception_handler.rb +44 -21
  53. data/app/controllers/concerns/pages_core/policies_helper.rb +10 -6
  54. data/app/controllers/concerns/pages_core/preview_pages_controller.rb +43 -0
  55. data/app/controllers/concerns/pages_core/process_titler.rb +2 -2
  56. data/app/controllers/concerns/pages_core/rss_controller.rb +25 -0
  57. data/app/controllers/concerns/pages_core/search_pages_controller.rb +40 -0
  58. data/app/controllers/errors_controller.rb +14 -2
  59. data/app/controllers/pages_core/admin_controller.rb +7 -5
  60. data/app/controllers/pages_core/frontend/page_files_controller.rb +5 -7
  61. data/app/controllers/pages_core/frontend/pages_controller.rb +41 -219
  62. data/app/controllers/pages_core/frontend_controller.rb +8 -2
  63. data/app/controllers/pages_core/sitemaps_controller.rb +5 -4
  64. data/app/formatters/pages_core/html_formatter.rb +33 -23
  65. data/app/helpers/admin/menu_helper.rb +12 -9
  66. data/app/helpers/admin/pages_helper.rb +40 -28
  67. data/app/helpers/pages_core/admin/admin_helper.rb +58 -56
  68. data/app/helpers/pages_core/admin/labelled_field_helper.rb +6 -7
  69. data/app/helpers/pages_core/admin/tag_editor_helper.rb +11 -9
  70. data/app/helpers/pages_core/application_helper.rb +13 -26
  71. data/app/helpers/pages_core/form_builder.rb +71 -134
  72. data/app/helpers/pages_core/head_tags_helper.rb +26 -168
  73. data/app/helpers/pages_core/images_helper.rb +3 -3
  74. data/app/helpers/pages_core/meta_tags_helper.rb +96 -0
  75. data/app/helpers/pages_core/open_graph_tags_helper.rb +51 -0
  76. data/app/helpers/pages_core/page_path_helper.rb +40 -0
  77. data/app/mailers/admin_mailer.rb +14 -14
  78. data/app/models/autopublisher.rb +2 -2
  79. data/app/models/category.rb +8 -8
  80. data/app/models/concerns/pages_core/has_roles.rb +2 -2
  81. data/app/models/concerns/pages_core/humanizable_param.rb +5 -5
  82. data/app/models/concerns/pages_core/page_model/autopublishable.rb +25 -0
  83. data/app/models/concerns/pages_core/page_model/commentable.rb +29 -0
  84. data/app/models/concerns/pages_core/page_model/images.rb +50 -0
  85. data/app/models/concerns/pages_core/page_model/localizable.rb +29 -0
  86. data/app/models/concerns/pages_core/page_model/pathable.rb +115 -0
  87. data/app/models/concerns/pages_core/page_model/redirectable.rb +36 -0
  88. data/app/models/concerns/pages_core/page_model/searchable.rb +41 -0
  89. data/app/models/concerns/pages_core/page_model/sortable.rb +54 -0
  90. data/app/models/concerns/pages_core/page_model/status.rb +50 -0
  91. data/app/models/concerns/pages_core/page_model/templateable.rb +82 -0
  92. data/app/models/concerns/pages_core/page_model/tree.rb +108 -0
  93. data/app/models/page.rb +30 -212
  94. data/app/models/page_builder.rb +4 -6
  95. data/app/models/page_category.rb +7 -0
  96. data/app/models/page_comment.rb +1 -1
  97. data/app/models/page_file.rb +4 -6
  98. data/app/models/page_image.rb +6 -7
  99. data/app/models/page_path.rb +46 -0
  100. data/app/models/password_reset_token.rb +5 -5
  101. data/app/models/role.rb +1 -1
  102. data/app/models/tag.rb +14 -16
  103. data/app/models/tagging.rb +2 -1
  104. data/app/models/user.rb +6 -7
  105. data/app/policies/page_policy.rb +8 -4
  106. data/app/policies/user_policy.rb +1 -1
  107. data/app/serializers/page_tree_serializer.rb +15 -0
  108. data/app/views/admin/invites/new.html.erb +2 -1
  109. data/app/views/admin/invites/show.html.erb +3 -4
  110. data/app/views/admin/pages/_edit_comments.html.erb +22 -6
  111. data/app/views/admin/pages/_edit_content.html.erb +4 -2
  112. data/app/views/admin/pages/_edit_images.html.erb +86 -75
  113. data/app/views/admin/pages/_edit_metadata.html.erb +22 -0
  114. data/app/views/admin/pages/_edit_options.html.erb +23 -15
  115. data/app/views/admin/pages/_pagelisting.html.erb +6 -6
  116. data/app/views/admin/pages/edit.html.erb +11 -6
  117. data/app/views/admin/pages/index.html.erb +12 -53
  118. data/app/views/admin/pages/new.html.erb +3 -3
  119. data/app/views/admin/pages/news.html.erb +1 -1
  120. data/app/views/admin_mailer/invite.text.erb +1 -1
  121. data/app/views/admin_mailer/password_reset.text.erb +1 -1
  122. data/app/views/errors/422.html.erb +7 -0
  123. data/app/views/errors/500_critical.html.erb +1 -1
  124. data/app/views/layouts/admin.html.erb +36 -32
  125. data/app/views/layouts/admin/_header.html.erb +2 -2
  126. data/config/locales/en.yml +38 -1
  127. data/config/routes.rb +40 -23
  128. data/db/migrate/20111219033112_create_pages_tables.rb +25 -29
  129. data/db/migrate/20121010055412_drop_removed_tables.rb +3 -3
  130. data/db/migrate/20130823133208_update_page_redirect_to.rb +0 -13
  131. data/db/migrate/20140203183900_create_roles.rb +5 -2
  132. data/db/migrate/20140920231700_convert_images_to_dis.rb +4 -2
  133. data/db/migrate/20150401131300_localize_images.rb +7 -8
  134. data/db/migrate/20151002174800_create_page_paths.rb +10 -0
  135. data/db/migrate/20151021103400_drop_binaries_table.rb +7 -0
  136. data/db/migrate/20151204151000_remove_page_content_order.rb +5 -0
  137. data/db/migrate/20160330220900_rename_pages_categories.rb +6 -0
  138. data/db/migrate/20160405202700_change_localization_limit.rb +9 -0
  139. data/lib/pages_core.rb +22 -27
  140. data/lib/pages_core/admin_menu_item.rb +16 -3
  141. data/lib/pages_core/archive_finder.rb +40 -13
  142. data/lib/pages_core/cache_sweeper.rb +72 -45
  143. data/lib/pages_core/configuration.rb +2 -2
  144. data/lib/pages_core/configuration/base.rb +4 -8
  145. data/lib/pages_core/configuration/pages.rb +6 -3
  146. data/lib/pages_core/engine.rb +23 -1
  147. data/lib/pages_core/extensions.rb +2 -2
  148. data/lib/pages_core/file_embedder.rb +40 -0
  149. data/lib/pages_core/page_path_constraint.rb +23 -0
  150. data/lib/pages_core/pages_plugin.rb +11 -0
  151. data/lib/pages_core/paginates.rb +3 -3
  152. data/lib/pages_core/plugin.rb +14 -8
  153. data/lib/pages_core/templates.rb +6 -6
  154. data/lib/pages_core/templates/block_configuration.rb +1 -1
  155. data/lib/pages_core/templates/configuration.rb +23 -24
  156. data/lib/pages_core/templates/configuration_handler.rb +1 -1
  157. data/lib/pages_core/templates/configuration_proxy.rb +7 -11
  158. data/lib/pages_core/templates/template_configuration.rb +55 -61
  159. data/lib/pages_core/version.rb +1 -1
  160. data/lib/rails/generators/pages_core/install/install_generator.rb +22 -48
  161. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +1 -1
  162. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +6 -3
  163. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +4 -1
  164. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +1 -1
  165. data/lib/tasks/pages.rake +4 -4
  166. data/lib/tasks/pages/page_paths.rake +12 -0
  167. data/template.rb +2 -2
  168. data/vendor/assets/javascripts/reflux.min.js +1 -0
  169. metadata +173 -85
  170. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  171. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  172. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  173. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  174. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  175. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  176. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  177. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  178. data/app/assets/javascripts/pages/admin.js.coffee +0 -54
  179. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +0 -4
  180. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +0 -139
  181. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +0 -9
  182. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +0 -47
  183. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +0 -122
  184. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +0 -66
  185. data/app/assets/javascripts/pages/admin/features/page_images.js +0 -329
  186. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +0 -40
  187. data/app/assets/javascripts/pages/admin/features/tag_editor.js +0 -159
  188. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +0 -17
  189. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +0 -21
  190. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +0 -57
  191. data/app/assets/javascripts/pages/login_form.js.coffee +0 -17
  192. data/app/assets/stylesheets/pages/admin.css.erb +0 -404
  193. data/app/assets/stylesheets/pages/admin/buttons.css.erb +0 -5
  194. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +0 -94
  195. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +0 -58
  196. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +0 -178
  197. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +0 -73
  198. data/app/assets/stylesheets/pages/admin/header.css.erb +0 -129
  199. data/app/assets/stylesheets/pages/admin/links.css.erb +0 -34
  200. data/app/assets/stylesheets/pages/admin/list_table.css.erb +0 -56
  201. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +0 -39
  202. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +0 -18
  203. data/app/assets/stylesheets/pages/admin/textarea.css.erb +0 -55
  204. data/app/models/concerns/pages_core/page_tree.rb +0 -85
  205. data/app/models/concerns/pages_core/searchable_page.rb +0 -33
  206. data/app/models/concerns/pages_core/templateable.rb +0 -85
  207. data/app/models/localization.rb +0 -27
  208. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +0 -15
  209. data/lib/pages_core/localizable.rb +0 -49
  210. data/lib/pages_core/localizable/active_record_extension.rb +0 -41
  211. data/lib/pages_core/localizable/class_methods.rb +0 -51
  212. data/lib/pages_core/localizable/configuration.rb +0 -50
  213. data/lib/pages_core/localizable/instance_methods.rb +0 -130
  214. data/lib/pages_core/localizable/localizer.rb +0 -72
  215. data/lib/pages_core/localizable/scope_extension.rb +0 -22
@@ -4,21 +4,21 @@ module PagesCore
4
4
  module ImagesHelper
5
5
  include DynamicImage::Helper
6
6
 
7
- def dynamic_image_tag(record_or_array, options={})
7
+ def dynamic_image_tag(record_or_array, options = {})
8
8
  super(
9
9
  record_or_array,
10
10
  extract_alt_text(record_or_array).merge(options)
11
11
  )
12
12
  end
13
13
 
14
- def original_dynamic_image_tag(record_or_array, options={})
14
+ def original_dynamic_image_tag(record_or_array, options = {})
15
15
  super(
16
16
  record_or_array,
17
17
  extract_alt_text(record_or_array).merge(options)
18
18
  )
19
19
  end
20
20
 
21
- def uncropped_dynamic_image_tag(record_or_array, options={})
21
+ def uncropped_dynamic_image_tag(record_or_array, options = {})
22
22
  super(
23
23
  record_or_array,
24
24
  extract_alt_text(record_or_array).merge(options)
@@ -0,0 +1,96 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module MetaTagsHelper
5
+ # Sets a default image to use for meta tags. Supports
6
+ # both paths and Image objects.
7
+ #
8
+ # default_meta_image image_path("facebook-share.png")
9
+ # default_meta_image root_page.image
10
+ #
11
+ def default_meta_image(*args)
12
+ if args.any?
13
+ @default_meta_image = args.first
14
+ else
15
+ @default_meta_image
16
+ end
17
+ end
18
+
19
+ # Returns true if default meta image has been set.
20
+ def default_meta_image?
21
+ default_meta_image ? true : false
22
+ end
23
+
24
+ # Sets a description for meta tags.
25
+ #
26
+ # meta_description "This is an awesome site"
27
+ #
28
+ def meta_description(*args)
29
+ if args.any?
30
+ @meta_description = args.first
31
+ else
32
+ description = @meta_description
33
+ description ||= @page.meta_description if @page.try(&:meta_description?)
34
+ description ||= @page.excerpt if @page && !@page.excerpt.empty?
35
+ strip_tags(description)
36
+ end
37
+ end
38
+
39
+ # Returns true if meta description has been set.
40
+ def meta_description?
41
+ !meta_description.blank?
42
+ end
43
+
44
+ # Sets an image to use for meta tags. Supports
45
+ # both paths and Image objects.
46
+ #
47
+ # meta_image image_path("facebook-share.png")
48
+ # meta_image @page.image
49
+ #
50
+ def meta_image(*args)
51
+ if args.any?
52
+ @meta_image = args.first
53
+ else
54
+ image = find_meta_image
55
+ if image.is_a?(Image)
56
+ dynamic_image_url(image, size: "1200x", only_path: false)
57
+ else
58
+ image
59
+ end
60
+ end
61
+ end
62
+
63
+ # Returns true if meta image has been set.
64
+ def meta_image?
65
+ !meta_image.blank? || default_meta_image?
66
+ end
67
+
68
+ # Sets keywords for meta tags.
69
+ #
70
+ # meta_keywords "cialis viagra"
71
+ #
72
+ def meta_keywords(*args)
73
+ if args.any?
74
+ @meta_keywords = Array(args.first).join(", ")
75
+ else
76
+ keywords = @meta_keywords
77
+ keywords ||= @page.tag_list if @page && @page.tags.any?
78
+ strip_tags(keywords)
79
+ end
80
+ end
81
+
82
+ # Returns true if meta keywords have been set.
83
+ def meta_keywords?
84
+ !meta_keywords.blank?
85
+ end
86
+
87
+ private
88
+
89
+ def find_meta_image
90
+ @meta_image ||
91
+ @page.try(&:meta_image) ||
92
+ @page.try(&:image) ||
93
+ default_meta_image
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module OpenGraphTagsHelper
5
+ def open_graph_properties
6
+ @_open_graph_properties ||= {}
7
+ end
8
+
9
+ # Outputs Open Graph tags for Facebook.
10
+ def open_graph_tags
11
+ properties = default_open_graph_properties.merge(open_graph_properties)
12
+ safe_join(
13
+ properties
14
+ .delete_if { |_, content| content.nil? }
15
+ .map do |name, content|
16
+ tag(:meta, property: "og:#{name}", content: content)
17
+ end,
18
+ "\n"
19
+ )
20
+ end
21
+
22
+ private
23
+
24
+ def default_open_graph_title
25
+ if @page.try(:open_graph_title?)
26
+ @page.open_graph_title
27
+ else
28
+ document_title
29
+ end
30
+ end
31
+
32
+ def default_open_graph_description
33
+ if @page.try(:open_graph_description?)
34
+ @page.open_graph_description
35
+ elsif meta_description?
36
+ meta_description
37
+ end
38
+ end
39
+
40
+ def default_open_graph_properties
41
+ {
42
+ type: "website",
43
+ site_name: PagesCore.config(:site_name),
44
+ title: default_open_graph_title,
45
+ image: (meta_image if meta_image?),
46
+ description: default_open_graph_description,
47
+ url: request.url
48
+ }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module PagePathHelper
5
+ def page_path(locale, page, options = {})
6
+ page.localize(locale) do |p|
7
+ if p.full_path? && PagesCore.config.localizations?
8
+ "/#{locale}/" + URI.escape(p.full_path)
9
+ elsif p.full_path?
10
+ "/" + URI.escape(p.full_path)
11
+ else
12
+ super(locale, p, options)
13
+ end
14
+ end
15
+ end
16
+
17
+ def page_url(page_or_locale, page = nil, opts = {})
18
+ locale, page = page_url_locale_and_page(page_or_locale, page, opts)
19
+ page.localize(locale) do |p|
20
+ if p.redirects?
21
+ p.redirect_path(locale: locale)
22
+ elsif p.full_path
23
+ "#{request.protocol}#{request.host_with_port}" + page_path(locale, p)
24
+ else
25
+ super(locale, p, opts)
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def page_url_locale_and_page(page_or_locale, page, opts)
33
+ return [page_or_locale, page] if page
34
+ ActiveSupport::Deprecation.warn(
35
+ "Calling page_url without locale is deprecated"
36
+ )
37
+ [(opts[:locale] || @locale), page_or_locale]
38
+ end
39
+ end
40
+ end
@@ -1,21 +1,23 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class AdminMailer < ActionMailer::Base
4
- before_action :default_headers
5
- default from: proc { "\"Pages\" <support@manualdesign.no>" }
4
+ default from: proc { "\"Pages\" <support@kord.no>" }
6
5
 
7
6
  def error_report(error_report, from, description)
8
- @error_report, @from, @description = error_report, from, description
7
+ @error_report = error_report
8
+ @from = from
9
+ @description = description
9
10
  short_message = @error_report[:message].gsub(/[\s\n]+/, " ")[0..80]
10
11
  mail(
11
- to: "system+error@manualdesign.no",
12
- from: "\"Error reports\" <system+error@manualdesign.no>",
12
+ to: "system+error@kord.no",
13
+ from: "\"Error reports\" <system+error@kord.no>",
13
14
  subject: "[#{PagesCore.config(:site_name)}] Error: #{short_message}"
14
15
  )
15
16
  end
16
17
 
17
18
  def password_reset(user, url)
18
- @user, @url = user, url
19
+ @user = user
20
+ @url = url
19
21
  mail(
20
22
  to: @user.email,
21
23
  subject: "Reset your password on #{PagesCore.config(:site_name)}"
@@ -23,7 +25,10 @@ class AdminMailer < ActionMailer::Base
23
25
  end
24
26
 
25
27
  def comment_notification(recipient, page, comment, url)
26
- @recipient, @page, @comment, @url = recipient, page, comment, url
28
+ @recipient = recipient
29
+ @page = page
30
+ @comment = comment
31
+ @url = url
27
32
  mail(
28
33
  to: recipient,
29
34
  subject: "[#{PagesCore.config(:site_name)}] New comment on #{@page.name}"
@@ -31,16 +36,11 @@ class AdminMailer < ActionMailer::Base
31
36
  end
32
37
 
33
38
  def invite(invite, url)
34
- @invite, @url = invite, url
39
+ @invite = invite
40
+ @url = url
35
41
  mail(
36
42
  to: @invite.email,
37
43
  subject: "#{PagesCore.config(:site_name)} has invited you to Pages"
38
44
  )
39
45
  end
40
-
41
- private
42
-
43
- def default_headers
44
- headers("X-MC-Subaccount" => "pages")
45
- end
46
46
  end
@@ -10,7 +10,7 @@ class Autopublisher
10
10
  end
11
11
  end
12
12
  end
13
- self.queue!
13
+ queue!
14
14
  end
15
15
 
16
16
  def queue!
@@ -27,7 +27,7 @@ class Autopublisher
27
27
  end
28
28
 
29
29
  def due_pages
30
- queued_pages.where("published_at < ?", (Time.now + 2.minutes))
30
+ queued_pages.where("published_at < ?", (Time.now.utc + 2.minutes))
31
31
  end
32
32
  end
33
33
  end
@@ -1,8 +1,9 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class Category < ActiveRecord::Base
4
- has_and_belongs_to_many :pages, join_table: "pages_categories"
5
- validates_presence_of :name
4
+ has_many :page_categories, dependent: :destroy
5
+ has_many :pages, through: :page_categories
6
+ validates :name, presence: true
6
7
  acts_as_list
7
8
 
8
9
  before_save :set_slug
@@ -13,11 +14,10 @@ class Category < ActiveRecord::Base
13
14
  private
14
15
 
15
16
  def set_slug
16
- self.slug = name
17
- .downcase
18
- .gsub(/[^\w\s]/, "")
19
- .split(/[^\w\d\-]+/)
20
- .compact
21
- .join("-")
17
+ self.slug = name.downcase
18
+ .gsub(/[^\w\s]/, "")
19
+ .split(/[^\w\d\-]+/)
20
+ .compact
21
+ .join("-")
22
22
  end
23
23
  end
@@ -5,7 +5,7 @@ module PagesCore
5
5
  def role?(role_name)
6
6
  role_names.include?(role_name.to_s)
7
7
  end
8
- alias_method :has_role?, :role?
8
+ alias has_role? role?
9
9
 
10
10
  def role_names
11
11
  roles.map(&:name)
@@ -14,7 +14,7 @@ module PagesCore
14
14
  def role_names=(names)
15
15
  new_roles = names.map do |name|
16
16
  if role?(name)
17
- roles.where(name: name).first
17
+ roles.find_by(name: name)
18
18
  else
19
19
  roles.new(name: name)
20
20
  end
@@ -7,11 +7,11 @@ module PagesCore
7
7
  def humanized_param(slug)
8
8
  return id.to_s unless slug && !slug.blank?
9
9
  "#{id}-" + slug
10
- .gsub(/[\[\{]/, "(")
11
- .gsub(/[\]\}]/, ")")
12
- .gsub(/[^[[:alnum:]]()\-]+/, "-")
13
- .gsub(/[\-]{2,}/, "-")
14
- .gsub(/(^\-|\-$)/, "")
10
+ .gsub(/[\[\{]/, "(")
11
+ .gsub(/[\]\}]/, ")")
12
+ .gsub(/[^[[:alnum:]]()\-]+/, "-")
13
+ .gsub(/[\-]{2,}/, "-")
14
+ .gsub(/(^\-|\-$)/, "")
15
15
  end
16
16
  end
17
17
  end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module PageModel
5
+ module Autopublishable
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ before_validation :set_autopublish
10
+ after_save :queue_autopublisher
11
+ end
12
+
13
+ private
14
+
15
+ def set_autopublish
16
+ self.autopublish = published_at? && published_at > Time.now.utc
17
+ true
18
+ end
19
+
20
+ def queue_autopublisher
21
+ Autopublisher.queue! if autopublish?
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module PageModel
5
+ module Commentable
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ has_many :comments, class_name: "PageComment", dependent: :destroy
10
+ end
11
+
12
+ def comments_closed_after_time?
13
+ if PagesCore.config.close_comments_after.nil?
14
+ false
15
+ else
16
+ (Time.now.utc - published_at) > PagesCore.config.close_comments_after
17
+ end
18
+ end
19
+
20
+ def comments_allowed?
21
+ if comments_closed_after_time?
22
+ false
23
+ else
24
+ self[:comments_allowed]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module PageModel
5
+ module Images
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ belongs_to_image :image
10
+ belongs_to_image :meta_image, class_name: "Image"
11
+ has_many :page_images, -> { order("position") }
12
+ has_many(
13
+ :images,
14
+ -> { where("`page_images`.`primary` = ?", false).order("position") },
15
+ through: :page_images
16
+ )
17
+
18
+ after_save :ensure_page_images_contains_primary_image
19
+ end
20
+
21
+ def image?
22
+ image_id?
23
+ end
24
+
25
+ def image
26
+ super.try { |i| i.localize(locale) }
27
+ end
28
+
29
+ def images
30
+ super.in_locale(locale)
31
+ end
32
+
33
+ def page_images
34
+ super.in_locale(locale)
35
+ end
36
+
37
+ private
38
+
39
+ def ensure_page_images_contains_primary_image
40
+ return if !image_id? || !image_id_changed?
41
+ page_image = page_images.find_by(image_id: image_id)
42
+ if page_image
43
+ page_image.update(primary: true)
44
+ else
45
+ page_images.create(image_id: image_id, primary: true)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end