cd2_catton_cms 1.1.10

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 (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