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,79 @@
1
+ module Admin
2
+ class InvitesController < Admin::AdminController
3
+ before_action :require_authentication, except: [:accept, :show]
4
+ before_action :find_invite, only: [:show, :edit, :update, :destroy, :accept]
5
+ before_action :require_valid_token, only: [:show, :accept]
6
+
7
+ require_authorization(
8
+ Invite,
9
+ proc { @invite },
10
+ member: [:show, :edit, :update, :destroy],
11
+ collection: [:index, :new, :create]
12
+ )
13
+
14
+ def index
15
+ redirect_to admin_users_url
16
+ end
17
+
18
+ def accept
19
+ @user = @invite.create_user(user_params)
20
+ if @user.valid?
21
+ authenticate!(@user)
22
+ redirect_to admin_default_url
23
+ else
24
+ render action: :show
25
+ end
26
+ end
27
+
28
+ def show
29
+ @user = User.new(email: @invite.email)
30
+ end
31
+
32
+ def new
33
+ @invite = current_user.invites.new
34
+ Role.roles.each do |role|
35
+ @invite.roles.new(name: role.name) if role.default
36
+ end
37
+ end
38
+
39
+ def create
40
+ @invite = current_user.invites.create(invite_params)
41
+ if @invite.valid?
42
+ AdminMailer.invite(
43
+ @invite,
44
+ admin_invite_with_token_url(@invite, @invite.token)
45
+ ).deliver_now
46
+ @invite.update(sent_at: Time.now)
47
+ redirect_to admin_invites_url
48
+ else
49
+ render action: :new
50
+ end
51
+ end
52
+
53
+ def destroy
54
+ flash[:notice] = "The invite to #{@invite.email} has been deleted"
55
+ @invite.destroy
56
+ redirect_to admin_invites_url
57
+ end
58
+
59
+ private
60
+
61
+ def find_invite
62
+ @invite = Invite.find(params[:id])
63
+ end
64
+
65
+ def user_params
66
+ params.require(:user).permit(:name, :email, :password, :confirm_password)
67
+ end
68
+
69
+ def invite_params
70
+ params.require(:invite).permit(:email, role_names: [])
71
+ end
72
+
73
+ def require_valid_token
74
+ return if @invite && secure_compare(@invite.token, params[:token])
75
+ flash[:notice] = "Invalid invite token"
76
+ redirect_to(login_admin_users_url) && return
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+
3
+ module Admin
4
+ class PageCommentsController < Admin::AdminController
5
+ before_action :find_page
6
+ before_action :find_page_comment, only: [:show, :edit, :update, :destroy]
7
+
8
+ def index
9
+ redirect_to admin_page_path(@locale, @page)
10
+ end
11
+
12
+ def show
13
+ end
14
+
15
+ def new
16
+ @page_comment = @page.comments.new
17
+ end
18
+
19
+ def edit
20
+ end
21
+
22
+ def create
23
+ @page_comment = @page.comments.create(page_comment_params)
24
+ if @page_comment.valid?
25
+ flash[:notice] = "The comment was created"
26
+ redirect_to admin_page_path(@locale, @page)
27
+ else
28
+ render action: :new
29
+ end
30
+ end
31
+
32
+ def update
33
+ if @page_comment.update(page_comment_params)
34
+ flash[:notice] = "The comment was updated"
35
+ redirect_to admin_page_path(@locale, @page)
36
+ else
37
+ render action: :edit
38
+ end
39
+ end
40
+
41
+ def destroy
42
+ @page_comment.destroy
43
+ flash[:notice] = "The comment was deleted"
44
+ redirect_to admin_page_path(@locale, @page)
45
+ end
46
+
47
+ protected
48
+
49
+ def find_page
50
+ @page = Page.find(params[:page_id])
51
+ end
52
+
53
+ def find_page_comment
54
+ @page_comment = @page.comments.find(params[:id])
55
+ end
56
+
57
+ def page_comment_params
58
+ params.require(:page_comment).permit(:name, :email, :url, :body)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+
3
+ module Admin
4
+ class PageFilesController < Admin::AdminController
5
+ before_action :find_page
6
+ before_action :find_page_file, only: [:show, :edit, :update, :destroy]
7
+ before_action :redirect_to_page, only: [:index, :show, :new, :edit]
8
+
9
+ require_authorization(
10
+ PageFile,
11
+ proc { @page_file },
12
+ collection: [:index, :reorder, :new, :create]
13
+ )
14
+
15
+ def index
16
+ end
17
+
18
+ def reorder
19
+ if params[:ids]
20
+ files = Array(params[:ids]).map { |id| PageFile.find(id) }
21
+ files.each_with_index do |file, index|
22
+ file.update(position: index)
23
+ end
24
+ end
25
+ if request.xhr?
26
+ render text: "ok"
27
+ else
28
+ redirect_to_page
29
+ end
30
+ end
31
+
32
+ def show
33
+ end
34
+
35
+ def new
36
+ end
37
+
38
+ def create
39
+ @page_file = @page.files.new
40
+ @page_file.update(page_file_params.merge(locale: @locale))
41
+ flash[:notice] = "Error uploading file!" unless @page_file.valid?
42
+ redirect_to_page
43
+ end
44
+
45
+ def edit
46
+ end
47
+
48
+ def update
49
+ if @page_file.update(page_file_params)
50
+ flash[:notice] = "File updated"
51
+ else
52
+ flash[:notice] = "Error updating file!"
53
+ end
54
+ redirect_to_page
55
+ end
56
+
57
+ def destroy
58
+ @page_file.destroy
59
+ flash[:notice] = "File deleted"
60
+ redirect_to_page
61
+ end
62
+
63
+ protected
64
+
65
+ def page_file_params
66
+ params.require(:page_file).permit(:name, :filename, :file)
67
+ end
68
+
69
+ def redirect_to_page
70
+ redirect_to(edit_admin_page_path(@locale, @page, anchor: "files"))
71
+ end
72
+
73
+ def find_page
74
+ @page = Page.find(params[:page_id]).localize(@locale)
75
+ end
76
+
77
+ def find_page_file
78
+ @page_file = @page.files.find(params[:id])
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,116 @@
1
+ # encoding: utf-8
2
+
3
+ module Admin
4
+ class PageImagesController < Admin::AdminController
5
+ before_action :find_page
6
+ before_action :find_page_image, only: [:show, :edit, :update, :destroy]
7
+
8
+ require_authorization(
9
+ PageImage,
10
+ proc { @page_image },
11
+ collection: [:index, :reorder, :new, :create]
12
+ )
13
+
14
+ def index
15
+ @page_images = @page.page_images
16
+ respond_to do |format|
17
+ format.json do
18
+ render json: @page_images, each_serializer: Admin::PageImageSerializer
19
+ end
20
+ end
21
+ end
22
+
23
+ def reorder
24
+ @page_images = params[:ids].map { |id| PageImage.find(id) }
25
+ @page_images.each_with_index do |pi, i|
26
+ pi.update_column(:position, i)
27
+ end
28
+ respond_to do |format|
29
+ format.json do
30
+ render json: @page_images, each_serializer: Admin::PageImageSerializer
31
+ end
32
+ end
33
+ end
34
+
35
+ def show
36
+ end
37
+
38
+ def new
39
+ @page_image = @page.page_images.new
40
+ end
41
+
42
+ def create
43
+ if page_images_params?
44
+ page_images_params.each do |_index, attributes|
45
+ if attributes[:image]
46
+ @page.page_images.create(attributes.merge(locale: @locale))
47
+ end
48
+ end
49
+ else
50
+ @page.page_images.create(page_image_params.merge(locale: @locale))
51
+ end
52
+ redirect_to(admin_page_path(@locale, @page, anchor: "images"))
53
+ end
54
+
55
+ def update
56
+ if @page_image.update(page_image_params)
57
+ respond_to do |format|
58
+ format.html do
59
+ flash[:notice] = "The image was updated"
60
+ redirect_to(admin_page_path(@locale, @page, anchor: "images"))
61
+ end
62
+ format.json do
63
+ render json: @page_image.to_json
64
+ end
65
+ end
66
+ else
67
+ render action: :edit
68
+ end
69
+ end
70
+
71
+ def destroy
72
+ @page_image.destroy
73
+ respond_to do |format|
74
+ format.html do
75
+ flash[:notice] = "The image was deleted"
76
+ redirect_to(admin_page_path(@locale, @page, anchor: "images"))
77
+ end
78
+ format.json do
79
+ render json: @page_image.to_json
80
+ end
81
+ end
82
+ end
83
+
84
+ protected
85
+
86
+ def find_page
87
+ @page = Page.find(params[:page_id]).localize(@locale)
88
+ end
89
+
90
+ def find_page_image
91
+ @page_image = @page.page_images.find(params[:id]).localize(@locale)
92
+ end
93
+
94
+ def page_image_params
95
+ params.require(:page_image).permit(
96
+ :image, :primary,
97
+ image_attributes: [
98
+ :id, :alternative, :caption,
99
+ :crop_start_x, :crop_start_y, :crop_width, :crop_height
100
+ ]
101
+ )
102
+ end
103
+
104
+ def page_images_params
105
+ params.permit(
106
+ page_images: [:image, :primary, {
107
+ image_attributes: [:alternative, :caption]
108
+ }]
109
+ )[:page_images]
110
+ end
111
+
112
+ def page_images_params?
113
+ params[:page_images] ? true : false
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,179 @@
1
+ # encoding: utf-8
2
+
3
+ module Admin
4
+ class PagesController < Admin::AdminController
5
+ before_action :require_news_pages, only: [:news]
6
+ before_action :find_page, only: [
7
+ :show, :edit, :preview, :update, :destroy, :reorder,
8
+ :delete_meta_image
9
+ ]
10
+ before_action :find_categories
11
+ before_action :find_news_pages, only: [:news, :new_news]
12
+
13
+ require_authorization(
14
+ Page,
15
+ proc { @page },
16
+ collection: [:index, :news, :new, :new_news, :create, :reorder_pages]
17
+ )
18
+
19
+ def index
20
+ @root_pages = Page.roots.in_locale(@locale).visible
21
+ end
22
+
23
+ def news
24
+ @archive_finder = Page.where(parent_page_id: @news_pages)
25
+ .visible
26
+ .order("published_at DESC")
27
+ .in_locale(@locale)
28
+ .archive_finder
29
+
30
+ @year, @month = year_and_month(@archive_finder)
31
+ @year ||= Time.now.year
32
+ @month ||= Time.now.month
33
+
34
+ @pages = @archive_finder.by_year_and_month(@year, @month)
35
+ end
36
+
37
+ def reorder_pages
38
+ pages = params[:ids].map { |id| Page.find(id) }
39
+ PagesCore::CacheSweeper.once do
40
+ pages.each_with_index do |page, index|
41
+ page.update(position: (index + 1))
42
+ end
43
+ end
44
+ render text: "ok" if request.xhr?
45
+ end
46
+
47
+ def show
48
+ edit
49
+ render action: :edit
50
+ end
51
+
52
+ def new
53
+ @authors = User.activated
54
+ @page = build_page(@locale)
55
+ if params[:parent]
56
+ @page.parent = Page.find(params[:parent])
57
+ elsif @news_pages
58
+ @page.parent = @news_pages.first
59
+ end
60
+ end
61
+
62
+ # TODO: Should be refactored
63
+ def new_news
64
+ new
65
+ render action: :new
66
+ end
67
+
68
+ def create
69
+ @page = build_page(@locale)
70
+ if @page.update(page_params)
71
+ @page.update(
72
+ comments_allowed: @page.template_config.value(:comments_allowed)
73
+ )
74
+ @page.categories = param_categories
75
+ redirect_to edit_admin_page_url(@locale, @page)
76
+ else
77
+ render action: :new
78
+ end
79
+ end
80
+
81
+ def edit
82
+ @authors = User.activated
83
+ # Make sure the page author is included in the dropdown
84
+ # even if the account isn't active.
85
+ if @authors.any? && @page.author
86
+ @authors = [@page.author] + @authors.reject { |a| a == @page.author }
87
+ end
88
+ @new_image ||= Image.new
89
+ end
90
+
91
+ def update
92
+ if @page.update(page_params)
93
+ @page.categories = param_categories
94
+ flash[:notice] = "Your changes were saved"
95
+ flash[:save_performed] = true
96
+ redirect_to edit_admin_page_url(@locale, @page)
97
+ else
98
+ edit
99
+ render action: :edit
100
+ end
101
+ end
102
+
103
+ def destroy
104
+ @page = Page.find(params[:id])
105
+ @page.flag_as_deleted!
106
+ redirect_to admin_pages_url(@locale)
107
+ end
108
+
109
+ def delete_meta_image
110
+ @page.meta_image.destroy
111
+ flash[:notice] = "The image was deleted"
112
+ redirect_to edit_admin_page_url(@locale, @page, anchor: "metadata")
113
+ end
114
+
115
+ private
116
+
117
+ def build_page(locale)
118
+ Page.new.localize(locale).tap do |page|
119
+ page.author = default_author || current_user
120
+ end
121
+ end
122
+
123
+ def default_author
124
+ return unless PagesCore.config.default_author
125
+ User.where(email: PagesCore.config.default_author).first
126
+ end
127
+
128
+ def permitted_page_attributes
129
+ [
130
+ :template, :user_id, :status, :content_order,
131
+ :feed_enabled, :published_at, :redirect_to, :comments_allowed,
132
+ :image_link, :news_page, :unique_name, :pinned,
133
+ :parent_page_id, :serialized_tags, :meta_image
134
+ ]
135
+ end
136
+
137
+ def page_params
138
+ params.require(:page).permit(
139
+ Page.localized_attributes + permitted_page_attributes
140
+ )
141
+ end
142
+
143
+ def param_categories
144
+ if params[:category] && params[:category].length > 0
145
+ params[:category].map { |k, _| Category.find(k.to_i) }
146
+ else
147
+ []
148
+ end
149
+ end
150
+
151
+ def find_page
152
+ @page = Page.find(params[:id]).localize(@locale)
153
+ end
154
+
155
+ def find_categories
156
+ @categories = Category.order("name")
157
+ end
158
+
159
+ def find_news_pages
160
+ @news_pages = Page.news_pages.in_locale(@locale)
161
+ return if @news_pages.any?
162
+ redirect_to(admin_pages_url(@locale))
163
+ end
164
+
165
+ # Redirect away if no news pages has been configured
166
+ def require_news_pages
167
+ return if Page.news_pages.any?
168
+ redirect_to(admin_pages_url(@locale))
169
+ end
170
+
171
+ def year_and_month(archive_finder)
172
+ if params[:year] && params[:month]
173
+ [params[:year], params[:month]].map(&:to_i)
174
+ else
175
+ archive_finder.latest_year_and_month
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,83 @@
1
+ # encoding: utf-8
2
+
3
+ module Admin
4
+ class PasswordResetsController < Admin::AdminController
5
+ before_action :find_password_reset_token, only: [:show, :update]
6
+ before_action :check_for_expired_token, only: [:show, :update]
7
+ before_action :require_authentication, except: [:create, :show, :update]
8
+
9
+ layout "admin"
10
+
11
+ def create
12
+ if params[:username] &&
13
+ @user = User.find_by_username_or_email(params[:username])
14
+ @password_reset_token = @user.password_reset_tokens.create
15
+ deliver_password_reset(@user, @password_reset_token)
16
+ flash[:notice] = "An email with further instructions has been sent"
17
+ else
18
+ flash[:notice] = "Couldn't find a user with that email address"
19
+ end
20
+ redirect_to login_url
21
+ end
22
+
23
+ def show
24
+ @user = @password_reset_token.user
25
+ end
26
+
27
+ def update
28
+ @user = @password_reset_token.user
29
+ if !user_params[:password].blank? && @user.update(user_params)
30
+ @password_reset_token.destroy
31
+ authenticate!(@user)
32
+ flash[:notice] = "Your password has been changed"
33
+ redirect_to login_url
34
+ else
35
+ render action: :show
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def deliver_password_reset(user, password_reset)
42
+ AdminMailer.password_reset(
43
+ user,
44
+ admin_password_reset_with_token_url(
45
+ password_reset, password_reset.token
46
+ )
47
+ ).deliver_now
48
+ end
49
+
50
+ def login_url
51
+ # TODO: Validate URL
52
+ params[:login_url] || login_admin_users_url
53
+ end
54
+
55
+ def user_params
56
+ params.require(:user).permit(:password, :confirm_password)
57
+ end
58
+
59
+ def valid_token?(pr)
60
+ pr && secure_compare(pr.token, params[:token])
61
+ end
62
+
63
+ def find_password_reset_token
64
+ @password_reset_token = begin
65
+ PasswordResetToken.find(params[:id])
66
+ rescue ActiveRecord::RecordNotFound
67
+ nil
68
+ end
69
+
70
+ return if valid_token?(@password_reset_token)
71
+
72
+ flash[:notice] = "Invalid password reset request"
73
+ redirect_to(login_url) && return
74
+ end
75
+
76
+ def check_for_expired_token
77
+ return unless @password_reset_token.expired?
78
+ @password_reset_token.destroy
79
+ flash[:notice] = "Your password reset link has expired"
80
+ redirect_to(login_url)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,102 @@
1
+ # encoding: utf-8
2
+
3
+ module Admin
4
+ class UsersController < Admin::AdminController
5
+ before_action :require_authentication, except: [:new, :create, :login]
6
+ before_action :require_no_users, only: [:new, :create]
7
+ before_action(
8
+ :find_user,
9
+ only: [:edit, :update, :show, :destroy, :delete_image]
10
+ )
11
+
12
+ require_authorization(
13
+ User,
14
+ proc { @user },
15
+ member: [:delete_image, :update, :destroy, :edit],
16
+ collection: [:index, :deactivated, :new, :create]
17
+ )
18
+
19
+ def index
20
+ @users = User.activated
21
+ @invites = Invite.all.order("created_at DESC")
22
+ end
23
+
24
+ def deactivated
25
+ @users = User.deactivated
26
+ @invites = []
27
+ end
28
+
29
+ def login
30
+ return unless logged_in?
31
+ redirect_to admin_default_url
32
+ end
33
+
34
+ def new
35
+ @user = User.new
36
+ end
37
+
38
+ def create
39
+ @user = User.create(user_params)
40
+ if @user.valid?
41
+ authenticate!(@user)
42
+ redirect_to admin_default_url
43
+ else
44
+ render action: :new
45
+ end
46
+ end
47
+
48
+ def show
49
+ end
50
+
51
+ def edit
52
+ end
53
+
54
+ def update
55
+ if @user.update(user_params)
56
+ flash[:notice] = "Your changed to #{@user.name} were saved."
57
+ redirect_to admin_users_url
58
+ else
59
+ flash.now[:error] = "There were problems saving your changes."
60
+ render action: :edit
61
+ end
62
+ end
63
+
64
+ def destroy
65
+ @user = User.find(params[:id])
66
+ flash[:notice] = "User <strong>#{@user.email}</strong> has been deleted"
67
+ @user.destroy
68
+ redirect_to admin_users_url
69
+ end
70
+
71
+ def delete_image
72
+ @user.image.destroy
73
+ respond_to do |format|
74
+ format.js { render text: "The profile picture has been deleted." }
75
+ format.html { redirect_to(edit_admin_user_url(@user)) }
76
+ end
77
+ end
78
+
79
+ protected
80
+
81
+ def find_user
82
+ @user = User.find(params[:id])
83
+ end
84
+
85
+ def user_params
86
+ permitted_params = [
87
+ :name, :email, :image
88
+ ]
89
+ permitted_params += [:activated, role_names: []] if policy(User).manage?
90
+ if !User.any? || (@user && policy(@user).change_password?)
91
+ permitted_params += [:password, :confirm_password]
92
+ end
93
+ params.require(:user).permit(permitted_params)
94
+ end
95
+
96
+ def require_no_users
97
+ return unless User.any?
98
+ flash[:error] = "Account holder already exists"
99
+ redirect_to(admin_users_url)
100
+ end
101
+ end
102
+ end