pages_core 3.4.2

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 (271) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +29 -0
  3. data/Rakefile +10 -0
  4. data/app/assets/images/pages/admin/description-bg.gif +0 -0
  5. data/app/assets/images/pages/admin/drag-handle.gif +0 -0
  6. data/app/assets/images/pages/admin/drag-icon.png +0 -0
  7. data/app/assets/images/pages/admin/flash-error-bg.gif +0 -0
  8. data/app/assets/images/pages/admin/formelement-bg.gif +0 -0
  9. data/app/assets/images/pages/admin/header-tab-current-bg.gif +0 -0
  10. data/app/assets/images/pages/admin/icon.png +0 -0
  11. data/app/assets/images/pages/admin/image-editor-bg.png +0 -0
  12. data/app/assets/images/pages/admin/list-table-pin-blue.gif +0 -0
  13. data/app/assets/images/pages/admin/list-table-pin-disabled.gif +0 -0
  14. data/app/assets/images/pages/admin/list-table-pin-green.gif +0 -0
  15. data/app/assets/images/pages/admin/list-table-pin-red.gif +0 -0
  16. data/app/assets/images/pages/admin/list-table-pin-yellow.gif +0 -0
  17. data/app/assets/images/pages/admin/list-table-td-bg.gif +0 -0
  18. data/app/assets/images/pages/admin/loading-modal.gif +0 -0
  19. data/app/assets/images/pages/admin/sidebar-bg.gif +0 -0
  20. data/app/assets/images/pages/admin/textarea_controls.gif +0 -0
  21. data/app/assets/images/pages/admin/warning-icon.gif +0 -0
  22. data/app/assets/images/pages/favicon.gif +0 -0
  23. data/app/assets/images/pages/feed-icon-14x14.png +0 -0
  24. data/app/assets/javascripts/pages/admin/controllers/base.js.coffee +4 -0
  25. data/app/assets/javascripts/pages/admin/controllers/pages_controller.js.coffee +139 -0
  26. data/app/assets/javascripts/pages/admin/controllers/users_controller.js.coffee +9 -0
  27. data/app/assets/javascripts/pages/admin/features/content_tabs.js.coffee +47 -0
  28. data/app/assets/javascripts/pages/admin/features/editable_image.js.coffee.erb +122 -0
  29. data/app/assets/javascripts/pages/admin/features/modal.js.coffee +66 -0
  30. data/app/assets/javascripts/pages/admin/features/page_images.js +329 -0
  31. data/app/assets/javascripts/pages/admin/features/rich_text.js.coffee +40 -0
  32. data/app/assets/javascripts/pages/admin/features/tag_editor.js +159 -0
  33. data/app/assets/javascripts/pages/admin/lib/ajax_extensions.js.coffee +17 -0
  34. data/app/assets/javascripts/pages/admin/lib/center_on_screen.js.coffee +21 -0
  35. data/app/assets/javascripts/pages/admin/lib/jrichtextarea.js +57 -0
  36. data/app/assets/javascripts/pages/admin.js.coffee +54 -0
  37. data/app/assets/javascripts/pages/login_form.js.coffee +17 -0
  38. data/app/assets/stylesheets/pages/admin/buttons.css.erb +5 -0
  39. data/app/assets/stylesheets/pages/admin/controllers/artists.css.erb +94 -0
  40. data/app/assets/stylesheets/pages/admin/controllers/files.css.erb +58 -0
  41. data/app/assets/stylesheets/pages/admin/controllers/pages.css.scss.erb +178 -0
  42. data/app/assets/stylesheets/pages/admin/controllers/users.css.erb +3 -0
  43. data/app/assets/stylesheets/pages/admin/editable_image.css.erb +19 -0
  44. data/app/assets/stylesheets/pages/admin/forms.css.scss.erb +73 -0
  45. data/app/assets/stylesheets/pages/admin/header.css.erb +129 -0
  46. data/app/assets/stylesheets/pages/admin/images.css.scss.erb +160 -0
  47. data/app/assets/stylesheets/pages/admin/links.css.erb +34 -0
  48. data/app/assets/stylesheets/pages/admin/list_table.css.erb +56 -0
  49. data/app/assets/stylesheets/pages/admin/login.css.scss.erb +32 -0
  50. data/app/assets/stylesheets/pages/admin/modal.css.erb +14 -0
  51. data/app/assets/stylesheets/pages/admin/pagination.css.scss +22 -0
  52. data/app/assets/stylesheets/pages/admin/print.css.erb +17 -0
  53. data/app/assets/stylesheets/pages/admin/sidebar.css.erb +39 -0
  54. data/app/assets/stylesheets/pages/admin/sortable_images.css.erb +18 -0
  55. data/app/assets/stylesheets/pages/admin/tag_editor.css.scss.erb +48 -0
  56. data/app/assets/stylesheets/pages/admin/textarea.css.erb +55 -0
  57. data/app/assets/stylesheets/pages/admin.css.erb +404 -0
  58. data/app/assets/stylesheets/pages/errors.css +126 -0
  59. data/app/controller_dummies/admin/admin_controller.rb +6 -0
  60. data/app/controller_dummies/application_controller.rb +6 -0
  61. data/app/controller_dummies/frontend_controller.rb +4 -0
  62. data/app/controller_dummies/images_controller.rb +4 -0
  63. data/app/controller_dummies/page_files_controller.rb +4 -0
  64. data/app/controller_dummies/pages_controller.rb +4 -0
  65. data/app/controller_dummies/sitemaps_controller.rb +4 -0
  66. data/app/controllers/admin/categories_controller.rb +57 -0
  67. data/app/controllers/admin/images_controller.rb +48 -0
  68. data/app/controllers/admin/invites_controller.rb +79 -0
  69. data/app/controllers/admin/page_comments_controller.rb +61 -0
  70. data/app/controllers/admin/page_files_controller.rb +81 -0
  71. data/app/controllers/admin/page_images_controller.rb +116 -0
  72. data/app/controllers/admin/pages_controller.rb +179 -0
  73. data/app/controllers/admin/password_resets_controller.rb +83 -0
  74. data/app/controllers/admin/users_controller.rb +102 -0
  75. data/app/controllers/concerns/pages_core/authentication.rb +48 -0
  76. data/app/controllers/concerns/pages_core/domain_based_cache.rb +28 -0
  77. data/app/controllers/concerns/pages_core/exception_handler.rb +114 -0
  78. data/app/controllers/concerns/pages_core/policies_helper.rb +40 -0
  79. data/app/controllers/concerns/pages_core/process_titler.rb +44 -0
  80. data/app/controllers/errors_controller.rb +45 -0
  81. data/app/controllers/pages_core/admin_controller.rb +109 -0
  82. data/app/controllers/pages_core/application_controller.rb +31 -0
  83. data/app/controllers/pages_core/frontend/page_files_controller.rb +42 -0
  84. data/app/controllers/pages_core/frontend/pages_controller.rb +308 -0
  85. data/app/controllers/pages_core/frontend_controller.rb +34 -0
  86. data/app/controllers/pages_core/images_controller.rb +15 -0
  87. data/app/controllers/pages_core/sitemaps_controller.rb +73 -0
  88. data/app/controllers/sessions_controller.rb +38 -0
  89. data/app/formatters/pages_core/html_formatter.rb +86 -0
  90. data/app/helpers/admin/admin_helper.rb +7 -0
  91. data/app/helpers/admin/menu_helper.rb +65 -0
  92. data/app/helpers/admin/pages_helper.rb +74 -0
  93. data/app/helpers/application_helper.rb +5 -0
  94. data/app/helpers/frontend_helper.rb +5 -0
  95. data/app/helpers/pages_core/admin/admin_helper.rb +108 -0
  96. data/app/helpers/pages_core/admin/labelled_field_helper.rb +73 -0
  97. data/app/helpers/pages_core/admin/tag_editor_helper.rb +46 -0
  98. data/app/helpers/pages_core/application_helper.rb +65 -0
  99. data/app/helpers/pages_core/form_builder.rb +187 -0
  100. data/app/helpers/pages_core/frontend_helper.rb +21 -0
  101. data/app/helpers/pages_core/head_tags_helper.rb +270 -0
  102. data/app/helpers/pages_core/images_helper.rb +36 -0
  103. data/app/helpers/pages_core/login_helper.rb +14 -0
  104. data/app/indices/page_file_index.rb +9 -0
  105. data/app/indices/page_index.rb +29 -0
  106. data/app/indices/user_index.rb +11 -0
  107. data/app/jobs/pages_core/autopublish_job.rb +11 -0
  108. data/app/jobs/pages_core/sweep_cache_job.rb +11 -0
  109. data/app/mailers/admin_mailer.rb +46 -0
  110. data/app/models/autopublisher.rb +33 -0
  111. data/app/models/category.rb +23 -0
  112. data/app/models/concerns/pages_core/has_roles.rb +25 -0
  113. data/app/models/concerns/pages_core/humanizable_param.rb +17 -0
  114. data/app/models/concerns/pages_core/page_tree.rb +85 -0
  115. data/app/models/concerns/pages_core/searchable_page.rb +33 -0
  116. data/app/models/concerns/pages_core/sweepable.rb +23 -0
  117. data/app/models/concerns/pages_core/taggable.rb +46 -0
  118. data/app/models/concerns/pages_core/templateable.rb +85 -0
  119. data/app/models/image.rb +23 -0
  120. data/app/models/invite.rb +33 -0
  121. data/app/models/invite_role.rb +11 -0
  122. data/app/models/localization.rb +27 -0
  123. data/app/models/page.rb +281 -0
  124. data/app/models/page_builder.rb +61 -0
  125. data/app/models/page_comment.rb +18 -0
  126. data/app/models/page_file.rb +74 -0
  127. data/app/models/page_image.rb +62 -0
  128. data/app/models/password_reset_token.rb +38 -0
  129. data/app/models/role.rb +51 -0
  130. data/app/models/tag.rb +64 -0
  131. data/app/models/tagging.rb +22 -0
  132. data/app/models/user.rb +131 -0
  133. data/app/policies/invite_policy.rb +29 -0
  134. data/app/policies/page_file_policy.rb +25 -0
  135. data/app/policies/page_image_policy.rb +25 -0
  136. data/app/policies/page_policy.rb +33 -0
  137. data/app/policies/policy.rb +64 -0
  138. data/app/policies/user_policy.rb +49 -0
  139. data/app/serializers/admin/image_serializer.rb +10 -0
  140. data/app/serializers/admin/page_image_serializer.rb +6 -0
  141. data/app/serializers/page_image_serializer.rb +38 -0
  142. data/app/serializers/page_serializer.rb +21 -0
  143. data/app/views/admin/invites/new.html.erb +16 -0
  144. data/app/views/admin/invites/show.html.erb +25 -0
  145. data/app/views/admin/pages/_edit_comments.html.erb +21 -0
  146. data/app/views/admin/pages/_edit_content.html.erb +10 -0
  147. data/app/views/admin/pages/_edit_images.html.erb +84 -0
  148. data/app/views/admin/pages/_edit_metadata.html.erb +24 -0
  149. data/app/views/admin/pages/_edit_options.html.erb +72 -0
  150. data/app/views/admin/pages/_pagelisting.html.erb +63 -0
  151. data/app/views/admin/pages/edit.html.erb +161 -0
  152. data/app/views/admin/pages/index.html.erb +67 -0
  153. data/app/views/admin/pages/new.html.erb +48 -0
  154. data/app/views/admin/pages/news.html.erb +69 -0
  155. data/app/views/admin/password_resets/show.html.erb +24 -0
  156. data/app/views/admin/users/_access_control.html.erb +14 -0
  157. data/app/views/admin/users/_list.html.erb +62 -0
  158. data/app/views/admin/users/_login_form.html.erb +47 -0
  159. data/app/views/admin/users/deactivated.html.erb +12 -0
  160. data/app/views/admin/users/edit.html.erb +54 -0
  161. data/app/views/admin/users/index.html.erb +27 -0
  162. data/app/views/admin/users/login.html.erb +15 -0
  163. data/app/views/admin/users/new.html.erb +23 -0
  164. data/app/views/admin/users/new_password.html.erb +19 -0
  165. data/app/views/admin/users/show.html.erb +64 -0
  166. data/app/views/admin_mailer/comment_notification.text.erb +7 -0
  167. data/app/views/admin_mailer/error_report.html.erb +70 -0
  168. data/app/views/admin_mailer/invite.text.erb +9 -0
  169. data/app/views/admin_mailer/password_reset.text.erb +13 -0
  170. data/app/views/errors/403.html.erb +6 -0
  171. data/app/views/errors/404.html.erb +11 -0
  172. data/app/views/errors/405.html.erb +4 -0
  173. data/app/views/errors/500.html.erb +19 -0
  174. data/app/views/errors/500_critical.html.erb +7 -0
  175. data/app/views/errors/_generic_help.html.erb +21 -0
  176. data/app/views/errors/report.html.erb +4 -0
  177. data/app/views/feeds/pages.rss.builder +39 -0
  178. data/app/views/layouts/admin/_analytics.html.erb +18 -0
  179. data/app/views/layouts/admin/_header.html.erb +37 -0
  180. data/app/views/layouts/admin.html.erb +79 -0
  181. data/app/views/layouts/errors.html.erb +23 -0
  182. data/app/views/sitemaps/show.xml.builder +9 -0
  183. data/config/locales/en.yml +6 -0
  184. data/config/removed_migrations.yml +60 -0
  185. data/config/routes.rb +127 -0
  186. data/db/migrate/20111219033112_create_pages_tables.rb +281 -0
  187. data/db/migrate/20120627033112_rename_textbits.rb +19 -0
  188. data/db/migrate/20121010055412_drop_removed_tables.rb +83 -0
  189. data/db/migrate/20130130053932_add_queue_to_delayed_jobs.rb +11 -0
  190. data/db/migrate/20130303053932_remove_filter_from_localizations.rb +11 -0
  191. data/db/migrate/20130303160632_remove_imagesets.rb +24 -0
  192. data/db/migrate/20130303161732_remove_sms_subscribers.rb +16 -0
  193. data/db/migrate/20130823133208_update_page_redirect_to.rb +25 -0
  194. data/db/migrate/20140203183900_create_roles.rb +63 -0
  195. data/db/migrate/20140414150500_change_locale_names.rb +13 -0
  196. data/db/migrate/20140515130100_remove_sphinx_deltas.rb +15 -0
  197. data/db/migrate/20140604142100_remove_openid_url.rb +9 -0
  198. data/db/migrate/20140920231700_convert_images_to_dis.rb +79 -0
  199. data/db/migrate/20140922124600_convert_page_files_to_dis.rb +50 -0
  200. data/db/migrate/20141004003100_create_password_reset_tokens.rb +10 -0
  201. data/db/migrate/20141006181300_remove_user_cruft.rb +11 -0
  202. data/db/migrate/20141007173000_create_invites.rb +16 -0
  203. data/db/migrate/20150204130800_update_delayed_job_table.rb +9 -0
  204. data/db/migrate/20150401131300_localize_images.rb +39 -0
  205. data/db/migrate/20150520174300_add_meta_image_to_page.rb +5 -0
  206. data/db/migrate/20150904164200_add_pinned_to_tags.rb +5 -0
  207. data/lib/pages_core/admin_menu_item.rb +22 -0
  208. data/lib/pages_core/archive_finder.rb +75 -0
  209. data/lib/pages_core/cache_sweeper.rb +112 -0
  210. data/lib/pages_core/configuration/base.rb +85 -0
  211. data/lib/pages_core/configuration/pages.rb +23 -0
  212. data/lib/pages_core/configuration.rb +9 -0
  213. data/lib/pages_core/engine.rb +27 -0
  214. data/lib/pages_core/extensions/hash_extensions.rb +23 -0
  215. data/lib/pages_core/extensions/string_extensions.rb +17 -0
  216. data/lib/pages_core/extensions.rb +4 -0
  217. data/lib/pages_core/localizable/active_record_extension.rb +41 -0
  218. data/lib/pages_core/localizable/class_methods.rb +51 -0
  219. data/lib/pages_core/localizable/configuration.rb +50 -0
  220. data/lib/pages_core/localizable/instance_methods.rb +130 -0
  221. data/lib/pages_core/localizable/localizer.rb +72 -0
  222. data/lib/pages_core/localizable/scope_extension.rb +22 -0
  223. data/lib/pages_core/localizable.rb +49 -0
  224. data/lib/pages_core/pages_plugin.rb +14 -0
  225. data/lib/pages_core/paginates.rb +102 -0
  226. data/lib/pages_core/plugin.rb +118 -0
  227. data/lib/pages_core/templates/block_configuration.rb +17 -0
  228. data/lib/pages_core/templates/configuration.rb +81 -0
  229. data/lib/pages_core/templates/configuration_handler.rb +62 -0
  230. data/lib/pages_core/templates/configuration_proxy.rb +28 -0
  231. data/lib/pages_core/templates/controller_actions.rb +32 -0
  232. data/lib/pages_core/templates/template_configuration.rb +198 -0
  233. data/lib/pages_core/templates.rb +53 -0
  234. data/lib/pages_core/version.rb +5 -0
  235. data/lib/pages_core.rb +89 -0
  236. data/lib/rails/generators/pages_core/frontend/frontend_generator.rb +68 -0
  237. data/lib/rails/generators/pages_core/frontend/templates/application.css.scss.erb +3 -0
  238. data/lib/rails/generators/pages_core/frontend/templates/application.js.erb +16 -0
  239. data/lib/rails/generators/pages_core/frontend/templates/base.css.scss.erb +3 -0
  240. data/lib/rails/generators/pages_core/frontend/templates/breakpoints.css.scss.erb +24 -0
  241. data/lib/rails/generators/pages_core/frontend/templates/hidpi.css.scss.erb +8 -0
  242. data/lib/rails/generators/pages_core/frontend/templates/layout.html.erb +15 -0
  243. data/lib/rails/generators/pages_core/frontend/templates/normalize.css.erb +425 -0
  244. data/lib/rails/generators/pages_core/install/install_generator.rb +135 -0
  245. data/lib/rails/generators/pages_core/install/templates/active_job_initializer.rb +1 -0
  246. data/lib/rails/generators/pages_core/install/templates/application_controller.rb +11 -0
  247. data/lib/rails/generators/pages_core/install/templates/application_helper.rb +5 -0
  248. data/lib/rails/generators/pages_core/install/templates/cache_sweeper_initializer.rb +11 -0
  249. data/lib/rails/generators/pages_core/install/templates/default_page_template.html.erb +5 -0
  250. data/lib/rails/generators/pages_core/install/templates/delayed_job +7 -0
  251. data/lib/rails/generators/pages_core/install/templates/delayed_job_initializer.rb +3 -0
  252. data/lib/rails/generators/pages_core/install/templates/frontend_controller.rb +6 -0
  253. data/lib/rails/generators/pages_core/install/templates/frontend_helper.rb +5 -0
  254. data/lib/rails/generators/pages_core/install/templates/gitignore.erb +25 -0
  255. data/lib/rails/generators/pages_core/install/templates/page_templates_initializer.rb +67 -0
  256. data/lib/rails/generators/pages_core/install/templates/pages_controller.rb +4 -0
  257. data/lib/rails/generators/pages_core/install/templates/pages_initializer.rb +45 -0
  258. data/lib/rails/generators/pages_core/install/templates/thinking_sphinx.yml +12 -0
  259. data/lib/rails/generators/pages_core/rspec/rspec_generator.rb +34 -0
  260. data/lib/rails/generators/pages_core/rspec/templates/factories.rb +9 -0
  261. data/lib/rails/generators/pages_core/rspec/templates/mailer_macros.rb +9 -0
  262. data/lib/rails/generators/pages_core/rspec/templates/spec_helper.rb +51 -0
  263. data/lib/tasks/db.rake +96 -0
  264. data/lib/tasks/pages/assets.rake +65 -0
  265. data/lib/tasks/pages/cache.rake +16 -0
  266. data/lib/tasks/pages/update.rake +19 -0
  267. data/lib/tasks/pages.rake +76 -0
  268. data/template.rb +19 -0
  269. data/vendor/assets/javascripts/jquery.dimscreen.js +77 -0
  270. data/vendor/assets/javascripts/jquery.fieldselection.js +59 -0
  271. metadata +690 -0
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ module FrontendHelper #:nodoc:
4
+ include PagesCore::FrontendHelper
5
+ end
@@ -0,0 +1,108 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module AdminHelper
6
+ include PagesCore::Admin::LabelledFieldHelper
7
+ include PagesCore::Admin::TagEditorHelper
8
+
9
+ # Generates tags for an editable dynamic image.
10
+ def editable_dynamic_image_tag(image, options = {})
11
+ preview_url = uncropped_dynamic_image_url(image, size: "800x")
12
+ link_to(
13
+ dynamic_image_tag(image, options), admin_image_path(image),
14
+ class: "editableImage",
15
+ data: { "preview-url" => preview_url }
16
+ )
17
+ end
18
+
19
+ def body_classes
20
+ classes = @body_classes || []
21
+ classes << controller.class.underscore
22
+ classes << "#{controller.action_name}_action"
23
+ classes << "with_sidebar" if content_for?(:sidebar)
24
+ classes << "with_notice" if flash[:notice]
25
+ classes.reverse.join(" ")
26
+ end
27
+
28
+ def add_body_class(class_name)
29
+ @body_classes ||= []
30
+ @body_classes << class_name
31
+ end
32
+
33
+ attr_accessor :page_title
34
+ attr_accessor :page_description
35
+ attr_accessor :page_description_class
36
+ attr_accessor :page_description_links
37
+
38
+ def page_title(title = nil)
39
+ if title
40
+ ActiveSupport::Deprecation.warn(
41
+ "Setting page title with page_title is deprecated, use page_title="
42
+ )
43
+ @page_title = title
44
+ else
45
+ @page_title
46
+ end
47
+ end
48
+
49
+ def page_description(string = nil, class_name = nil)
50
+ if class_name
51
+ ActiveSupport::Deprecation.warn(
52
+ "Setting page description class through page_description " \
53
+ "is deprecated, use page_description_class="
54
+ )
55
+ @page_description_class = class_name
56
+ end
57
+ if string
58
+ ActiveSupport::Deprecation.warn(
59
+ "Setting description with page_description is deprecated, " \
60
+ "use page_description="
61
+ )
62
+ @page_description = string
63
+ else
64
+ @page_description
65
+ end
66
+ end
67
+
68
+ def page_description_links(links = nil)
69
+ if links
70
+ ActiveSupport::Deprecation.warn(
71
+ "Setting page description_links with page_description_links " \
72
+ "is deprecated, use page_description_links="
73
+ )
74
+ @page_description_links = links
75
+ else
76
+ @page_description_links
77
+ end
78
+ end
79
+
80
+ def sidebar(string = "", &block)
81
+ @sidebar = string
82
+ return unless block_given?
83
+ @sidebar += capture(&block)
84
+ end
85
+
86
+ def content_tab(name, options = {}, &block)
87
+ @content_tabs ||= []
88
+ return unless block_given?
89
+ tab = {
90
+ name: name.to_s.humanize,
91
+ key: name.to_s.underscore.gsub(/[\s]+/, "_"),
92
+ options: options,
93
+ content: capture(&block)
94
+ }
95
+ @content_tabs << tab
96
+ tab_output = "<div class=\"content_tab\" " \
97
+ "id=\"content-tab-#{tab[:key]}\">"
98
+ tab_output += tab[:content]
99
+ tab_output += "</div>"
100
+ tab_output.html_safe
101
+ end
102
+
103
+ def link_separator
104
+ ' <span class="separator">|</span> '.html_safe
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,73 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module LabelledFieldHelper
6
+ # Generate HTML for a field, with label and optionally description
7
+ # and errors.
8
+ #
9
+ # The options are:
10
+ # * <tt>:description</tt>: Description of the field
11
+ # * <tt>:errors</tt>: Error messages for the attribute
12
+ #
13
+ # An example:
14
+ # <%= form_for @user do |f| %>
15
+ # <%= labelled_field f.text_field(:username), "Username",
16
+ # description: "Choose your username",
17
+ # errors: @user.errors[:username] %>
18
+ # <%= submit_tag "Save" %>
19
+ # <% end %>
20
+ #
21
+ def labelled_field(field, label, options = {})
22
+ content_tag(:div, class: labelled_field_class(options)) do
23
+ (
24
+ labelled_field_label(label, options) +
25
+ labelled_field_description(options[:description]) +
26
+ field +
27
+ (options[:check_box_description] || "")
28
+ ).html_safe
29
+ end
30
+ end
31
+
32
+ def image_upload_field(form, label, method = :image, options = {})
33
+ output = ""
34
+ if form.object.send(method)
35
+ output += "<p>" +
36
+ dynamic_image_tag(form.object.send(method), size: "120x100") +
37
+ "</p>"
38
+ end
39
+ output += labelled_field(
40
+ form.file_field(method),
41
+ label, { errors: form.object.errors[method] }.merge(options)
42
+ )
43
+ output.html_safe
44
+ end
45
+
46
+ private
47
+
48
+ def labelled_field_class(options = {})
49
+ if options[:errors] && options[:errors].any?
50
+ "field field_with_errors"
51
+ else
52
+ "field"
53
+ end
54
+ end
55
+
56
+ def labelled_field_label(label, options = {})
57
+ content_tag(:label) do
58
+ label + labelled_field_errors(options[:errors])
59
+ end
60
+ end
61
+
62
+ def labelled_field_description(str)
63
+ return "" unless str
64
+ content_tag(:p, str, class: "description")
65
+ end
66
+
67
+ def labelled_field_errors(errors)
68
+ return "" unless errors && errors.any?
69
+ content_tag(:span, class: "error") { Array(errors).last }
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module Admin
5
+ module TagEditorHelper
6
+ def tag_editor_for(
7
+ form_helper, item, field_name = :serialized_tags, options = {}
8
+ )
9
+ tags = options[:tags] || Tag.tags_and_suggestions_for(item, limit: 20)
10
+ tagged = options[:tagged] || item.tags
11
+ options[:placeholder] ||= "Add tag..."
12
+ content_tag(:div, class: "tag-editor clearfix") do
13
+ form_helper.hidden_field(field_name, class: "serialized_tags") +
14
+ tag_check_boxes(tags, tagged) +
15
+ add_tag_button(options)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def tag_check_boxes(tags, tagged)
22
+ content_tag(:div, class: :tags) do
23
+ tags.map do |tag|
24
+ content_tag(:span, class: :tag) do
25
+ check_box_tag(
26
+ "tag-#{tag.id}",
27
+ 1,
28
+ tagged.include?(tag)
29
+ ) + content_tag(:span, tag.name, class: :name)
30
+ end
31
+ end.join.html_safe
32
+ end
33
+ end
34
+
35
+ def add_tag_button(options = {})
36
+ content_tag(:div, class: "add-tag-form") do
37
+ text_field_tag(
38
+ "add_tag",
39
+ options[:placeholder],
40
+ class: "add-tag"
41
+ ) + content_tag(:button, "Add", class: "add-tag-button")
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,65 @@
1
+ # encoding: utf-8
2
+
3
+ # Methods added to this helper will be available to all templates
4
+ # in the application.
5
+ module PagesCore
6
+ module ApplicationHelper
7
+ include PagesCore::HeadTagsHelper
8
+ include PagesCore::ImagesHelper
9
+
10
+ def page_link(page, options = {})
11
+ link_locale = options[:locale] || locale
12
+ page.localize(link_locale) do |p|
13
+ title = options[:title] || p.name.to_s
14
+ return title unless conditional_options?(options)
15
+ url = if p.redirects?
16
+ p.redirect_path(locale: link_locale)
17
+ else
18
+ page_path(link_locale, p)
19
+ end
20
+ link_to(title, url, class: options[:class])
21
+ end
22
+ end
23
+
24
+ def page_url(page_or_locale, page = nil, options = {})
25
+ if page
26
+ locale = page_or_locale
27
+ else
28
+ ActiveSupport::Deprecation.warn(
29
+ "Calling page_url without locale is deprecated"
30
+ )
31
+ locale = options[:locale] || @locale
32
+ page = page_or_locale
33
+ end
34
+ page.localize(locale) do |p|
35
+ if p.redirects?
36
+ p.redirect_path(locale: locale)
37
+ else
38
+ super locale, p, options
39
+ end
40
+ end
41
+ end
42
+
43
+ def unique_page(page_name, &block)
44
+ locale = @locale || I18n.default_locale.to_s
45
+ page = Page.where(unique_name: page_name).first
46
+ if page && block_given?
47
+ output = capture(page.localize(locale), &block)
48
+ concat(output)
49
+ end
50
+ (page) ? page.localize(locale) : nil
51
+ end
52
+
53
+ private
54
+
55
+ def conditional_options?(options = {})
56
+ if options.key?(:if)
57
+ options[:if]
58
+ elsif options.key?(:unless)
59
+ !options[:unless]
60
+ else
61
+ true
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,187 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ class FormBuilder < ActionView::Helpers::FormBuilder
5
+ include ActionView::Helpers::TagHelper
6
+
7
+ # Are there any errors on this attribute?
8
+ def errors_on?(attribute)
9
+ errors_on(attribute).length > 0
10
+ end
11
+
12
+ # Returns all errors for the attribute
13
+ def errors_on(attribute)
14
+ errors = object.errors[attribute] || []
15
+ errors = [errors] unless errors.is_a?(Array)
16
+ errors
17
+ end
18
+
19
+ # Returns the first error on attribute
20
+ def first_error_on(attribute)
21
+ errors_on(attribute).first
22
+ end
23
+
24
+ def image_file_field(attribute, options = {})
25
+ if object.send(attribute)
26
+ content_tag(
27
+ "p",
28
+ @template.dynamic_image_tag(object.send(attribute), size: "120x100")
29
+ ) + file_field(attribute, options)
30
+ else
31
+ file_field(attribute, options)
32
+ end
33
+ end
34
+
35
+ def field_with_label(attribute, content, label_text = nil)
36
+ classes = ["field"]
37
+ classes << "field_with_errors" if errors_on?(attribute)
38
+ content_tag(
39
+ "div",
40
+ label_for(attribute, label_text) + content,
41
+ class: classes.join(" ")
42
+ )
43
+ end
44
+
45
+ def label_for(attribute, label_text = nil)
46
+ label_text ||= object.class.human_attribute_name(attribute)
47
+ if errors_on?(attribute)
48
+ label_text += " <span class=\"error\">" +
49
+ first_error_on(attribute) +
50
+ "</span>"
51
+ end
52
+ content_tag(
53
+ "label",
54
+ label_text.html_safe,
55
+ for: [object.class.to_s.underscore, attribute].join("_")
56
+ )
57
+ end
58
+
59
+ def labelled_text_field(attribute, label_text = nil, options = {})
60
+ label_text, options = parse_label_text_and_options(label_text, options)
61
+ field_with_label(
62
+ attribute,
63
+ text_field(attribute, options),
64
+ label_text
65
+ )
66
+ end
67
+
68
+ def labelled_text_area(attribute, label_text = nil, options = {})
69
+ label_text, options = parse_label_text_and_options(label_text, options)
70
+ field_with_label(
71
+ attribute,
72
+ text_area(attribute, options),
73
+ label_text
74
+ )
75
+ end
76
+
77
+ def labelled_country_select(
78
+ attribute,
79
+ label_text = nil,
80
+ priority_or_options = {},
81
+ options = {},
82
+ html_options = {}
83
+ )
84
+ if priority_or_options.is_a?(Hash)
85
+ label_text, priority_or_options = parse_label_text_and_options(
86
+ label_text,
87
+ priority_or_options
88
+ )
89
+ else
90
+ label_text, options = parse_label_text_and_options(
91
+ label_text,
92
+ options
93
+ )
94
+ end
95
+ field_with_label(
96
+ attribute,
97
+ country_select(attribute, priority_or_options, options, html_options),
98
+ label_text
99
+ )
100
+ end
101
+
102
+ def labelled_date_select(attribute, label_text = nil, options = {})
103
+ label_text, options = parse_label_text_and_options(label_text, options)
104
+ field_with_label(
105
+ attribute,
106
+ date_select(attribute, options),
107
+ label_text
108
+ )
109
+ end
110
+
111
+ def labelled_datetime_select(attribute, label_text = nil, options = {})
112
+ label_text, options = parse_label_text_and_options(label_text, options)
113
+ field_with_label(
114
+ attribute,
115
+ datetime_select(attribute, options),
116
+ label_text
117
+ )
118
+ end
119
+
120
+ def labelled_time_select(attribute, label_text = nil, options = {})
121
+ label_text, options = parse_label_text_and_options(label_text, options)
122
+ field_with_label(
123
+ attribute,
124
+ time_select(attribute, options),
125
+ label_text
126
+ )
127
+ end
128
+
129
+ def labelled_select(attribute, choices, label_text = nil, options = {})
130
+ label_text, options = parse_label_text_and_options(label_text, options)
131
+ field_with_label(
132
+ attribute,
133
+ select(attribute, choices, options),
134
+ label_text
135
+ )
136
+ end
137
+
138
+ def labelled_check_box(
139
+ attribute, label_text = nil, options = {},
140
+ checked_value = "1", unchecked_value = "0"
141
+ )
142
+ label_text, options = parse_label_text_and_options(label_text, options)
143
+ field_with_label(
144
+ attribute,
145
+ check_box(attribute, options, checked_value, unchecked_value),
146
+ label_text
147
+ )
148
+ end
149
+
150
+ def labelled_file_field(attribute, label_text = nil, options = {})
151
+ label_text, options = parse_label_text_and_options(label_text, options)
152
+ field_with_label(
153
+ attribute,
154
+ file_field(attribute, options),
155
+ label_text
156
+ )
157
+ end
158
+
159
+ def labelled_image_file_field(attribute, label_text = nil, options = {})
160
+ label_text, options = parse_label_text_and_options(label_text, options)
161
+ field_with_label(
162
+ attribute,
163
+ image_file_field(attribute, options),
164
+ label_text
165
+ )
166
+ end
167
+
168
+ def labelled_password_field(attribute, label_text = nil, options = {})
169
+ label_text, options = parse_label_text_and_options(label_text, options)
170
+ field_with_label(
171
+ attribute,
172
+ password_field(attribute, options),
173
+ label_text
174
+ )
175
+ end
176
+
177
+ protected
178
+
179
+ def parse_label_text_and_options(label_text = nil, options = {})
180
+ if label_text.is_a?(Hash) && options == {}
181
+ options = label_text
182
+ label_text = nil
183
+ end
184
+ [label_text, options]
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module PagesCore
4
+ module FrontendHelper
5
+ def root_pages
6
+ @root_pages ||= Page.roots.localized(@locale).published
7
+ end
8
+
9
+ def root_page
10
+ @root_page ||= root_pages.first
11
+ end
12
+
13
+ attr_reader :search_query
14
+
15
+ attr_reader :search_category_id
16
+
17
+ def comment_honeypot_field
18
+ text_field_tag "email", "", class: "comment_email"
19
+ end
20
+ end
21
+ end