archangel 0.0.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 (517) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +17 -0
  3. data/.editorconfig +19 -0
  4. data/.eslintignore +6 -0
  5. data/.eslintrc.json +40 -0
  6. data/.github/ISSUE_TEMPLATE.md +23 -0
  7. data/.github/PULL_REQUEST_TEMPLATE.md +18 -0
  8. data/.gitignore +22 -0
  9. data/.hound.yml +21 -0
  10. data/.mdlrc +2 -0
  11. data/.reek +35 -0
  12. data/.rspec +4 -0
  13. data/.rubocop.yml +28 -0
  14. data/.rubocop_disabled.yml +2 -0
  15. data/.rubocop_enabled.yml +2 -0
  16. data/.rubocop_todo.yml +7 -0
  17. data/.scss-lint.yml +22 -0
  18. data/.travis.yml +16 -0
  19. data/.yardopts +10 -0
  20. data/CODE_OF_CONDUCT.md +43 -0
  21. data/CONTRIBUTING.md +150 -0
  22. data/Gemfile +36 -0
  23. data/MIT-LICENSE +21 -0
  24. data/README.md +129 -0
  25. data/Rakefile +27 -0
  26. data/app/assets/config/archangel_manifest.js +14 -0
  27. data/app/assets/images/archangel/fallback/asset.png +0 -0
  28. data/app/assets/images/archangel/fallback/avatar.png +0 -0
  29. data/app/assets/images/archangel/fallback/default.png +0 -0
  30. data/app/assets/images/archangel/fallback/favicon.ico +0 -0
  31. data/app/assets/images/archangel/fallback/large_avatar.png +0 -0
  32. data/app/assets/images/archangel/fallback/large_logo.png +0 -0
  33. data/app/assets/images/archangel/fallback/logo.png +0 -0
  34. data/app/assets/images/archangel/fallback/medium_avatar.png +0 -0
  35. data/app/assets/images/archangel/fallback/medium_logo.png +0 -0
  36. data/app/assets/images/archangel/fallback/small_asset.png +0 -0
  37. data/app/assets/images/archangel/fallback/small_avatar.png +0 -0
  38. data/app/assets/images/archangel/fallback/small_logo.png +0 -0
  39. data/app/assets/images/archangel/fallback/tiny_asset.png +0 -0
  40. data/app/assets/images/archangel/fallback/tiny_avatar.png +0 -0
  41. data/app/assets/images/archangel/fallback/tiny_logo.png +0 -0
  42. data/app/assets/javascripts/archangel/input/datetime_picker.js +46 -0
  43. data/app/assets/javascripts/archangel/input/meta_keywords.js +22 -0
  44. data/app/assets/javascripts/archangel/input/parent/collection.js +0 -0
  45. data/app/assets/javascripts/archangel/input/parent/field.js +0 -0
  46. data/app/assets/javascripts/archangel/input/parent/page.js +0 -0
  47. data/app/assets/javascripts/archangel/input/wysiwyg.js.erb +51 -0
  48. data/app/assets/javascripts/archangel/object/flash.js +49 -0
  49. data/app/assets/javascripts/archangel/object/routes/auth.js +22 -0
  50. data/app/assets/javascripts/archangel/object/routes/backend.js +103 -0
  51. data/app/assets/javascripts/archangel/object/routes/frontend.js +24 -0
  52. data/app/assets/javascripts/archangel/object/routes.js.erb +84 -0
  53. data/app/assets/javascripts/archangel/object/translate/datetime_picker.js.erb +26 -0
  54. data/app/assets/javascripts/archangel/object/translate/sortable.js.erb +10 -0
  55. data/app/assets/javascripts/archangel/object/translate.js +8 -0
  56. data/app/assets/javascripts/archangel/object/url.js +24 -0
  57. data/app/assets/javascripts/archangel/object.js +25 -0
  58. data/app/assets/javascripts/archangel/sortable.js +72 -0
  59. data/app/assets/stylesheets/archangel/.keep +0 -0
  60. data/app/controllers/archangel/application_controller.rb +177 -0
  61. data/app/controllers/archangel/auth/registrations_controller.rb +22 -0
  62. data/app/controllers/archangel/auth_controller.rb +20 -0
  63. data/app/controllers/archangel/backend/assets_controller.rb +338 -0
  64. data/app/controllers/archangel/backend/collections_controller.rb +257 -0
  65. data/app/controllers/archangel/backend/dashboards_controller.rb +27 -0
  66. data/app/controllers/archangel/backend/entries_controller.rb +344 -0
  67. data/app/controllers/archangel/backend/pages_controller.rb +299 -0
  68. data/app/controllers/archangel/backend/profiles_controller.rb +211 -0
  69. data/app/controllers/archangel/backend/sites_controller.rb +175 -0
  70. data/app/controllers/archangel/backend/templates_controller.rb +270 -0
  71. data/app/controllers/archangel/backend/users_controller.rb +366 -0
  72. data/app/controllers/archangel/backend/widgets_controller.rb +264 -0
  73. data/app/controllers/archangel/backend_controller.rb +21 -0
  74. data/app/controllers/archangel/frontend/pages_controller.rb +158 -0
  75. data/app/controllers/archangel/frontend_controller.rb +10 -0
  76. data/app/controllers/concerns/archangel/actionable_concern.rb +152 -0
  77. data/app/controllers/concerns/archangel/authenticatable_concern.rb +14 -0
  78. data/app/controllers/concerns/archangel/authorizable_concern.rb +14 -0
  79. data/app/controllers/concerns/archangel/paginatable_concern.rb +34 -0
  80. data/app/controllers/concerns/archangel/seoable_concern.rb +40 -0
  81. data/app/controllers/concerns/archangel/skip_authorizable_concern.rb +14 -0
  82. data/app/controllers/concerns/archangel/themable_concern.rb +27 -0
  83. data/app/helpers/archangel/application_helper.rb +34 -0
  84. data/app/helpers/archangel/auth_helper.rb +9 -0
  85. data/app/helpers/archangel/backend/assets_helper.rb +14 -0
  86. data/app/helpers/archangel/backend/collections_helper.rb +14 -0
  87. data/app/helpers/archangel/backend/dashboards_helper.rb +14 -0
  88. data/app/helpers/archangel/backend/entries_helper.rb +14 -0
  89. data/app/helpers/archangel/backend/pages_helper.rb +14 -0
  90. data/app/helpers/archangel/backend/sites_helper.rb +14 -0
  91. data/app/helpers/archangel/backend/templates_helper.rb +14 -0
  92. data/app/helpers/archangel/backend/users_helper.rb +14 -0
  93. data/app/helpers/archangel/backend/widgets_helper.rb +14 -0
  94. data/app/helpers/archangel/backend_helper.rb +9 -0
  95. data/app/helpers/archangel/flash_helper.rb +22 -0
  96. data/app/helpers/archangel/frontend/pages_helper.rb +14 -0
  97. data/app/helpers/archangel/frontend_helper.rb +9 -0
  98. data/app/inputs/archangel/date_picker_input.rb +27 -0
  99. data/app/inputs/archangel/date_time_picker_input.rb +27 -0
  100. data/app/inputs/archangel/field_classification_input.rb +32 -0
  101. data/app/inputs/archangel/language_input.rb +31 -0
  102. data/app/inputs/archangel/meta_keywords_input.rb +27 -0
  103. data/app/inputs/archangel/role_input.rb +31 -0
  104. data/app/inputs/archangel/theme_input.rb +29 -0
  105. data/app/inputs/archangel/time_picker_input.rb +27 -0
  106. data/app/inputs/archangel/wysiwyg_input.rb +15 -0
  107. data/app/jobs/archangel/application_job.rb +9 -0
  108. data/app/mailers/archangel/application_mailer.rb +12 -0
  109. data/app/models/archangel/application_record.rb +10 -0
  110. data/app/models/archangel/asset.rb +42 -0
  111. data/app/models/archangel/collection.rb +51 -0
  112. data/app/models/archangel/entry.rb +22 -0
  113. data/app/models/archangel/field.rb +30 -0
  114. data/app/models/archangel/page.rb +123 -0
  115. data/app/models/archangel/site.rb +54 -0
  116. data/app/models/archangel/template.rb +37 -0
  117. data/app/models/archangel/user.rb +62 -0
  118. data/app/models/archangel/widget.rb +62 -0
  119. data/app/policies/archangel/application_policy.rb +142 -0
  120. data/app/policies/archangel/asset_policy.rb +17 -0
  121. data/app/policies/archangel/collection_policy.rb +9 -0
  122. data/app/policies/archangel/entry_policy.rb +17 -0
  123. data/app/policies/archangel/page_policy.rb +9 -0
  124. data/app/policies/archangel/site_policy.rb +27 -0
  125. data/app/policies/archangel/template_policy.rb +9 -0
  126. data/app/policies/archangel/user_policy.rb +9 -0
  127. data/app/policies/archangel/widget_policy.rb +9 -0
  128. data/app/services/archangel/render_service.rb +98 -0
  129. data/app/services/archangel/template_render_service.rb +40 -0
  130. data/app/themes/default/assets/javascripts/default/auth/.keep +0 -0
  131. data/app/themes/default/assets/javascripts/default/auth.js +18 -0
  132. data/app/themes/default/assets/javascripts/default/backend/core.js +7 -0
  133. data/app/themes/default/assets/javascripts/default/backend.js +50 -0
  134. data/app/themes/default/assets/javascripts/default/common/cards.js +28 -0
  135. data/app/themes/default/assets/javascripts/default/common/flash.js +48 -0
  136. data/app/themes/default/assets/javascripts/default/common/navigation.js +30 -0
  137. data/app/themes/default/assets/javascripts/default/common/sidebar.js +114 -0
  138. data/app/themes/default/assets/javascripts/default/frontend/.keep +0 -0
  139. data/app/themes/default/assets/javascripts/default/frontend.js +18 -0
  140. data/app/themes/default/assets/stylesheets/default/auth/core.scss +15 -0
  141. data/app/themes/default/assets/stylesheets/default/auth.css +13 -0
  142. data/app/themes/default/assets/stylesheets/default/backend/core.scss +22 -0
  143. data/app/themes/default/assets/stylesheets/default/backend.css +13 -0
  144. data/app/themes/default/assets/stylesheets/default/common/_bootstrap.scss +49 -0
  145. data/app/themes/default/assets/stylesheets/default/common/_selectize.scss +299 -0
  146. data/app/themes/default/assets/stylesheets/default/common/_variables.scss +82 -0
  147. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_animate.scss +27 -0
  148. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_aside.scss +67 -0
  149. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_avatars.scss +42 -0
  150. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_badge.scss +3 -0
  151. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_breadcrumb-menu.scss +36 -0
  152. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_breadcrumb.scss +4 -0
  153. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_buttons.scss +408 -0
  154. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_callout.scss +58 -0
  155. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_card.scss +199 -0
  156. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_charts.scss +9 -0
  157. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_dropdown-menu-right.scss +8 -0
  158. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_dropdown.scss +70 -0
  159. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_footer.scss +9 -0
  160. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_forms.scss +4 -0
  161. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_grid.scss +15 -0
  162. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_input-group.scss +5 -0
  163. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_layout.scss +390 -0
  164. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_loading.scss +128 -0
  165. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_mixins.scss +1 -0
  166. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_mobile.scss +0 -0
  167. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_modal.scss +12 -0
  168. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_nav.scss +39 -0
  169. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_navbar.scss +122 -0
  170. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_others.scss +4 -0
  171. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_progress.scss +15 -0
  172. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_rtl.scss +287 -0
  173. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_sidebar.scss +462 -0
  174. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_switches.scss +286 -0
  175. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_tables.scss +20 -0
  176. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_temp.scss +39 -0
  177. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_typography.scss +36 -0
  178. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_utilities.scss +3 -0
  179. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_variables.scss +208 -0
  180. data/app/themes/default/assets/stylesheets/default/common/bootstrap/_widgets.scss +251 -0
  181. data/app/themes/default/assets/stylesheets/default/common/bootstrap/mixins/_all.scss +117 -0
  182. data/app/themes/default/assets/stylesheets/default/common/bootstrap/utilities/_background.scss +20 -0
  183. data/app/themes/default/assets/stylesheets/default/common/bootstrap/utilities/_borders.scss +17 -0
  184. data/app/themes/default/assets/stylesheets/default/common/bootstrap/utilities/_display.scss +14 -0
  185. data/app/themes/default/assets/stylesheets/default/frontend/core.scss +15 -0
  186. data/app/themes/default/assets/stylesheets/default/frontend.css +13 -0
  187. data/app/themes/default/views/layouts/auth.html.erb +35 -0
  188. data/app/themes/default/views/layouts/backend/_footer.html.erb +7 -0
  189. data/app/themes/default/views/layouts/backend/_header.html.erb +31 -0
  190. data/app/themes/default/views/layouts/backend/_sidebar.html.erb +53 -0
  191. data/app/themes/default/views/layouts/backend.html.erb +37 -0
  192. data/app/themes/default/views/layouts/frontend.liquid +22 -0
  193. data/app/uploaders/archangel/application_uploader.rb +65 -0
  194. data/app/uploaders/archangel/asset_uploader.rb +52 -0
  195. data/app/uploaders/archangel/avatar_uploader.rb +44 -0
  196. data/app/uploaders/archangel/favicon_uploader.rb +38 -0
  197. data/app/uploaders/archangel/logo_uploader.rb +44 -0
  198. data/app/views/archangel/backend/assets/_buttons.html.erb +18 -0
  199. data/app/views/archangel/backend/assets/_form.html.erb +27 -0
  200. data/app/views/archangel/backend/assets/edit.html.erb +21 -0
  201. data/app/views/archangel/backend/assets/index.html.erb +64 -0
  202. data/app/views/archangel/backend/assets/new.html.erb +21 -0
  203. data/app/views/archangel/backend/assets/show.html.erb +53 -0
  204. data/app/views/archangel/backend/collections/_buttons.html.erb +20 -0
  205. data/app/views/archangel/backend/collections/_field_fields.html.erb +9 -0
  206. data/app/views/archangel/backend/collections/_form.html.erb +24 -0
  207. data/app/views/archangel/backend/collections/edit.html.erb +21 -0
  208. data/app/views/archangel/backend/collections/index.html.erb +60 -0
  209. data/app/views/archangel/backend/collections/new.html.erb +21 -0
  210. data/app/views/archangel/backend/collections/show.html.erb +44 -0
  211. data/app/views/archangel/backend/dashboards/_buttons.html.erb +3 -0
  212. data/app/views/archangel/backend/dashboards/show.html.erb +23 -0
  213. data/app/views/archangel/backend/entries/_buttons.html.erb +20 -0
  214. data/app/views/archangel/backend/entries/_form.html.erb +25 -0
  215. data/app/views/archangel/backend/entries/edit.html.erb +21 -0
  216. data/app/views/archangel/backend/entries/index.html.erb +68 -0
  217. data/app/views/archangel/backend/entries/new.html.erb +21 -0
  218. data/app/views/archangel/backend/entries/show.html.erb +28 -0
  219. data/app/views/archangel/backend/pages/_buttons.html.erb +18 -0
  220. data/app/views/archangel/backend/pages/_form.html.erb +19 -0
  221. data/app/views/archangel/backend/pages/edit.html.erb +21 -0
  222. data/app/views/archangel/backend/pages/index.html.erb +68 -0
  223. data/app/views/archangel/backend/pages/new.html.erb +21 -0
  224. data/app/views/archangel/backend/pages/show.html.erb +49 -0
  225. data/app/views/archangel/backend/profiles/_buttons.html.erb +9 -0
  226. data/app/views/archangel/backend/profiles/_form.html.erb +31 -0
  227. data/app/views/archangel/backend/profiles/edit.html.erb +21 -0
  228. data/app/views/archangel/backend/profiles/show.html.erb +36 -0
  229. data/app/views/archangel/backend/sites/_additional_colors.html.erb +49 -0
  230. data/app/views/archangel/backend/sites/_alerts.html.erb +130 -0
  231. data/app/views/archangel/backend/sites/_badge.html.erb +99 -0
  232. data/app/views/archangel/backend/sites/_button.html.erb +243 -0
  233. data/app/views/archangel/backend/sites/_buttons.html.erb +9 -0
  234. data/app/views/archangel/backend/sites/_buttons_group.html.erb +230 -0
  235. data/app/views/archangel/backend/sites/_cards.html.erb +441 -0
  236. data/app/views/archangel/backend/sites/_carousel.html.erb +159 -0
  237. data/app/views/archangel/backend/sites/_colors.html.erb +41 -0
  238. data/app/views/archangel/backend/sites/_display_headings.html.erb +41 -0
  239. data/app/views/archangel/backend/sites/_dl.html.erb +38 -0
  240. data/app/views/archangel/backend/sites/_dropdowns.html.erb +475 -0
  241. data/app/views/archangel/backend/sites/_form.html.erb +37 -0
  242. data/app/views/archangel/backend/sites/_forms.html.erb +1176 -0
  243. data/app/views/archangel/backend/sites/_grays.html.erb +21 -0
  244. data/app/views/archangel/backend/sites/_headings.html.erb +21 -0
  245. data/app/views/archangel/backend/sites/_inline_text.html.erb +45 -0
  246. data/app/views/archangel/backend/sites/_jumbotron.html.erb +45 -0
  247. data/app/views/archangel/backend/sites/_list_group.html.erb +254 -0
  248. data/app/views/archangel/backend/sites/_modals.html.erb +41 -0
  249. data/app/views/archangel/backend/sites/_navs.html.erb +389 -0
  250. data/app/views/archangel/backend/sites/_pagination.html.erb +160 -0
  251. data/app/views/archangel/backend/sites/_social_buttons.html.erb +746 -0
  252. data/app/views/archangel/backend/sites/_tables.html.erb +372 -0
  253. data/app/views/archangel/backend/sites/edit.html.erb +21 -0
  254. data/app/views/archangel/backend/sites/sample.html.erb +38 -0
  255. data/app/views/archangel/backend/sites/show.html.erb +48 -0
  256. data/app/views/archangel/backend/templates/_buttons.html.erb +18 -0
  257. data/app/views/archangel/backend/templates/_form.html.erb +14 -0
  258. data/app/views/archangel/backend/templates/edit.html.erb +21 -0
  259. data/app/views/archangel/backend/templates/index.html.erb +60 -0
  260. data/app/views/archangel/backend/templates/new.html.erb +21 -0
  261. data/app/views/archangel/backend/templates/show.html.erb +34 -0
  262. data/app/views/archangel/backend/users/_buttons.html.erb +18 -0
  263. data/app/views/archangel/backend/users/_form.html.erb +24 -0
  264. data/app/views/archangel/backend/users/edit.html.erb +21 -0
  265. data/app/views/archangel/backend/users/index.html.erb +62 -0
  266. data/app/views/archangel/backend/users/new.html.erb +21 -0
  267. data/app/views/archangel/backend/users/show.html.erb +36 -0
  268. data/app/views/archangel/backend/widgets/_buttons.html.erb +18 -0
  269. data/app/views/archangel/backend/widgets/_form.html.erb +14 -0
  270. data/app/views/archangel/backend/widgets/edit.html.erb +21 -0
  271. data/app/views/archangel/backend/widgets/index.html.erb +60 -0
  272. data/app/views/archangel/backend/widgets/new.html.erb +21 -0
  273. data/app/views/archangel/backend/widgets/show.html.erb +42 -0
  274. data/app/views/archangel/errors/error_401.html.erb +13 -0
  275. data/app/views/archangel/errors/error_401.json.erb +4 -0
  276. data/app/views/archangel/errors/error_404.html.erb +13 -0
  277. data/app/views/archangel/errors/error_404.json.erb +4 -0
  278. data/app/views/archangel/frontend/pages/show.json.jbuilder +9 -0
  279. data/app/views/archangel/shared/_auth_token.html.erb +8 -0
  280. data/app/views/archangel/shared/_flash_messages.html.erb +9 -0
  281. data/app/views/devise/confirmations/new.html.erb +18 -0
  282. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  283. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  284. data/app/views/devise/mailer/password_change.html.erb +3 -0
  285. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  286. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  287. data/app/views/devise/passwords/edit.html.erb +28 -0
  288. data/app/views/devise/passwords/new.html.erb +18 -0
  289. data/app/views/devise/registrations/edit.html.erb +45 -0
  290. data/app/views/devise/registrations/new.html.erb +41 -0
  291. data/app/views/devise/sessions/new.html.erb +28 -0
  292. data/app/views/devise/shared/_links.html.erb +41 -0
  293. data/app/views/devise/unlocks/new.html.erb +18 -0
  294. data/app/views/kaminari/_first_page.html.erb +11 -0
  295. data/app/views/kaminari/_gap.html.erb +8 -0
  296. data/app/views/kaminari/_last_page.html.erb +11 -0
  297. data/app/views/kaminari/_next_page.html.erb +11 -0
  298. data/app/views/kaminari/_page.html.erb +12 -0
  299. data/app/views/kaminari/_paginator.html.erb +25 -0
  300. data/app/views/kaminari/_prev_page.html.erb +11 -0
  301. data/archangel.gemspec +52 -0
  302. data/archangel.png +0 -0
  303. data/bin/rails +13 -0
  304. data/config/brakeman.yml +3 -0
  305. data/config/initializers/assets.rb +12 -0
  306. data/config/initializers/carrierwave.rb +14 -0
  307. data/config/initializers/devise.rb +341 -0
  308. data/config/initializers/kaminari.rb +13 -0
  309. data/config/initializers/liquid.rb +4 -0
  310. data/config/initializers/meta_tags.rb +31 -0
  311. data/config/initializers/simple_form.rb +177 -0
  312. data/config/initializers/simple_form_bootstrap.rb +177 -0
  313. data/config/locales/active_record.en.yml +80 -0
  314. data/config/locales/devise.en.yml +64 -0
  315. data/config/locales/devise_invitable.en.yml +31 -0
  316. data/config/locales/en.yml +109 -0
  317. data/config/locales/kaminari.en.yml +17 -0
  318. data/config/locales/responders.en.yml +12 -0
  319. data/config/locales/simple_form.en.yml +34 -0
  320. data/config/routes.rb +176 -0
  321. data/db/migrate/20171003191001_create_archangel_sites.rb +19 -0
  322. data/db/migrate/20171003210347_create_archangel_users.rb +68 -0
  323. data/db/migrate/20171005205520_create_archangel_templates.rb +18 -0
  324. data/db/migrate/20171005224054_create_archangel_pages.rb +30 -0
  325. data/db/migrate/20171006175939_create_archangel_widgets.rb +20 -0
  326. data/db/migrate/20171006184844_create_archangel_assets.rb +18 -0
  327. data/db/migrate/20171006194044_create_archangel_collections.rb +17 -0
  328. data/db/migrate/20171006194855_create_archangel_fields.rb +23 -0
  329. data/db/migrate/20171006195023_create_archangel_entries.rb +18 -0
  330. data/db/seeds.rb +65 -0
  331. data/docs/Developers.md +3 -0
  332. data/docs/ExtensionDevelopers.md +3 -0
  333. data/docs/ExtensionIdeas.md +132 -0
  334. data/docs/Release.md +25 -0
  335. data/docs/ThemeDevelopers.md +3 -0
  336. data/lib/archangel/application_responder.rb +15 -0
  337. data/lib/archangel/config.rb +21 -0
  338. data/lib/archangel/constants/language.rb +13 -0
  339. data/lib/archangel/constants/role.rb +13 -0
  340. data/lib/archangel/constants/theme.rb +18 -0
  341. data/lib/archangel/engine.rb +70 -0
  342. data/lib/archangel/i18n.rb +40 -0
  343. data/lib/archangel/liquid/drop.rb +119 -0
  344. data/lib/archangel/liquid/drops/page_drop.rb +33 -0
  345. data/lib/archangel/liquid/drops/site_drop.rb +30 -0
  346. data/lib/archangel/liquid/filters/link_to_filter.rb +35 -0
  347. data/lib/archangel/liquid/tags/application_tag.rb +17 -0
  348. data/lib/archangel/liquid/tags/asset_tag.rb +146 -0
  349. data/lib/archangel/liquid/tags/collection_tag.rb +135 -0
  350. data/lib/archangel/liquid/tags/collectionfor_tag.rb +91 -0
  351. data/lib/archangel/liquid/tags/csrf_meta_tags_tag.rb +28 -0
  352. data/lib/archangel/liquid/tags/gist_tag.rb +102 -0
  353. data/lib/archangel/liquid/tags/locale_tag.rb +27 -0
  354. data/lib/archangel/liquid/tags/meta_tags_tag.rb +30 -0
  355. data/lib/archangel/liquid/tags/text_direction_tag.rb +28 -0
  356. data/lib/archangel/liquid/tags/theme_javascript_tag.rb +30 -0
  357. data/lib/archangel/liquid/tags/theme_stylesheet_tag.rb +30 -0
  358. data/lib/archangel/liquid/tags/vimeo_tag.rb +125 -0
  359. data/lib/archangel/liquid/tags/widget_tag.rb +91 -0
  360. data/lib/archangel/liquid/tags/youtube_tag.rb +138 -0
  361. data/lib/archangel/liquid_view.rb +92 -0
  362. data/lib/archangel/testing_support/context/view_controller_context.rb +55 -0
  363. data/lib/archangel/testing_support/factories/archangel_assets.rb +20 -0
  364. data/lib/archangel/testing_support/factories/archangel_collections.rb +23 -0
  365. data/lib/archangel/testing_support/factories/archangel_entries.rb +17 -0
  366. data/lib/archangel/testing_support/factories/archangel_fields.rb +20 -0
  367. data/lib/archangel/testing_support/factories/archangel_pages.rb +39 -0
  368. data/lib/archangel/testing_support/factories/archangel_sites.rb +22 -0
  369. data/lib/archangel/testing_support/factories/archangel_templates.rb +22 -0
  370. data/lib/archangel/testing_support/factories/archangel_users.rb +53 -0
  371. data/lib/archangel/testing_support/factories/archangel_widgets.rb +19 -0
  372. data/lib/archangel/testing_support/fixtures/favicon.png +0 -0
  373. data/lib/archangel/testing_support/fixtures/image.gif +0 -0
  374. data/lib/archangel/testing_support/fixtures/stylesheet.css +3 -0
  375. data/lib/archangel/testing_support/helpers/authorization_helpers.rb +58 -0
  376. data/lib/archangel/testing_support/helpers/controller_helpers.rb +20 -0
  377. data/lib/archangel/testing_support/helpers/form_helpers.rb +18 -0
  378. data/lib/archangel/testing_support/helpers/routing_helpers.rb +22 -0
  379. data/lib/archangel/testing_support/matchers/match_stdout.rb +37 -0
  380. data/lib/archangel/testing_support/matchers/pundit.rb +17 -0
  381. data/lib/archangel/testing_support/rake/dummy_rake.rb +63 -0
  382. data/lib/archangel/testing_support/shared_contexts/rake.rb +26 -0
  383. data/lib/archangel/testing_support/support/capybara.rb +9 -0
  384. data/lib/archangel/testing_support/support/carrierwave.rb +13 -0
  385. data/lib/archangel/testing_support/support/controller.rb +11 -0
  386. data/lib/archangel/testing_support/support/database_cleaner.rb +22 -0
  387. data/lib/archangel/testing_support/support/devise.rb +7 -0
  388. data/lib/archangel/testing_support/support/factory_bot.rb +17 -0
  389. data/lib/archangel/testing_support/support/inputs.rb +24 -0
  390. data/lib/archangel/testing_support/support/liquid_filters.rb +23 -0
  391. data/lib/archangel/testing_support/support/liquid_tags.rb +23 -0
  392. data/lib/archangel/testing_support/support/shoulda.rb +12 -0
  393. data/lib/archangel/testing_support/support/verify_partial_doubles.rb +21 -0
  394. data/lib/archangel/testing_support/support.rb +26 -0
  395. data/lib/archangel/theme/themable_controller.rb +90 -0
  396. data/lib/archangel/version.rb +16 -0
  397. data/lib/archangel.rb +93 -0
  398. data/lib/generators/archangel/dummy/dummy_generator.rb +148 -0
  399. data/lib/generators/archangel/dummy/templates/config/database.yml +48 -0
  400. data/lib/generators/archangel/install/install_generator.rb +202 -0
  401. data/lib/generators/archangel/install/templates/.env.sample +4 -0
  402. data/lib/generators/archangel/install/templates/config/archangel.yml +54 -0
  403. data/lib/generators/archangel/install/templates/config/initializers/carrierwave.rb +15 -0
  404. data/lib/generators/archangel/install/templates/config/initializers/devise.rb +17 -0
  405. data/lib/generators/archangel/install/templates/vendor/assets/javascripts/archangel/auth.js +3 -0
  406. data/lib/generators/archangel/install/templates/vendor/assets/javascripts/archangel/backend.js +3 -0
  407. data/lib/generators/archangel/install/templates/vendor/assets/javascripts/archangel/frontend.js +3 -0
  408. data/lib/generators/archangel/install/templates/vendor/assets/stylesheets/archangel/auth.css +5 -0
  409. data/lib/generators/archangel/install/templates/vendor/assets/stylesheets/archangel/backend.css +5 -0
  410. data/lib/generators/archangel/install/templates/vendor/assets/stylesheets/archangel/frontend.css +5 -0
  411. data/lib/tasks/archangel/version_task.rake +8 -0
  412. data/lib/templates/erb/scaffold/_form.html.erb +13 -0
  413. data/package.json +33 -0
  414. data/spec/controllers/archangel/application_controller_spec.rb +183 -0
  415. data/spec/controllers/archangel/auth/registrations_controller_spec.rb +10 -0
  416. data/spec/controllers/archangel/auth_controller_spec.rb +8 -0
  417. data/spec/controllers/archangel/backend/assets_controller_spec.rb +237 -0
  418. data/spec/controllers/archangel/backend/collections_controller_spec.rb +252 -0
  419. data/spec/controllers/archangel/backend/dashboards_controller_spec.rb +27 -0
  420. data/spec/controllers/archangel/backend/entries_controller_spec.rb +273 -0
  421. data/spec/controllers/archangel/backend/pages_controller_spec.rb +204 -0
  422. data/spec/controllers/archangel/backend/profiles_controller_spec.rb +115 -0
  423. data/spec/controllers/archangel/backend/sites_controller_spec.rb +137 -0
  424. data/spec/controllers/archangel/backend/templates_controller_spec.rb +190 -0
  425. data/spec/controllers/archangel/backend/users_controller_spec.rb +181 -0
  426. data/spec/controllers/archangel/backend/widgets_controller_spec.rb +190 -0
  427. data/spec/controllers/archangel/backend_controller_spec.rb +8 -0
  428. data/spec/controllers/archangel/frontend/pages_controller_spec.rb +54 -0
  429. data/spec/controllers/archangel/frontend_controller_spec.rb +8 -0
  430. data/spec/features/auth/log_in_spec.rb +96 -0
  431. data/spec/features/auth/log_out_spec.rb +18 -0
  432. data/spec/features/auth/registration_spec.rb +27 -0
  433. data/spec/features/backend/duplicate_page_slugs_spec.rb +41 -0
  434. data/spec/features/frontend/drop_variables_spec.rb +125 -0
  435. data/spec/features/frontend/homepage_redirect_spec.rb +15 -0
  436. data/spec/helpers/archangel/application_helper_spec.rb +30 -0
  437. data/spec/helpers/archangel/auth_helper_spec.rb +8 -0
  438. data/spec/helpers/archangel/backend/assets_helper_spec.rb +10 -0
  439. data/spec/helpers/archangel/backend/collections_helper_spec.rb +10 -0
  440. data/spec/helpers/archangel/backend/dashboards_helper_spec.rb +10 -0
  441. data/spec/helpers/archangel/backend/entries_helper_spec.rb +10 -0
  442. data/spec/helpers/archangel/backend/pages_helper_spec.rb +10 -0
  443. data/spec/helpers/archangel/backend/sites_helper_spec.rb +10 -0
  444. data/spec/helpers/archangel/backend/templates_helper_spec.rb +10 -0
  445. data/spec/helpers/archangel/backend/users_helper_spec.rb +10 -0
  446. data/spec/helpers/archangel/backend/widgets_helper_spec.rb +10 -0
  447. data/spec/helpers/archangel/backend_helper_spec.rb +8 -0
  448. data/spec/helpers/archangel/flash_helper_spec.rb +29 -0
  449. data/spec/helpers/archangel/frontend/pages_helper_spec.rb +10 -0
  450. data/spec/helpers/archangel/frontend_helper_spec.rb +8 -0
  451. data/spec/inputs/archangel/date_picker_input_spec.rb +15 -0
  452. data/spec/inputs/archangel/date_time_picker_input_spec.rb +15 -0
  453. data/spec/inputs/archangel/field_classification_input_spec.rb +19 -0
  454. data/spec/inputs/archangel/language_input_spec.rb +17 -0
  455. data/spec/inputs/archangel/meta_keywords_input_spec.rb +13 -0
  456. data/spec/inputs/archangel/role_input_spec.rb +18 -0
  457. data/spec/inputs/archangel/theme_input_spec.rb +17 -0
  458. data/spec/inputs/archangel/time_picker_input_spec.rb +15 -0
  459. data/spec/inputs/archangel/wysiwyg_input_spec.rb +15 -0
  460. data/spec/jobs/archangel/application_job_spec.rb +8 -0
  461. data/spec/lib/archangel/liquid/filters/link_to_filter_spec.rb +63 -0
  462. data/spec/lib/archangel/liquid/tags/application_tag_spec.rb +12 -0
  463. data/spec/lib/archangel/liquid/tags/asset_tag_spec.rb +90 -0
  464. data/spec/lib/archangel/liquid/tags/collection_tag_spec.rb +105 -0
  465. data/spec/lib/archangel/liquid/tags/collectionfor_tag_spec.rb +164 -0
  466. data/spec/lib/archangel/liquid/tags/csrf_meta_tags_tag_spec.rb +33 -0
  467. data/spec/lib/archangel/liquid/tags/gist_tag_spec.rb +42 -0
  468. data/spec/lib/archangel/liquid/tags/locale_tag_spec.rb +22 -0
  469. data/spec/lib/archangel/liquid/tags/meta_tags_tag_spec.rb +24 -0
  470. data/spec/lib/archangel/liquid/tags/text_direction_tag_spec.rb +32 -0
  471. data/spec/lib/archangel/liquid/tags/theme_javascript_tag_spec.rb +25 -0
  472. data/spec/lib/archangel/liquid/tags/theme_stylesheet_tag_spec.rb +27 -0
  473. data/spec/lib/archangel/liquid/tags/vimeo_tag_spec.rb +39 -0
  474. data/spec/lib/archangel/liquid/tags/widget_tag_spec.rb +59 -0
  475. data/spec/lib/archangel/liquid/tags/youtube_tag_spec.rb +39 -0
  476. data/spec/lib/tasks/archangel/version_task_spec.rb +13 -0
  477. data/spec/mailers/archangel/application_job_spec.rb +8 -0
  478. data/spec/models/archangel/asset_spec.rb +32 -0
  479. data/spec/models/archangel/collection_spec.rb +25 -0
  480. data/spec/models/archangel/entry_spec.rb +20 -0
  481. data/spec/models/archangel/field_spec.rb +29 -0
  482. data/spec/models/archangel/page_spec.rb +94 -0
  483. data/spec/models/archangel/site_spec.rb +11 -0
  484. data/spec/models/archangel/template_spec.rb +24 -0
  485. data/spec/models/archangel/user_spec.rb +66 -0
  486. data/spec/models/archangel/widget_spec.rb +29 -0
  487. data/spec/policies/archangel/application_policy_spec.rb +8 -0
  488. data/spec/policies/archangel/asset_policy_spec.rb +22 -0
  489. data/spec/policies/archangel/collection_policy_spec.rb +20 -0
  490. data/spec/policies/archangel/entries_policy_spec.rb +22 -0
  491. data/spec/policies/archangel/page_policy_spec.rb +20 -0
  492. data/spec/policies/archangel/site_policy_spec.rb +30 -0
  493. data/spec/policies/archangel/template_policy_spec.rb +20 -0
  494. data/spec/policies/archangel/user_policy_spec.rb +20 -0
  495. data/spec/policies/archangel/widget_policy_spec.rb +20 -0
  496. data/spec/rails_helper.rb +46 -0
  497. data/spec/services/archangel/render_service_spec.rb +37 -0
  498. data/spec/services/archangel/template_render_service_spec.rb +42 -0
  499. data/spec/spec_helper.rb +23 -0
  500. data/spec/support/coveralls.rb +5 -0
  501. data/spec/uploaders/archangel/application_uploader_spec.rb +15 -0
  502. data/spec/uploaders/archangel/asset_uploader_spec.rb +71 -0
  503. data/spec/uploaders/archangel/avatar_uploader_spec.rb +50 -0
  504. data/spec/uploaders/archangel/favicon_uploader_spec.rb +39 -0
  505. data/spec/uploaders/archangel/logo_uploader_spec.rb +50 -0
  506. data/vendor/assets/icons/trumbowyg/icons.svg +1 -0
  507. data/vendor/assets/javascripts/sortable/sortable.js +3 -0
  508. data/vendor/assets/javascripts/trumbowyg/plugins/allowtagsfrompaste/trumbowyg.allowtagsfrompaste.js +143 -0
  509. data/vendor/assets/javascripts/trumbowyg/plugins/base64/trumbowyg.base64.js +129 -0
  510. data/vendor/assets/javascripts/trumbowyg/plugins/cleanpaste/trumbowyg.cleanpaste.js +110 -0
  511. data/vendor/assets/javascripts/trumbowyg/plugins/colors/trumbowyg.colors.js +183 -0
  512. data/vendor/assets/javascripts/trumbowyg/plugins/noembed/trumbowyg.noembed.js +104 -0
  513. data/vendor/assets/javascripts/trumbowyg/plugins/upload/trumbowyg.upload.js +261 -0
  514. data/vendor/assets/javascripts/trumbowyg/trumbowyg.js +1765 -0
  515. data/vendor/assets/stylesheets/trumbowyg/_trumbowyg.scss +831 -0
  516. data/vendor/assets/stylesheets/trumbowyg/plugins/colors/_trumbowyg.colors.scss +38 -0
  517. metadata +1003 -0
@@ -0,0 +1,264 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # @see Archangel::BackendController
6
+ #
7
+ module Backend
8
+ ##
9
+ # Backend widgets controller
10
+ #
11
+ class WidgetsController < BackendController
12
+ before_action :set_resources, only: %i[index]
13
+ before_action :set_resource, only: %i[destroy edit show update]
14
+ before_action :set_new_resource, only: %i[create new]
15
+
16
+ ##
17
+ # Backend widgets
18
+ #
19
+ # Formats
20
+ # HTML, JSON
21
+ #
22
+ # Request
23
+ # GET /backend/widgets
24
+ # GET /backend/widgets.json
25
+ #
26
+ # Response
27
+ # [
28
+ # {
29
+ # "id": 123,
30
+ # "site_id": 123,
31
+ # "name": "Widget 1 Name",
32
+ # "slug": "widget_1_slug",
33
+ # "content": "</p>Content of Widget 1</p>",
34
+ # "template_id": 123,
35
+ # "deleted_at": null,
36
+ # "created_at": "YYYY-MM-DDTHH:MM:SS.MSZ",
37
+ # "updated_at": "YYYY-MM-DDTHH:MM:SS.MSZ"
38
+ # },
39
+ # ...
40
+ # ]
41
+ #
42
+ def index
43
+ respond_with @widgets
44
+ end
45
+
46
+ ##
47
+ # Backend widget
48
+ #
49
+ # Formats
50
+ # HTML, JSON
51
+ #
52
+ # Params
53
+ # [String] slug - the widget slug
54
+ #
55
+ # Request
56
+ # GET /backend/widgets/:slug
57
+ # GET /backend/widgets/:slug.json
58
+ #
59
+ # Response
60
+ # {
61
+ # "id": 123,
62
+ # "site_id": 123,
63
+ # "name": "Widget Name",
64
+ # "slug": "widget_slug",
65
+ # "content": "</p>Content of the Widget</p>",
66
+ # "template_id": 123,
67
+ # "deleted_at": null,
68
+ # "created_at": "YYYY-MM-DDTHH:MM:SS.MSZ",
69
+ # "updated_at": "YYYY-MM-DDTHH:MM:SS.MSZ"
70
+ # }
71
+ #
72
+ def show
73
+ respond_with @widget
74
+ end
75
+
76
+ ##
77
+ # New backend widget
78
+ #
79
+ # Formats
80
+ # HTML, JSON
81
+ #
82
+ # Request
83
+ # GET /backend/widgets/new
84
+ # GET /backend/widgets/new.json
85
+ #
86
+ # Response
87
+ # {
88
+ # "id": null,
89
+ # "site_id": 123,
90
+ # "name": null,
91
+ # "slug": null,
92
+ # "content": null,
93
+ # "template_id": null,
94
+ # "deleted_at": null,
95
+ # "created_at": null,
96
+ # "updated_at": null
97
+ # }
98
+ #
99
+ def new
100
+ respond_with @widget
101
+ end
102
+
103
+ ##
104
+ # Create backend widget
105
+ #
106
+ # Formats
107
+ # HTML, JSON
108
+ #
109
+ # Request
110
+ # POST /backend/widgets
111
+ # POST /backend/widgets.json
112
+ #
113
+ # Paramaters
114
+ # {
115
+ # "widget": {
116
+ # "name": "Widget Name",
117
+ # "slug": "widget_slug",
118
+ # "content": "</p>Content of the Widget</p>",
119
+ # "template_id": 123
120
+ # }
121
+ # }
122
+ #
123
+ def create
124
+ @widget.save
125
+
126
+ respond_with @widget, location: -> { location_after_create }
127
+ end
128
+
129
+ ##
130
+ # Edit backend widget
131
+ #
132
+ # Formats
133
+ # HTML, JSON
134
+ #
135
+ # Params
136
+ # [String] slug - the widget slug
137
+ #
138
+ # Request
139
+ # GET /backend/widgets/:slug/edit
140
+ # GET /backend/widgets/:slug/edit.json
141
+ #
142
+ # Response
143
+ # {
144
+ # "id": 123,
145
+ # "site_id": 123,
146
+ # "name": "Widget Name",
147
+ # "slug": "widget_slug",
148
+ # "content": "</p>Content of the Widget</p>",
149
+ # "template_id": 123,
150
+ # "deleted_at": null,
151
+ # "created_at": "YYYY-MM-DDTHH:MM:SS.MSZ",
152
+ # "updated_at": "YYYY-MM-DDTHH:MM:SS.MSZ"
153
+ # }
154
+ #
155
+ def edit
156
+ respond_with @widget
157
+ end
158
+
159
+ ##
160
+ # Update backend widget
161
+ #
162
+ # Formats
163
+ # HTML, JSON
164
+ #
165
+ # Params
166
+ # [String] slug - the widget slug
167
+ #
168
+ # Request
169
+ # PATCH /backend/widgets/:slug
170
+ # PATCH /backend/widgets/:slug.json
171
+ # PUT /backend/widgets/:slug
172
+ # PUT /backend/widgets/:slug.json
173
+ #
174
+ # Paramaters
175
+ # {
176
+ # "widget": {
177
+ # "name": "Widget Name",
178
+ # "slug": "widget_slug",
179
+ # "content": "</p>Content of the Widget</p>",
180
+ # "template_id": 123
181
+ # }
182
+ # }
183
+ #
184
+ def update
185
+ @widget.update(resource_params)
186
+
187
+ respond_with @widget, location: -> { location_after_update }
188
+ end
189
+
190
+ ##
191
+ # Destroy backend widget
192
+ #
193
+ # Formats
194
+ # HTML, JSON
195
+ #
196
+ # Params
197
+ # [String] slug - the widget slug
198
+ #
199
+ # Request
200
+ # DELETE /backend/widgets/:slug
201
+ # DELETE /backend/widgets/:slug.json
202
+ #
203
+ def destroy
204
+ @widget.destroy
205
+
206
+ respond_with @widget, location: -> { location_after_destroy }
207
+ end
208
+
209
+ protected
210
+
211
+ def permitted_attributes
212
+ %w[content name slug template_id]
213
+ end
214
+
215
+ def set_resources
216
+ @widgets = current_site.widgets
217
+ .order(name: :asc)
218
+ .page(page_num).per(per_page)
219
+
220
+ authorize @widgets
221
+ end
222
+
223
+ def set_resource
224
+ resource_id = params.fetch(:id)
225
+
226
+ @widget = current_site.widgets.find_by!(slug: resource_id)
227
+
228
+ authorize @widget
229
+ end
230
+
231
+ def set_new_resource
232
+ new_params = action_name.to_sym == :create ? resource_params : nil
233
+
234
+ @widget = current_site.widgets.new(new_params)
235
+
236
+ authorize @widget
237
+ end
238
+
239
+ def resource_params
240
+ params.require(resource_namespace).permit(permitted_attributes)
241
+ end
242
+
243
+ def resource_namespace
244
+ controller_name.singularize.to_sym
245
+ end
246
+
247
+ def location_after_create
248
+ location_after_save
249
+ end
250
+
251
+ def location_after_update
252
+ location_after_save
253
+ end
254
+
255
+ def location_after_destroy
256
+ location_after_save
257
+ end
258
+
259
+ def location_after_save
260
+ backend_widgets_path
261
+ end
262
+ end
263
+ end
264
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # Backend base controller
6
+ #
7
+ class BackendController < ApplicationController
8
+ include Pundit
9
+
10
+ include Archangel::AuthenticatableConcern
11
+ include Archangel::AuthorizableConcern
12
+
13
+ rescue_from Pundit::NotAuthorizedError, with: :render_401_error
14
+
15
+ protected
16
+
17
+ def layout_from_theme
18
+ "backend"
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # @see Archangel::FrontendController
6
+ #
7
+ module Frontend
8
+ ##
9
+ # Frontend pages controller
10
+ #
11
+ class PagesController < FrontendController
12
+ before_action :set_resource, only: %i[show]
13
+ before_action :assign_meta_tags, if: -> { request.get? },
14
+ unless: -> { request.xhr? }
15
+
16
+ ##
17
+ # Frontend page
18
+ #
19
+ # Formats
20
+ # HTML, JSON
21
+ #
22
+ # Params
23
+ # [String] path - the path to the page
24
+ #
25
+ # Request
26
+ # GET /:path
27
+ # GET /:path.json
28
+ #
29
+ # Response
30
+ # {
31
+ # "id": 123,
32
+ # "title": "Page Title",
33
+ # "path": "path/to/page",
34
+ # "content": "</p>Content of the page</p>",
35
+ # "homepage": false,
36
+ # "meta_keywords": "keywords, for, the, page",
37
+ # "meta_description": "Description of the page",
38
+ # "published_at": "YYYY-MM-DDTHH:MM:SS.MSZ",
39
+ # "created_at": "YYYY-MM-DDTHH:MM:SS.MSZ",
40
+ # "updated_at": "YYYY-MM-DDTHH:MM:SS.MSZ",
41
+ # }
42
+ #
43
+ def show
44
+ return redirect_to_homepage if redirect_to_homepage?
45
+
46
+ respond_to do |format|
47
+ format.html do
48
+ render inline: liquid_rendered_template_content,
49
+ layout: layout_from_theme
50
+ end
51
+ format.json do
52
+ @page.content = liquid_rendered_content
53
+
54
+ render json: @page, layout: false
55
+ end
56
+ end
57
+ end
58
+
59
+ protected
60
+
61
+ ##
62
+ # Find and assign resource to the view
63
+ #
64
+ def set_resource
65
+ page_path = params.fetch(:path, nil)
66
+
67
+ @page = page_path.blank? ? find_homepage : find_page(page_path)
68
+ end
69
+
70
+ ##
71
+ # Assign meta tags to view
72
+ #
73
+ def assign_meta_tags
74
+ apply_meta_tags(page_meta_tags)
75
+ end
76
+
77
+ ##
78
+ # Meta tags for the page
79
+ #
80
+ # @return [Object] the page meta tags
81
+ #
82
+ def page_meta_tags
83
+ {
84
+ title: @page.title,
85
+ description: @page.meta_description,
86
+ keywords: @page.meta_keywords.to_s.split(",")
87
+ }
88
+ end
89
+
90
+ ##
91
+ # Check to redirect to homepage root path
92
+ #
93
+ # @return [Boolean] redirect or not
94
+ #
95
+ def redirect_to_homepage?
96
+ return false unless @page
97
+
98
+ (params.fetch(:path, nil) == @page.path) && @page.homepage?
99
+ end
100
+
101
+ ##
102
+ # Redirect to homepage root path is page is marked as the homepage
103
+ #
104
+ def redirect_to_homepage
105
+ redirect_to root_path, status: :moved_permanently
106
+ end
107
+
108
+ ##
109
+ # Find the homepage
110
+ #
111
+ # @return [Object] the homepage
112
+ #
113
+ def find_homepage
114
+ current_site.pages.published.homepage.first!
115
+ end
116
+
117
+ ##
118
+ # Find the requested page
119
+ #
120
+ # @return [Object] the page
121
+ #
122
+ def find_page(path)
123
+ current_site.pages.published.find_by!(path: path)
124
+ end
125
+
126
+ ##
127
+ # Render content
128
+ #
129
+ # @return [String] the rendered Liquid content
130
+ #
131
+ def liquid_rendered_content
132
+ variables = default_liquid_assign
133
+
134
+ Archangel::RenderService.call(@page.content, variables)
135
+ end
136
+
137
+ ##
138
+ # Render content with template
139
+ #
140
+ # @return [String] the rendered Liquid template
141
+ #
142
+ def liquid_rendered_template_content
143
+ content = liquid_rendered_content
144
+ variables = default_liquid_assign.merge(content_for_layout: content)
145
+
146
+ Archangel::TemplateRenderService.call(@page.template, variables)
147
+ end
148
+
149
+ def default_liquid_assign
150
+ {
151
+ current_page: request.fullpath,
152
+ page: @page.to_liquid,
153
+ site: current_site.to_liquid
154
+ }
155
+ end
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # Frontend base controller
6
+ #
7
+ class FrontendController < ApplicationController
8
+ include Archangel::SeoableConcern
9
+ end
10
+ end
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # Controller action concern
6
+ #
7
+ module ActionableConcern
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ helper_method :action,
12
+ :action?,
13
+ :collection_action?,
14
+ :edit_action?,
15
+ :index_action?,
16
+ :member_action?,
17
+ :new_action?,
18
+ :restful_action?,
19
+ :save_action?,
20
+ :show_action?
21
+ end
22
+
23
+ # Controller action name as a symbol
24
+ #
25
+ # @return [Symbol] the action name
26
+ def action
27
+ action_name.to_sym
28
+ end
29
+
30
+ # Test if action is a collection action
31
+ #
32
+ # Actions include [:index]
33
+ #
34
+ # Collection actions can be modified by overwriting `#collection_actions`
35
+ #
36
+ # @return [Boolean] if action is a collection action
37
+ def collection_action?
38
+ collection_actions.include?(action)
39
+ end
40
+
41
+ # Test if action is an edit action
42
+ #
43
+ # Actions include [:edit, :update]
44
+ #
45
+ # Edit actions can be modified by overwriting `#edit_actions`
46
+ #
47
+ # @return [Boolean] if action is an edit action
48
+ def edit_action?
49
+ edit_actions.include?(action)
50
+ end
51
+
52
+ # Test if action is the `index` action
53
+ #
54
+ # @return [Boolean] if action is the index action
55
+ def index_action?
56
+ action?(:index)
57
+ end
58
+
59
+ # Test if action is a member action
60
+ #
61
+ # Actions include [:show, :edit, :update, :destroy]
62
+ #
63
+ # Member actions can be modified by overwriting `#member_actions`
64
+ #
65
+ # @return [Boolean] if action is an edit action
66
+ def member_action?
67
+ member_actions.include?(action)
68
+ end
69
+
70
+ # Test if action is a new action
71
+ #
72
+ # Actions include [:create, :new]
73
+ #
74
+ # New actions can be modified by overwriting `#new_actions`
75
+ #
76
+ # @return [Boolean] if action is an edit action
77
+ def new_action?
78
+ new_actions.include?(action)
79
+ end
80
+
81
+ # Test if action is a RESTful action
82
+ #
83
+ # Actions include [:index, :show, :new, :create, :edit, :update, :destroy]
84
+ #
85
+ # RESTful actions can be modified by overwriting `#restful_actions`
86
+ #
87
+ # @return [Boolean] if action is an edit action
88
+ def restful_action?
89
+ restful_actions.include?(action)
90
+ end
91
+
92
+ # Test if action is a save action
93
+ #
94
+ # Actions include [:create, :update, :destroy]
95
+ #
96
+ # Save actions can be modified by overwriting `#save_actions`
97
+ #
98
+ # @return [Boolean] if action is an edit action
99
+ def save_action?
100
+ save_actions.include?(action)
101
+ end
102
+
103
+ # Test if action is a show action
104
+ #
105
+ # Actions include [:show]
106
+ #
107
+ # Show actions can be modified by overwriting `#show_actions`
108
+ #
109
+ # @return [Boolean] if action is a show action
110
+ def show_action?
111
+ show_actions.include?(action)
112
+ end
113
+
114
+ protected
115
+
116
+ def action?(action_method)
117
+ action == action_method.to_sym
118
+ end
119
+
120
+ def collection_actions
121
+ %i[index]
122
+ end
123
+
124
+ def destroy_actions
125
+ %i[destroy]
126
+ end
127
+
128
+ def edit_actions
129
+ %i[edit update]
130
+ end
131
+
132
+ def member_actions
133
+ edit_actions + show_actions + destroy_actions
134
+ end
135
+
136
+ def new_actions
137
+ %i[create new]
138
+ end
139
+
140
+ def restful_actions
141
+ %i[create destroy edit index new show update]
142
+ end
143
+
144
+ def save_actions
145
+ %i[create destroy update]
146
+ end
147
+
148
+ def show_actions
149
+ %i[show]
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # Controller authenticate concern
6
+ #
7
+ module AuthenticatableConcern
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ before_action :authenticate_user!
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # Controller authorize concern
6
+ #
7
+ module AuthorizableConcern
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ after_action :verify_authorized
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # Controller pagination concern
6
+ #
7
+ module PaginatableConcern
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ helper_method :page_num, :per_page
12
+ end
13
+
14
+ # Record limt count
15
+ #
16
+ # @return [Integer] the record count limit
17
+ def per_page
18
+ params.fetch(:per, per_page_default).to_i
19
+ end
20
+
21
+ # Current page number
22
+ #
23
+ # @return [Integer] the page number
24
+ def page_num
25
+ params.fetch(Kaminari.config.param_name, 1).to_i
26
+ end
27
+
28
+ protected
29
+
30
+ def per_page_default
31
+ Kaminari.config.default_per_page
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Archangel
4
+ ##
5
+ # Controller SEO concern
6
+ #
7
+ module SeoableConcern
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ before_action :apply_default_meta_tags, if: -> { request.get? },
12
+ unless: -> { request.xhr? }
13
+ end
14
+
15
+ # Set meta tags
16
+ #
17
+ # @param meta_tags [Hash] list of meta tags
18
+ def apply_meta_tags(meta_tags = {})
19
+ set_meta_tags(meta_tags.reject { |_name, value| value.blank? })
20
+ end
21
+
22
+ protected
23
+
24
+ def apply_default_meta_tags
25
+ apply_meta_tags default_meta_tags
26
+ end
27
+
28
+ def default_meta_tags
29
+ {
30
+ reverse: true,
31
+ site: current_site.name,
32
+ canonical: request.url,
33
+ image_src: current_site.logo.url,
34
+ description: current_site.meta_description,
35
+ keywords: current_site.meta_keywords.to_s.split(","),
36
+ icon: current_site.favicon.url
37
+ }
38
+ end
39
+ end
40
+ end