cd2_catton_cms 1.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (306) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +37 -0
  3. data/app/assets/config/c_manifest.js +2 -0
  4. data/app/assets/images/c/drag_handle.gif +0 -0
  5. data/app/assets/images/c/login_background.jpg +0 -0
  6. data/app/assets/images/c/main_application/hero.jpg +0 -0
  7. data/app/assets/images/c/main_application/search.png +0 -0
  8. data/app/assets/images/c/placeholder_product_image.png +0 -0
  9. data/app/assets/images/c/select_arrow_down_blk.png +0 -0
  10. data/app/assets/images/c/small_icon.png +0 -0
  11. data/app/assets/images/c/vendor/chosen-sprite.png +0 -0
  12. data/app/assets/javascripts/c/application.js +59 -0
  13. data/app/assets/javascripts/c/change_tag.js +49 -0
  14. data/app/assets/javascripts/c/chosen.js +2 -0
  15. data/app/assets/javascripts/c/confirm_delete.js +55 -0
  16. data/app/assets/javascripts/c/draggable_tree.js +223 -0
  17. data/app/assets/javascripts/c/dropzone_init.js +98 -0
  18. data/app/assets/javascripts/c/fake_table.js +87 -0
  19. data/app/assets/javascripts/c/master_form2/collection.js +180 -0
  20. data/app/assets/javascripts/c/master_form2/eu_cookie.js +1 -0
  21. data/app/assets/javascripts/c/master_form2/jrecord.js +116 -0
  22. data/app/assets/javascripts/c/master_form2/master_form.coffee +4 -0
  23. data/app/assets/javascripts/c/split_buttons.js.erb +15 -0
  24. data/app/assets/javascripts/c/things_to_be_done.js +138 -0
  25. data/app/assets/javascripts/c/unloadevent.js +35 -0
  26. data/app/assets/stylesheets/c/_core.sass +237 -0
  27. data/app/assets/stylesheets/c/_engine.sass +4 -0
  28. data/app/assets/stylesheets/c/_variables.sass +32 -0
  29. data/app/assets/stylesheets/c/_vendor.sass +6 -0
  30. data/app/assets/stylesheets/c/application/checkout/_cart.sass +85 -0
  31. data/app/assets/stylesheets/c/application/checkout/_checkout.sass +87 -0
  32. data/app/assets/stylesheets/c/application/elements/buttons.sass +34 -0
  33. data/app/assets/stylesheets/c/application/elements/forms.sass +135 -0
  34. data/app/assets/stylesheets/c/application/elements/shadows.sass +23 -0
  35. data/app/assets/stylesheets/c/application/partials/_breadcrumbs.sass +10 -0
  36. data/app/assets/stylesheets/c/application/partials/_categories_sidebars/_1.sass +53 -0
  37. data/app/assets/stylesheets/c/application/partials/_categories_sidebars/_2.sass +77 -0
  38. data/app/assets/stylesheets/c/application/partials/_footer.sass +43 -0
  39. data/app/assets/stylesheets/c/application/partials/_header.sass +317 -0
  40. data/app/assets/stylesheets/c/engine/_draggable_trees.sass +68 -0
  41. data/app/assets/stylesheets/c/engine/_form_pages.sass +153 -0
  42. data/app/assets/stylesheets/c/engine/_header_bar.sass +29 -0
  43. data/app/assets/stylesheets/c/engine/_index_header.sass +17 -0
  44. data/app/assets/stylesheets/c/engine/_layout.sass +15 -0
  45. data/app/assets/stylesheets/c/engine/_login.sass +38 -0
  46. data/app/assets/stylesheets/c/engine/_navbar.sass +19 -0
  47. data/app/assets/stylesheets/c/engine/_pagination.sass +16 -0
  48. data/app/assets/stylesheets/c/engine/_settings.sass +5 -0
  49. data/app/assets/stylesheets/c/engine/_sidebar.sass +20 -0
  50. data/app/assets/stylesheets/c/engine/_tables.sass +76 -0
  51. data/app/assets/stylesheets/c/engine/flash_messages.sass +2 -0
  52. data/app/assets/stylesheets/c/print_application.sass +167 -0
  53. data/app/assets/stylesheets/c/vendor/_flex_mixins.scss +394 -0
  54. data/app/assets/stylesheets/c/vendor/_normalize.sass +340 -0
  55. data/app/controllers/c/admin/blogs_controller.rb +57 -0
  56. data/app/controllers/c/admin/devise/passwords_controller.rb +5 -0
  57. data/app/controllers/c/admin/devise/sessions_controller.rb +5 -0
  58. data/app/controllers/c/admin/documents_controller.rb +50 -0
  59. data/app/controllers/c/admin/enquiries_controller.rb +22 -0
  60. data/app/controllers/c/admin/images_controller.rb +21 -0
  61. data/app/controllers/c/admin/locations_controller.rb +63 -0
  62. data/app/controllers/c/admin/menu_items_controller.rb +49 -0
  63. data/app/controllers/c/admin/pages_controller.rb +94 -0
  64. data/app/controllers/c/admin/projects_controller.rb +55 -0
  65. data/app/controllers/c/admin/redirects_controller.rb +55 -0
  66. data/app/controllers/c/admin/roles_controller.rb +49 -0
  67. data/app/controllers/c/admin/slides_controller.rb +50 -0
  68. data/app/controllers/c/admin/slideshows_controller.rb +34 -0
  69. data/app/controllers/c/admin/team_members_controller.rb +61 -0
  70. data/app/controllers/c/admin/testimonials_controller.rb +43 -0
  71. data/app/controllers/c/admin/users_controller.rb +51 -0
  72. data/app/controllers/c/admin_controller.rb +43 -0
  73. data/app/controllers/c/application_controller.rb +15 -0
  74. data/app/controllers/c/errors_controller.rb +12 -0
  75. data/app/controllers/c/front/devise/passwords_controller.rb +6 -0
  76. data/app/controllers/c/front/devise/registrations_controller.rb +32 -0
  77. data/app/controllers/c/front/devise/sessions_controller.rb +27 -0
  78. data/app/controllers/c/front/mailchimp_controller.rb +32 -0
  79. data/app/controllers/c/front_controller.rb +7 -0
  80. data/app/controllers/c/front_end/blogs_controller.rb +21 -0
  81. data/app/controllers/c/front_end/enquiries_controller.rb +32 -0
  82. data/app/controllers/c/front_end/pages_controller.rb +19 -0
  83. data/app/controllers/c/main_application_controller.rb +22 -0
  84. data/app/helpers/c/application_helper.rb +51 -0
  85. data/app/helpers/c/blogs_helper.rb +113 -0
  86. data/app/helpers/c/c_form_builder.rb +43 -0
  87. data/app/helpers/c/link_to_helper.rb +25 -0
  88. data/app/helpers/c/navigation_helper.rb +28 -0
  89. data/app/helpers/c/pages_helper.rb +27 -0
  90. data/app/helpers/c/storefront_helper.rb +63 -0
  91. data/app/mailers/c/application_mailer.rb +7 -0
  92. data/app/mailers/c/enquiries_mailer.rb +10 -0
  93. data/app/models/c/ability.rb +21 -0
  94. data/app/models/c/application_record.rb +6 -0
  95. data/app/models/c/author_record.rb +13 -0
  96. data/app/models/c/blog.rb +43 -0
  97. data/app/models/c/document.rb +17 -0
  98. data/app/models/c/enquiry.rb +95 -0
  99. data/app/models/c/image.rb +11 -0
  100. data/app/models/c/location.rb +18 -0
  101. data/app/models/c/menu_item.rb +35 -0
  102. data/app/models/c/non_delete.rb +10 -0
  103. data/app/models/c/page.rb +48 -0
  104. data/app/models/c/page_info.rb +16 -0
  105. data/app/models/c/permission.rb +9 -0
  106. data/app/models/c/permission_subject.rb +12 -0
  107. data/app/models/c/project.rb +20 -0
  108. data/app/models/c/redirect.rb +33 -0
  109. data/app/models/c/role.rb +18 -0
  110. data/app/models/c/slide.rb +16 -0
  111. data/app/models/c/slideshow.rb +23 -0
  112. data/app/models/c/team_member.rb +33 -0
  113. data/app/models/c/testimonial.rb +42 -0
  114. data/app/models/c/user.rb +42 -0
  115. data/app/models/c/user_role.rb +7 -0
  116. data/app/models/c/weight.rb +10 -0
  117. data/app/models/concerns/c/authorable.rb +18 -0
  118. data/app/models/concerns/c/documentable.rb +18 -0
  119. data/app/models/concerns/c/imageable.rb +49 -0
  120. data/app/models/concerns/c/non_deletable.rb +30 -0
  121. data/app/models/concerns/c/orderable.rb +30 -0
  122. data/app/models/concerns/c/previewable.rb +20 -0
  123. data/app/models/concerns/c/site_page.rb +89 -0
  124. data/app/uploaders/c/file_uploader.rb +9 -0
  125. data/app/uploaders/c/image_uploader.rb +39 -0
  126. data/app/views/c/admin/_background_jobs_dropdown.html.haml +18 -0
  127. data/app/views/c/admin/_bread_crumbs.html.haml +7 -0
  128. data/app/views/c/admin/_ebay_categories.html.haml +20 -0
  129. data/app/views/c/admin/_flash_messages.html.haml +5 -0
  130. data/app/views/c/admin/_header_bar.html.haml +18 -0
  131. data/app/views/c/admin/_index_table.html.haml +113 -0
  132. data/app/views/c/admin/_index_table_data.html.haml +17 -0
  133. data/app/views/c/admin/_navigation_bar.html.haml +1 -0
  134. data/app/views/c/admin/_preview_image.html.haml +2 -0
  135. data/app/views/c/admin/_preview_upload.html.haml +18 -0
  136. data/app/views/c/admin/_seo.html.haml +11 -0
  137. data/app/views/c/admin/_side_menu.html.haml +26 -0
  138. data/app/views/c/admin/_uploaded_images_new.html.haml +13 -0
  139. data/app/views/c/admin/blogs/_form.html.haml +58 -0
  140. data/app/views/c/admin/blogs/index.html.haml +9 -0
  141. data/app/views/c/admin/confirm_destroy.html.haml +6 -0
  142. data/app/views/c/admin/confirm_mass_destroy.html.haml +10 -0
  143. data/app/views/c/admin/documents/_form.html.haml +8 -0
  144. data/app/views/c/admin/documents/index.html.haml +9 -0
  145. data/app/views/c/admin/edit.html.haml +15 -0
  146. data/app/views/c/admin/enquiries/index.html.haml +14 -0
  147. data/app/views/c/admin/locations/_form.html.haml +58 -0
  148. data/app/views/c/admin/locations/index.html.haml +9 -0
  149. data/app/views/c/admin/menu_items/_form.html.haml +44 -0
  150. data/app/views/c/admin/menu_items/_menu_item_list_item.html.haml +10 -0
  151. data/app/views/c/admin/menu_items/index.html.haml +10 -0
  152. data/app/views/c/admin/new.html.haml +8 -0
  153. data/app/views/c/admin/pages/_form.html.haml +93 -0
  154. data/app/views/c/admin/pages/_page_list_item.html.haml +10 -0
  155. data/app/views/c/admin/pages/dashboard.html.erb +0 -0
  156. data/app/views/c/admin/pages/index.html.haml +11 -0
  157. data/app/views/c/admin/projects/_form.html.haml +46 -0
  158. data/app/views/c/admin/projects/index.html.haml +9 -0
  159. data/app/views/c/admin/quick_edit.js.erb +6 -0
  160. data/app/views/c/admin/redirects/_form.html.haml +14 -0
  161. data/app/views/c/admin/redirects/index.html.haml +9 -0
  162. data/app/views/c/admin/reload_images.js.erb +2 -0
  163. data/app/views/c/admin/roles/_form.html.haml +42 -0
  164. data/app/views/c/admin/roles/index.html.haml +17 -0
  165. data/app/views/c/admin/set_preview_image.js.erb +1 -0
  166. data/app/views/c/admin/show.html.haml +1 -0
  167. data/app/views/c/admin/slides/_form.html.haml +19 -0
  168. data/app/views/c/admin/slideshows/_form.html.haml +25 -0
  169. data/app/views/c/admin/slideshows/index.html.haml +8 -0
  170. data/app/views/c/admin/team_members/_form.html.haml +20 -0
  171. data/app/views/c/admin/team_members/index.html.haml +10 -0
  172. data/app/views/c/admin/testimonials/_form.html.haml +13 -0
  173. data/app/views/c/admin/testimonials/index.html.haml +8 -0
  174. data/app/views/c/admin/users/_form.html.haml +17 -0
  175. data/app/views/c/admin/users/index.html.haml +12 -0
  176. data/app/views/c/enquiries_mailer/new_enquiry.html.haml +14 -0
  177. data/app/views/c/enquiries_mailer/new_enquiry.text.haml +9 -0
  178. data/app/views/c/errors/404.html.haml +5 -0
  179. data/app/views/c/errors/500.html.haml +5 -0
  180. data/app/views/c/front/application/_category_item.html.haml +2 -0
  181. data/app/views/c/front/application/_menu_item.html.haml +4 -0
  182. data/app/views/c/front/application/_sales_highlight.html.haml +1 -0
  183. data/app/views/c/front/application/_slide.html.haml +6 -0
  184. data/app/views/c/front/blogs/_archive_filter_month.html.haml +2 -0
  185. data/app/views/c/front/blogs/_archive_filter_year.html.haml +1 -0
  186. data/app/views/c/front/blogs/_menu_item.html.haml +2 -0
  187. data/app/views/c/front_end/enquiries/new.html.haml +23 -0
  188. data/app/views/c/front_end/enquiries/thanks.html.haml +5 -0
  189. data/app/views/c/front_end/pages/_sales_highlight.html.haml +7 -0
  190. data/app/views/c/front_end/pages/about.html.haml +8 -0
  191. data/app/views/c/front_end/pages/home.html.haml +19 -0
  192. data/app/views/c/front_end/pages/search.html.haml +16 -0
  193. data/app/views/c/front_end/pages/show.html.haml +7 -0
  194. data/app/views/c/front_end/pages/sitemap.xml.builder +25 -0
  195. data/app/views/c/mailchimp/_signup_newsletter.html.haml +4 -0
  196. data/app/views/c/main_application/_application_bar.html.haml +22 -0
  197. data/app/views/c/main_application/_breadcrumbs.html.haml +7 -0
  198. data/app/views/c/main_application/_contact_info.html.haml +5 -0
  199. data/app/views/c/main_application/_footer.html.haml +49 -0
  200. data/app/views/c/main_application/_front_head_tags.html.haml +3 -0
  201. data/app/views/c/main_application/_header.html.haml +55 -0
  202. data/app/views/c/main_application/_site_search.html.haml +3 -0
  203. data/app/views/c/main_application/_yield.html.haml +5 -0
  204. data/app/views/devise/confirmations/new.html.erb +16 -0
  205. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  206. data/app/views/devise/mailer/password_change.html.erb +3 -0
  207. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  208. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  209. data/app/views/devise/passwords/edit.html.haml +26 -0
  210. data/app/views/devise/passwords/new.html.haml +14 -0
  211. data/app/views/devise/registrations/edit.html.haml +40 -0
  212. data/app/views/devise/registrations/new.html.haml +24 -0
  213. data/app/views/devise/sessions/new.html.haml +20 -0
  214. data/app/views/devise/shared/_links.html.erb +25 -0
  215. data/app/views/devise/unlocks/new.html.erb +16 -0
  216. data/app/views/layouts/c/application.html.haml +18 -0
  217. data/app/views/layouts/c/cms_login_layout.html.haml +18 -0
  218. data/app/views/layouts/c/mailer.html.erb +245 -0
  219. data/app/views/layouts/c/mailer.text.erb +3 -0
  220. data/app/views/layouts/c/main_application.html.haml +13 -0
  221. data/config/environment.rb +0 -0
  222. data/config/initializers/carrierwave.rb +18 -0
  223. data/config/initializers/devise.rb +283 -0
  224. data/config/initializers/rack_profiler.rb +8 -0
  225. data/config/locales/devise.en.yml +62 -0
  226. data/config/locales/en.yml +17 -0
  227. data/config/routes.rb +150 -0
  228. data/db/migrate/20160819000000_migrate_schema.rb +273 -0
  229. data/db/seed_data/countries.txt +227 -0
  230. data/lib/c/engine.rb +38 -0
  231. data/lib/c/version.rb +4 -0
  232. data/lib/cd2_catton_cms.rb +51 -0
  233. data/lib/tasks/c_tasks.rake +28 -0
  234. data/spec/dummy/Gemfile +4 -0
  235. data/spec/dummy/Gemfile.lock +20 -0
  236. data/spec/dummy/Rakefile +6 -0
  237. data/spec/dummy/app/assets/config/manifest.js +5 -0
  238. data/spec/dummy/app/assets/images/placeholder.png +0 -0
  239. data/spec/dummy/app/assets/javascripts/application.js +26 -0
  240. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  241. data/spec/dummy/app/assets/javascripts/pages.coffee +3 -0
  242. data/spec/dummy/app/assets/stylesheets/application.sass +13 -0
  243. data/spec/dummy/app/assets/stylesheets/c/application.sass +2 -0
  244. data/spec/dummy/app/controllers/application_controller.rb +10 -0
  245. data/spec/dummy/app/controllers/blogs_controller.rb +11 -0
  246. data/spec/dummy/app/controllers/pages_controller.rb +13 -0
  247. data/spec/dummy/app/models/application_record.rb +4 -0
  248. data/spec/dummy/app/models/page.rb +3 -0
  249. data/spec/dummy/bin/bundle +4 -0
  250. data/spec/dummy/bin/rails +5 -0
  251. data/spec/dummy/bin/rake +5 -0
  252. data/spec/dummy/bin/setup +35 -0
  253. data/spec/dummy/bin/update +30 -0
  254. data/spec/dummy/config/application.rb +17 -0
  255. data/spec/dummy/config/boot.rb +6 -0
  256. data/spec/dummy/config/cable.yml +9 -0
  257. data/spec/dummy/config/database.travis.yml +3 -0
  258. data/spec/dummy/config/database.yml +85 -0
  259. data/spec/dummy/config/environment.rb +6 -0
  260. data/spec/dummy/config/environments/development.rb +61 -0
  261. data/spec/dummy/config/environments/production.rb +87 -0
  262. data/spec/dummy/config/environments/test.rb +43 -0
  263. data/spec/dummy/config/initializers/application_controller_renderer.rb +7 -0
  264. data/spec/dummy/config/initializers/assets.rb +21 -0
  265. data/spec/dummy/config/initializers/backtrace_silencers.rb +8 -0
  266. data/spec/dummy/config/initializers/carrierwave.rb +15 -0
  267. data/spec/dummy/config/initializers/commercity.rb +4 -0
  268. data/spec/dummy/config/initializers/cookies_serializer.rb +6 -0
  269. data/spec/dummy/config/initializers/filter_parameter_logging.rb +5 -0
  270. data/spec/dummy/config/initializers/inflections.rb +17 -0
  271. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  272. data/spec/dummy/config/initializers/new_framework_defaults.rb +25 -0
  273. data/spec/dummy/config/initializers/session_store.rb +4 -0
  274. data/spec/dummy/config/initializers/wrap_parameters.rb +15 -0
  275. data/spec/dummy/config/locales/en.yml +23 -0
  276. data/spec/dummy/config/puma.rb +48 -0
  277. data/spec/dummy/config/routes.rb +4 -0
  278. data/spec/dummy/config/secrets.yml +22 -0
  279. data/spec/dummy/config/sidekiq.yml +6 -0
  280. data/spec/dummy/config/spring.rb +7 -0
  281. data/spec/dummy/config.ru +5 -0
  282. data/spec/dummy/db/schema.rb +1110 -0
  283. data/spec/dummy/lib/tasks/reprocess_images.rake +12 -0
  284. data/spec/dummy/lib/tasks/reset_all.rake +44 -0
  285. data/spec/dummy/lib/tasks/seeds/seed_blogs.rake +8 -0
  286. data/spec/dummy/lib/tasks/seeds/seed_pages.rake +24 -0
  287. data/spec/dummy/public/404.html +67 -0
  288. data/spec/dummy/public/422.html +67 -0
  289. data/spec/dummy/public/500.html +66 -0
  290. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  291. data/spec/dummy/public/apple-touch-icon.png +0 -0
  292. data/spec/dummy/public/favicon.ico +0 -0
  293. data/spec/dummy/seed/highlight1.png +0 -0
  294. data/spec/dummy/seed/highlight2.png +0 -0
  295. data/spec/dummy/seed/images/1/main.jpg +0 -0
  296. data/spec/dummy/seed/images/1/thumb.JPG +0 -0
  297. data/spec/dummy/seed/images/1/thumb2.jpg +0 -0
  298. data/spec/dummy/seed/images/2/main.jpeg +0 -0
  299. data/spec/dummy/seed/images/2/thumb.JPG +0 -0
  300. data/spec/dummy/seed/images/2/thumb2.JPG +0 -0
  301. data/spec/dummy/spec/models/redirect_spec.rb +57 -0
  302. data/spec/dummy/spec/support/factory_girl.rb +8 -0
  303. data/spec/dummy/spec/support/seed/images/product_image.png +0 -0
  304. data/spec/rails_helper.rb +49 -0
  305. data/spec/spec_helper.rb +52 -0
  306. metadata +734 -0
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ module ApplicationHelper
4
+ include FontAwesome::Rails::IconHelper
5
+ ActionView::Base.default_form_builder = CFormBuilder
6
+
7
+ def store_page_title(title)
8
+ title ? "#{title} | #{C.store_name}" : C.store_name
9
+ end
10
+
11
+ def path_exists?(path)
12
+ begin
13
+ C::Engine.routes.recognize_path(path)
14
+ rescue
15
+ return false
16
+ end
17
+ true
18
+ end
19
+
20
+ def content_can_tag(tag, action, subject, content, opts={}, &block)
21
+ return unless can? action, subject
22
+ if block
23
+ opts = content || {}
24
+ content = capture(&block)
25
+ end
26
+ content_tag tag, content, opts
27
+ end
28
+
29
+ def index_table(collection, index_data, opts={})
30
+ content_tag :div, class: 'data_table' do
31
+ render 'index_table', collection: collection, index_data: index_data, sortable: opts[:sortable], bulk_actions: opts[:bulk_actions]
32
+ end
33
+ end
34
+
35
+ def tinymce_standard
36
+ tinymce(height: 200,
37
+ menubar: false,
38
+ plugins: ['autolink lists link image media charmap anchor',
39
+ 'insertdatetime media table contextmenu paste code textcolor colorpicker'],
40
+ toolbar: 'undo redo styleselect bold italic alignleft aligncenter alignright alignjustify bullist numlist link media uploadimage forecolor')
41
+ end
42
+
43
+ def tinymce_light
44
+ tinymce(height: 200,
45
+ menubar: false,
46
+ plugins: ['lists'],
47
+ toolbar: 'undo redo | bold italic | bullist')
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+ # TODO: This file has a few rubocop issues but isnt being used - need to clear it up
3
+ # rubocop:disable all
4
+
5
+ module C
6
+ module BlogsHelper
7
+
8
+ def test_method
9
+ true
10
+ end
11
+
12
+ # Call in the controller to allow usage of blog_archive_menu and blog_archive_month_submenu
13
+ # Returns the collection of blogs filtered by the params
14
+ # Optionally accepts a limit for the size of the returned collection
15
+ def archive_blogs limit = nil
16
+ @blog_archive_filter_years, @blog_archive_filter_months = [[], []]
17
+
18
+ year = params[:year] || Time.now.year
19
+ if params[:month].to_i > 0 && params[:month].to_i < 13
20
+ month = params[:month]
21
+ else
22
+ month = Time.now.month
23
+ params[:month] = nil
24
+ end
25
+
26
+ if C::Blog.any?
27
+ age_limit = C::Blog.order(:created_at).limit(1).first&.created_at.beginning_of_year
28
+ num_years = Time.now.year - age_limit.year
29
+ @blog_archive_filter_years = (age_limit.year..(age_limit.year + num_years)).to_a.reverse
30
+ @blog_archive_filter_years.select! { |y| C::Blog.created_in_year(year: y).any? }
31
+ if age_limit.year.to_s == params[:year].to_s
32
+ @blog_archive_filter_months = (1..age_limit.month).to_a
33
+ else
34
+ @blog_archive_filter_months = (1..12).to_a
35
+ end
36
+ @blog_archive_filter_months.select! { |m| C::Blog.created_in_month(year: year, month: m).any? }
37
+ if params[:month]
38
+ return C::Blog.created_in_month(month: month, year: year, limit: limit).ordered
39
+ else
40
+ return C::Blog.created_in_year(year: year, limit: limit).ordered
41
+ end
42
+ end
43
+ return nil
44
+ end
45
+
46
+ # Returns html for a ul of links, which set params[:year]
47
+ # Only months from @blog_archive_filter_years are listed
48
+ # Also accepts an options hash
49
+ # The :permitted option expects an array of keys which are permitted to be included in the generated links
50
+ # The :submenu option expects a boolean, which can be used to disable rendering the month submenu
51
+ def blog_archive_menu options = {}
52
+ permitted = options[:permitted] || []
53
+ submenu = options[:submenu]
54
+ submenu = true if submenu.nil?
55
+
56
+ content_tag :ul do
57
+ result = ""
58
+
59
+ @blog_archive_filter_years.each do |filter_year|
60
+ if params[:year].to_s == filter_year.to_s
61
+ if submenu
62
+ if params[:month]
63
+ result += content_tag :li, (
64
+ (render partial: 'c/front/blogs/archive_filter_year', locals: {permitted: permitted, archive_filter_year: filter_year}) +
65
+ blog_archive_month_submenu(permitted: permitted)
66
+ )
67
+ else
68
+ result += content_tag :li, (
69
+ raw filter_year.to_s + blog_archive_month_submenu(permitted: permitted)
70
+ )
71
+ end
72
+ else
73
+ result += content_tag :li, filter_year.to_s
74
+ end
75
+ else
76
+ result += content_tag :li, (render partial: 'c/front/blogs/archive_filter_year', locals: {permitted: permitted, archive_filter_year: filter_year})
77
+ end
78
+ end
79
+ raw result
80
+ end
81
+ end
82
+
83
+ # Returns html for a ul of links, which set params[:month]
84
+ # Only months from @blog_archive_filter_months are listed
85
+ # Accepts an options hash
86
+ # The :permitted option expects an array of keys which are permitted to be included in the generated links
87
+ def blog_archive_month_submenu options = {}
88
+ permitted = options[:permitted] || []
89
+ content_tag :ul do
90
+ # render partial: 'c/front/blogs/archive_filter_month', collection: @blog_archive_filter_months, locals: {permitted: permitted}
91
+ result = ""
92
+ @blog_archive_filter_months.each do |filter_month|
93
+ if params[:month].to_s == filter_month.to_s
94
+ result += content_tag :li, (Date::MONTHNAMES[filter_month])
95
+ else
96
+ result += render partial: 'c/front/blogs/archive_filter_month', locals: {permitted: permitted, archive_filter_month: filter_month}
97
+ end
98
+ end
99
+ raw result
100
+ end
101
+ end
102
+
103
+ # Given a hash, permits only :month and :year
104
+ # Accepts an options hash
105
+ # The :permitted option expects an array of other keys to permit
106
+ def safe_params unsafe = {}, options = {}
107
+ permitted = options[:permitted] || []
108
+ permitted.push :month, :year
109
+ params.merge(unsafe).merge(only_path: true, script_name: nil).permit(permitted)
110
+ end
111
+
112
+ end
113
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class CFormBuilder < ActionView::Helpers::FormBuilder
4
+ def error_messages
5
+ return unless object.respond_to?(:errors) && object.errors.any?
6
+
7
+ header = @template.content_tag(:h4, 'Errors prevented the form from saving', class: 'title-error')
8
+ errors_array = object.errors.full_messages.map { |message| @template.content_tag(:li, message) }
9
+ errors_list = @template.safe_join([header, @template.safe_join(errors_array)])
10
+
11
+ @template.content_tag(:ul, @template.raw(errors_list), class: 'form_errors')
12
+ end
13
+
14
+ def price_field(method, _options={})
15
+ @template.field_set_tag '', class: 'price_field' do
16
+ @template.content_tag(:span, method.to_s.titleize.to_s, class: 'fieldset-title') +
17
+ fields_for(method) do |builder|
18
+ @template.content_tag(:div, class: 'gs') do
19
+ @template.content_tag(:div, class: 'field field--inner-label g-1') { builder.label(:without_tax) + builder.number_field(:without_tax, step: 0.01, min: 0) } +
20
+ @template.content_tag(:div, class: 'field field--inner-label g-1 g-gutter--narrow') { builder.label(:with_tax) + builder.number_field(:with_tax, step: 0.01, min: 0) } +
21
+ @template.content_tag(:div, class: 'field field--inner-label g-1 g-gutter--narrow') { builder.label(:tax_rate) + builder.number_field(:tax_rate, step: 0.01, min: 0) }
22
+ end +
23
+ builder.label(:override) { builder.check_box(:override) + @template.content_tag(:span, 'Override tax rate', class: 'checkbox-span-label') }
24
+ end
25
+ end
26
+ end
27
+
28
+ def image_field(method, options = {})
29
+ @template.field_set_tag '', class: 'image_field' do
30
+ @template.content_tag(:span, method.to_s.titleize, class: 'fieldset-title') +
31
+ hidden_field("#{method}_cache") +
32
+ (@template.image_tag(@object.send(method)) || '') +
33
+ file_field(method, options)
34
+ end
35
+ end
36
+
37
+ def tiny_mce_text_area(method, tinymce_config='standard')
38
+ text_area(method, class: 'tinymce') +
39
+ @template.send("tinymce_#{tinymce_config}")
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ module LinkToHelper
4
+ def link_to_delete(text, resource, opts={})
5
+ nested = [opts.delete(:nested) { [] }].flatten
6
+
7
+ opts[:data] ||= {}
8
+
9
+ url = opts.delete(:url) { nil }
10
+ redirection = opts.delete(:redirection) { nil }
11
+ opts[:data].merge!(delete_link: url || url_for([*nested, resource]),
12
+ after_delete_redirection: redirection)
13
+ link_to text, [:confirm_destroy, *nested, resource], opts
14
+ end
15
+
16
+ def link_to_add_fields(name, f, assoc, opts={})
17
+ new_object = f.object.send(assoc).build
18
+ id = new_object.object_id
19
+ fields = f.fields_for(assoc, new_object, child_index: id) do |builder|
20
+ render assoc.to_s.singularize + '_fields', f: builder
21
+ end
22
+ link_to name, '#', data: { fields: fields.gsub('\n', ''), fields_id: id }.merge(opts)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ module NavigationHelper
4
+ def ensure_navigation
5
+ @navigation ||= [{ title: 'Home', url: '/' }]
6
+ end
7
+
8
+ def navigation_add(title, url)
9
+ ensure_navigation << { title: title, url: url }
10
+ end
11
+
12
+ def render_navigation(partial = nil)
13
+ render partial: partial || 'c/admin/bread_crumbs', locals: { nav: ensure_navigation }
14
+ rescue
15
+ nil
16
+ end
17
+
18
+ def parent_navigation_add(nav)
19
+ @tree_navigation ||= []
20
+ @tree_navigation << { title: nav.name, url: nav }
21
+ if nav.parent
22
+ parent_navigation_add nav.parent
23
+ else
24
+ @tree_navigation.reverse.map { |node| ensure_navigation << node }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ module PagesHelper
4
+ def get_page(model, url=params[:id])
5
+ @page = if !url.present? || (url =~ /[^0-9]/)
6
+ model.get_from_url(url)
7
+ else
8
+ # This is accommodating a use-case that *will* result in problems, given enough products
9
+ model.find_by(id: url) || model.get_from_url(url)
10
+ end
11
+ begin
12
+ @page_info = @page.page_info
13
+ rescue NoMethodError
14
+ raise ActiveRecord::RecordNotFound
15
+ end
16
+ if @page.respond_to?('layout') && !@page.layout.blank? && @page.layout != 'show'
17
+ @render = @page.layout
18
+ else
19
+ @page
20
+ end
21
+ end
22
+
23
+ def force_clean_url(object)
24
+ redirect_to [:front_end, object] if object.url_alias && params[:id] != object.url_alias
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ module StorefrontHelper
4
+ def menu(menu_item_name, depth=1)
5
+ return unless (menu_item = C::MenuItem.find_by(machine_name: menu_item_name))
6
+ return unless menu_item.children.any?
7
+ content_tag :ul do
8
+ render partial: 'c/front/application/menu_item', collection: menu_item.children.includes(:page), cached: true, locals: { depth: depth }
9
+ end
10
+ end
11
+
12
+ def menu_items_for(menu_item_name, depth=1)
13
+ return unless (menu_item = C::MenuItem.find_by(machine_name: menu_item_name))
14
+ return unless menu_item.children.any?
15
+ render partial: 'c/front/application/menu_item', collection: menu_item.children.includes(:page), cached: true, locals: { depth: depth }
16
+ end
17
+
18
+ def category_root_menu
19
+ content_tag :ul do
20
+ render partial: 'c/front/application/category_item', collection: C::Category.find_all_by_generation(0)
21
+ end
22
+ end
23
+
24
+ def meta_tags
25
+ safe_join([page_title, meta_description]) if @page_info
26
+ end
27
+
28
+ def page_title
29
+ if @page_info.title.blank?
30
+ if @page_info.fallback_title.blank?
31
+ content_tag(:title, C.store_name)
32
+ else
33
+ content_tag(:title, @page_info.fallback_title)
34
+ end
35
+ else
36
+ content_tag(:title, @page_info.title)
37
+ end
38
+ end
39
+
40
+ def meta_description
41
+ return unless @page_info&.meta_description&.present?
42
+ tag :meta, name: :description, content: @page_info.meta_description
43
+ end
44
+
45
+ def slideshow(slideshow_name, klass=nil)
46
+ return 'No slideshow found' unless (slide_show = C::Slideshow.find_by(machine_name: slideshow_name))
47
+ content_tag :div, class: :slideshow do
48
+ content_tag :ul do
49
+ render partial: 'c/front/application/slide', collection: slide_show.slides.ordered, cached: true, locals: { klass: klass }
50
+ end
51
+ end
52
+ end
53
+
54
+ def sales_highlights(page)
55
+ case page
56
+ when :home
57
+ render partial: 'c/front/application/sales_highlight', collection: C::SalesHighlight.first(4), cached: true
58
+ when :store
59
+ render partial: 'c/front/application/sales_highlight', collection: C::SalesHighlight.first(3), cached: true
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class ApplicationMailer < ActionMailer::Base
4
+ default from: "#{C.store_name}<notifications@#{C.domain_name}>"
5
+ layout 'c/mailer'
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class EnquiriesMailer < ApplicationMailer
4
+ def new_enquiry(enq)
5
+ @enquiry = enq
6
+ @title = 'A new enquiry has been made'
7
+ mail to: C.order_notification_email, subject: 'New Enquiry'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class Ability
4
+ include CanCan::Ability
5
+
6
+ def initialize(user)
7
+ user ||= C::User.new
8
+ can :manage, :all if user
9
+
10
+ user.permissions.each do |permission|
11
+ opts = {}
12
+ opts[:id] = permission.subject_id if permission.subject_id
13
+
14
+ can [:read], permission.subject, opts if permission.read?
15
+ can [:new, :create], permission.subject, opts if permission.new?
16
+ can [:edit, :update], permission.subject, opts if permission.edit?
17
+ can [:destroy, :confirm_destroy], permission.subject, opts if permission.remove?
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class ApplicationRecord < ActiveRecord::Base
4
+ self.abstract_class = true
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class AuthorRecord < ApplicationRecord
4
+ belongs_to :authored, polymorphic: true
5
+ belongs_to :user
6
+
7
+ validates :user, presence: true
8
+
9
+ def author
10
+ user.name
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class Blog < ApplicationRecord
4
+ include SitePage
5
+ include Imageable
6
+ include Previewable
7
+ include Authorable
8
+
9
+ scope :ordered, -> { order created_at: :desc }
10
+
11
+ validates :name, presence: true
12
+
13
+ def self.created_in_date_range(start_date, end_date, options = {})
14
+ limit = options.delete(:limit)
15
+ Blog.where(created_at: start_date...end_date).limit(limit)
16
+ end
17
+
18
+ def self.created_in_month(options = {})
19
+ year = options[:year] || Time.now.year
20
+ month = options[:month] || Time.now.month
21
+ limit = options[:limit]
22
+ date_start = Time.new(year, month, 1, 0, 0, 0)
23
+ date_end = date_start.advance(months: 1)
24
+ created_in_date_range(date_start, date_end, limit: limit)
25
+ end
26
+
27
+ def self.created_in_year(options = {})
28
+ year = options[:year] || Time.now.year
29
+ limit = options[:limit]
30
+ date_start = Time.new(year, 1, 1, 0, 0, 0)
31
+ date_end = date_start.advance(years: 1)
32
+ created_in_date_range(date_start, date_end, limit: limit)
33
+ end
34
+
35
+ INDEX_TABLE = {
36
+ "Name": { link: { name: { call: 'name' }, options: '[:edit, object]' }, sort: 'name' },
37
+ "Author": { call: 'author', sort: 'author' },
38
+ "Published": { call: 'published', sort: 'published' },
39
+ "Created": { call: 'created_at', sort: 'published' },
40
+ "Edit": { link: { name: { text: 'edit' }, options: '[:edit, object]' } }
41
+ }.freeze
42
+ end
43
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class Document < ApplicationRecord
4
+ mount_uploader :document, C::FileUploader
5
+ validates :document, presence: true
6
+ belongs_to :documentable, polymorphic: true
7
+
8
+ INDEX_TABLE = {
9
+ "Name": { call: 'name' },
10
+ "File": { call: 'document.url' },
11
+ "Created": { call: 'created_at' },
12
+ "Delete": { link: { name: { text: 'Delete' }, options: '[object]', method: :delete, data: { confirm: 'Are you sure?' } } }
13
+ }.freeze
14
+
15
+ # TODO: Add edit to this, name should link to edit page
16
+ end
17
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class Enquiry < ApplicationRecord
4
+ enum job_type: [
5
+ 'Supply Only',
6
+ 'Supply and Fit',
7
+ ]
8
+
9
+ enum response_type: [
10
+ 'Callback',
11
+ 'Quote'
12
+ ]
13
+
14
+ enum timber_type: [
15
+ 'Hardwood',
16
+ 'European Oak',
17
+ 'Accoya',
18
+ 'Other',
19
+ ]
20
+
21
+ enum frame: [
22
+ 'Braemar',
23
+ 'Buttermilk',
24
+ 'Dove Grey',
25
+ 'Forest Green',
26
+ 'Garsenia',
27
+ 'Oxford Blue',
28
+ 'Poppy Red',
29
+ 'RAL7034',
30
+ 'Techno White',
31
+ 'Dark Oak',
32
+ 'Mahogany',
33
+ 'Rosewood',
34
+ 'Sikkins Teak',
35
+ 'African Walnut',
36
+ 'Antique Pine',
37
+ 'Ebony',
38
+ 'Jacobean Walnut',
39
+ 'Red Wood',
40
+ 'Saddolins Teak'
41
+ ]
42
+
43
+ enum handle: [
44
+ 'Chrome',
45
+ 'Black',
46
+ 'Gold',
47
+ 'Satin',
48
+ 'White',
49
+ 'Monkey Tail'
50
+ ]
51
+
52
+ mount_uploader :file, C::FileUploader
53
+
54
+ validates :phone, presence: true
55
+ validates :response_type, presence: true
56
+
57
+ validates :name, presence: true
58
+
59
+ scope :ordered, -> { order created_at: :desc }
60
+
61
+ def get_jobs_selected
62
+ this = []
63
+ this << 'Windows' if job_windows
64
+ this << 'Doors' if job_doors
65
+ this << 'Bi-Fold Doors' if job_bi
66
+ this << 'Conservatory' if job_conservatory
67
+ this << 'Lantern Tops' if job_lantern
68
+ this << 'Garden Rooms' if job_garden
69
+ this << 'Orangery' if job_orangery
70
+ this << "Other: #{job_string}" if job_other
71
+ return this.join(', ')
72
+ end
73
+
74
+ def get_timber_selected
75
+ if timber_type == 'Other'
76
+ return 'Other: ' + timber_string
77
+ else
78
+ return timber_type
79
+ end
80
+ end
81
+
82
+ VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
83
+ validates :email,
84
+ presence: true,
85
+ length: { maximum: 255 },
86
+ format: { with: VALID_EMAIL_REGEX }
87
+
88
+ INDEX_TABLE = {
89
+ "Name": { call: 'name', sort: 'name' },
90
+ "Email": { call: 'email', sort: 'email' },
91
+ "Message": { call: 'body' },
92
+ "Date": { call: 'created_at', sort: 'created_at' }
93
+ }.freeze
94
+ end
95
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class Image < ApplicationRecord
4
+ include Orderable
5
+
6
+ validates :image, presence: true
7
+ belongs_to :imageable, polymorphic: true
8
+
9
+ mount_uploader :image, ImageUploader
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class Location < ApplicationRecord
4
+ include SitePage
5
+ include Imageable
6
+ include Previewable
7
+ include Orderable
8
+
9
+ validates :name, presence: true
10
+
11
+ INDEX_TABLE = {
12
+ "Name": { link: { name: { call: 'name' }, options: '[:edit, object]' }, sort: 'name' },
13
+ "Published": { call: 'published', sort: 'published' },
14
+ "Created": { call: 'created_at', sort: 'published' },
15
+ "Edit": { link: { name: { text: 'edit' }, options: '[:edit, object]' } }
16
+ }.freeze
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class MenuItem < ApplicationRecord
4
+ has_closure_tree order: 'weight'
5
+
6
+ validates :machine_name, presence: true
7
+ validates :name, presence: true
8
+
9
+ belongs_to :page
10
+
11
+ before_validation on: :create do
12
+ self.machine_name = name
13
+ end
14
+
15
+ belongs_to :page
16
+
17
+ def self.depth_select_options(item)
18
+ opts = []
19
+ save_pair = proc do |level, i|
20
+ level.each do |key, value|
21
+ next if key.id == item.id
22
+ opts.append(["#{'-' * i}#{key.name}", key.id])
23
+ save_pair.call(value, i + 1) if value.class <= Hash
24
+ end
25
+ end
26
+ save_pair.call(hash_tree, 0)
27
+ opts
28
+ end
29
+
30
+ # Force non blank parametized machine name
31
+ def machine_name=(val)
32
+ super val.to_s.parameterize
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ module C
3
+ class NonDelete < ApplicationRecord
4
+ belongs_to :deletable, polymorphic: true
5
+
6
+ def readonly?
7
+ false
8
+ end
9
+ end
10
+ end