dm_cms 4.2.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (298) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README.md +31 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/javascripts/dm_cms/admin.js +58 -0
  6. data/app/assets/javascripts/dm_cms/application.js +16 -0
  7. data/app/assets/stylesheets/dm_cms/admin.css +3 -0
  8. data/app/assets/stylesheets/dm_cms/application.css +13 -0
  9. data/app/controllers/dm_cms/admin/admin_controller.rb +14 -0
  10. data/app/controllers/dm_cms/admin/cms_blogs_controller.rb +89 -0
  11. data/app/controllers/dm_cms/admin/cms_contentitems_controller.rb +96 -0
  12. data/app/controllers/dm_cms/admin/cms_pages_controller.rb +100 -0
  13. data/app/controllers/dm_cms/admin/cms_posts_controller.rb +67 -0
  14. data/app/controllers/dm_cms/admin/cms_snippets_controller.rb +73 -0
  15. data/app/controllers/dm_cms/admin/dashboard_controller.rb +12 -0
  16. data/app/controllers/dm_cms/admin/media_files_controller.rb +80 -0
  17. data/app/controllers/dm_cms/application_controller.rb +9 -0
  18. data/app/controllers/dm_cms/blogs_controller.rb +50 -0
  19. data/app/controllers/dm_cms/comments_controller.rb +3 -0
  20. data/app/controllers/dm_cms/contact_form_controller.rb +27 -0
  21. data/app/controllers/dm_cms/pages_controller.rb +67 -0
  22. data/app/controllers/dm_cms/posts_controller.rb +69 -0
  23. data/app/datatables/blog_user_datatable.rb +79 -0
  24. data/app/helpers/dm_cms/analytics_helper.rb +27 -0
  25. data/app/helpers/dm_cms/application_helper.rb +4 -0
  26. data/app/helpers/dm_cms/cms_contentitems_helper.rb +8 -0
  27. data/app/helpers/dm_cms/cms_pages_helper.rb +30 -0
  28. data/app/helpers/dm_cms/pages_helper.rb +204 -0
  29. data/app/helpers/dm_cms/posts_helper.rb +26 -0
  30. data/app/helpers/dm_cms/render_helper.rb +50 -0
  31. data/app/inputs/media_input.rb +17 -0
  32. data/app/liquid/tags/markdown.rb +30 -0
  33. data/app/mailers/post_notify_mailer.rb +36 -0
  34. data/app/models/cms_blog.rb +89 -0
  35. data/app/models/cms_contentitem.rb +76 -0
  36. data/app/models/cms_page.rb +227 -0
  37. data/app/models/cms_post.rb +76 -0
  38. data/app/models/cms_snippet.rb +42 -0
  39. data/app/models/contact_form.rb +28 -0
  40. data/app/models/dm_cms/concerns/ability.rb +54 -0
  41. data/app/models/dm_cms/permitted_params.rb +34 -0
  42. data/app/models/media_file.rb +102 -0
  43. data/app/presenters/cms_blog_presenter.rb +15 -0
  44. data/app/presenters/cms_page_presenter.rb +23 -0
  45. data/app/presenters/cms_post_presenter.rb +11 -0
  46. data/app/presenters/cms_snippet_presenter.rb +10 -0
  47. data/app/uploaders/media_uploader.rb +169 -0
  48. data/app/views/customized/analytics/_google_analytics.html.erb +11 -0
  49. data/app/views/dm_cms/admin/cms_blogs/_form.html.erb +34 -0
  50. data/app/views/dm_cms/admin/cms_blogs/edit.html.erb +2 -0
  51. data/app/views/dm_cms/admin/cms_blogs/index.html.erb +44 -0
  52. data/app/views/dm_cms/admin/cms_blogs/new.html.erb +2 -0
  53. data/app/views/dm_cms/admin/cms_blogs/show.html.erb +167 -0
  54. data/app/views/dm_cms/admin/cms_contentitems/_form.html.erb +43 -0
  55. data/app/views/dm_cms/admin/cms_contentitems/_form_dialog.html.erb +17 -0
  56. data/app/views/dm_cms/admin/cms_contentitems/edit.html.erb +1 -0
  57. data/app/views/dm_cms/admin/cms_contentitems/markdown.html.erb +21 -0
  58. data/app/views/dm_cms/admin/cms_contentitems/new_content.html.erb +1 -0
  59. data/app/views/dm_cms/admin/cms_pages/_content_toolbar.html.erb +11 -0
  60. data/app/views/dm_cms/admin/cms_pages/_form.html.erb +50 -0
  61. data/app/views/dm_cms/admin/cms_pages/_tree.html.erb +20 -0
  62. data/app/views/dm_cms/admin/cms_pages/_tree_sidebar.html.erb +8 -0
  63. data/app/views/dm_cms/admin/cms_pages/edit.html.erb +2 -0
  64. data/app/views/dm_cms/admin/cms_pages/index.html.erb +32 -0
  65. data/app/views/dm_cms/admin/cms_pages/new_page.html.erb +2 -0
  66. data/app/views/dm_cms/admin/cms_pages/show.html.erb +54 -0
  67. data/app/views/dm_cms/admin/cms_posts/_form.html.erb +59 -0
  68. data/app/views/dm_cms/admin/cms_posts/edit.html.erb +2 -0
  69. data/app/views/dm_cms/admin/cms_posts/new.html.erb +1 -0
  70. data/app/views/dm_cms/admin/cms_snippets/_form.html.erb +28 -0
  71. data/app/views/dm_cms/admin/cms_snippets/edit.html.erb +1 -0
  72. data/app/views/dm_cms/admin/cms_snippets/index.html.erb +29 -0
  73. data/app/views/dm_cms/admin/cms_snippets/new.html.erb +1 -0
  74. data/app/views/dm_cms/admin/dashboard/_widget_blog_comments.html.erb +37 -0
  75. data/app/views/dm_cms/admin/dashboard/widget_blog_comments.js.erb +1 -0
  76. data/app/views/dm_cms/admin/media_files/_form.html.erb +102 -0
  77. data/app/views/dm_cms/admin/media_files/edit.html.erb +3 -0
  78. data/app/views/dm_cms/admin/media_files/index.html.erb +98 -0
  79. data/app/views/dm_cms/admin/media_files/new.html.erb +3 -0
  80. data/app/views/dm_cms/admin/shared/_liquid_tags_ref.html.erb +35 -0
  81. data/app/views/dm_cms/blogs/show.html.erb +0 -0
  82. data/app/views/dm_cms/blogs/toggle_follow.js.coffee +5 -0
  83. data/app/views/dm_cms/contact_form/create.html.erb +2 -0
  84. data/app/views/dm_cms/contact_form/create.js.erb +2 -0
  85. data/app/views/dm_cms/pages/_content_fragment.html.erb +13 -0
  86. data/app/views/dm_cms/pages/_snippet_fragment.html.erb +12 -0
  87. data/app/views/dm_cms/pages/coming_soon.html.erb +2 -0
  88. data/app/views/dm_cms/pages/show.html.erb +0 -0
  89. data/app/views/dm_cms/posts/show.html.erb +0 -0
  90. data/app/views/dm_cms/shared/_comment.html.erb +22 -0
  91. data/app/views/dm_cms/shared/_comment_form.html.erb +16 -0
  92. data/app/views/dm_cms/shared/_comment_list.html.erb +11 -0
  93. data/app/views/dm_cms/shared/_social_buttons.html.erb +6 -0
  94. data/app/views/layouts/email_templates/dm_cms_email_layout.html.erb +320 -0
  95. data/app/views/layouts/email_templates/dm_cms_email_layout.text.erb +1 -0
  96. data/app/views/layouts/email_templates/dm_cms_post_notify.html.erb +13 -0
  97. data/app/views/layouts/email_templates/dm_cms_post_notify.text.erb +9 -0
  98. data/app/views/liquid_tags/_contact_form.html.erb +17 -0
  99. data/config/initializers/liquid_init.rb +2 -0
  100. data/config/locales/cms.cs.yml +42 -0
  101. data/config/locales/cms.de.yml +42 -0
  102. data/config/locales/cms.en.yml +42 -0
  103. data/config/locales/cms.fi.yml +42 -0
  104. data/config/locales/cms.ja.yml +42 -0
  105. data/config/routes.rb +70 -0
  106. data/db/migrate/20121103181909_create_cms.rb +91 -0
  107. data/db/migrate/20130206213720_add_account_to_cms.rb +10 -0
  108. data/db/migrate/20130507123255_create_blog.rb +61 -0
  109. data/db/migrate/20130531212537_add_notification_sent.rb +5 -0
  110. data/db/migrate/20130605184116_add_blog_comment.rb +7 -0
  111. data/db/migrate/20131128201053_add_blog_image.rb +5 -0
  112. data/db/migrate/20140217135228_rename_snippet_slug.rb +13 -0
  113. data/db/migrate/20140303121217_add_requires_subscription_blog.rb +7 -0
  114. data/db/migrate/20140328205246_add_pages_ranked_model.rb +22 -0
  115. data/db/migrate/20140423113417_add_blog_owner.rb +6 -0
  116. data/db/migrate/20140428122156_create_media_files.rb +29 -0
  117. data/db/migrate/20140523134543_add_cmspage_summary.rb +6 -0
  118. data/db/migrate/20140601151631_add_blog_image_email_header.rb +5 -0
  119. data/db/migrate/20141004154725_add_header_image.rb +9 -0
  120. data/db/migrate/20160821150108_index_foreign_keys_in_cms_blogs.rb +6 -0
  121. data/db/migrate/20160821150109_index_foreign_keys_in_cms_media_files.rb +6 -0
  122. data/db/migrate/20160821150110_index_foreign_keys_in_cms_posts.rb +6 -0
  123. data/lib/dm_cms.rb +4 -0
  124. data/lib/dm_cms/engine.rb +16 -0
  125. data/lib/dm_cms/liquid/filters/liquid_filters.rb +11 -0
  126. data/lib/dm_cms/liquid/tags/contact_form.rb +35 -0
  127. data/lib/dm_cms/liquid/tags/div.rb +42 -0
  128. data/lib/dm_cms/liquid/tags/image.rb +76 -0
  129. data/lib/dm_cms/liquid/tags/quote.rb +38 -0
  130. data/lib/dm_cms/liquid/tags/snippet.rb +37 -0
  131. data/lib/dm_cms/liquid/tags/url_asset.rb +41 -0
  132. data/lib/dm_cms/liquid/tags/url_media.rb +42 -0
  133. data/lib/dm_cms/liquid/tags/url_protected.rb +31 -0
  134. data/lib/tasks/dm_cms_tasks.rake +4 -0
  135. data/spec/controllers/admin/cms_blogs_controller_spec.rb +173 -0
  136. data/spec/controllers/admin/cms_pages_controller_spec.rb +182 -0
  137. data/spec/controllers/admin/cms_posts_controller_spec.rb +166 -0
  138. data/spec/dummy/README.rdoc +28 -0
  139. data/spec/dummy/Rakefile +6 -0
  140. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  141. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  142. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  143. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  144. data/spec/dummy/app/models/ability.rb +12 -0
  145. data/spec/dummy/app/models/user.rb +6 -0
  146. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  147. data/spec/dummy/bin/bundle +3 -0
  148. data/spec/dummy/bin/rails +4 -0
  149. data/spec/dummy/bin/rake +4 -0
  150. data/spec/dummy/config.ru +4 -0
  151. data/spec/dummy/config/application.rb +26 -0
  152. data/spec/dummy/config/boot.rb +5 -0
  153. data/spec/dummy/config/database.yml +25 -0
  154. data/spec/dummy/config/environment.rb +5 -0
  155. data/spec/dummy/config/environments/development.rb +37 -0
  156. data/spec/dummy/config/environments/production.rb +82 -0
  157. data/spec/dummy/config/environments/test.rb +39 -0
  158. data/spec/dummy/config/initializers/_themes_for_rails.rb +39 -0
  159. data/spec/dummy/config/initializers/account_initialization.rb +28 -0
  160. data/spec/dummy/config/initializers/assets.rb +8 -0
  161. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  162. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  163. data/spec/dummy/config/initializers/dm_core.rb +6 -0
  164. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  165. data/spec/dummy/config/initializers/inflections.rb +16 -0
  166. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  167. data/spec/dummy/config/initializers/session_store.rb +3 -0
  168. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  169. data/spec/dummy/config/locales/en.yml +23 -0
  170. data/spec/dummy/config/routes.rb +19 -0
  171. data/spec/dummy/config/secrets.yml +22 -0
  172. data/spec/dummy/db/development.sqlite3 +0 -0
  173. data/spec/dummy/db/migrate/20141114170927_add_globalize_countries.dm_core.rb +50 -0
  174. data/spec/dummy/db/migrate/20141114170928_devise_create_users.dm_core.rb +46 -0
  175. data/spec/dummy/db/migrate/20141114170929_add_user_fields.dm_core.rb +14 -0
  176. data/spec/dummy/db/migrate/20141114170930_rolify_create_roles.dm_core.rb +20 -0
  177. data/spec/dummy/db/migrate/20141114170931_add_last_access.dm_core.rb +10 -0
  178. data/spec/dummy/db/migrate/20141114170932_create_versions.dm_core.rb +19 -0
  179. data/spec/dummy/db/migrate/20141114170933_add_object_changes_column_to_versions.dm_core.rb +12 -0
  180. data/spec/dummy/db/migrate/20141114170934_create_dm_core_accounts.dm_core.rb +13 -0
  181. data/spec/dummy/db/migrate/20141114170935_add_account_to_users.dm_core.rb +9 -0
  182. data/spec/dummy/db/migrate/20141114170936_create_preferences.dm_core.rb +13 -0
  183. data/spec/dummy/db/migrate/20141114170937_create_comments.dm_core.rb +22 -0
  184. data/spec/dummy/db/migrate/20141114170938_add_activity.dm_core.rb +21 -0
  185. data/spec/dummy/db/migrate/20141114170939_add_type_to_comments.dm_core.rb +9 -0
  186. data/spec/dummy/db/migrate/20141114170940_add_category.dm_core.rb +28 -0
  187. data/spec/dummy/db/migrate/20141114170941_create_email_table.dm_core.rb +26 -0
  188. data/spec/dummy/db/migrate/20141114170942_add_user_profile.dm_core.rb +46 -0
  189. data/spec/dummy/db/migrate/20141114170943_add_profile_email.dm_core.rb +14 -0
  190. data/spec/dummy/db/migrate/20141114170944_create_payment_history.dm_core.rb +37 -0
  191. data/spec/dummy/db/migrate/20141114170945_change_anchor_field.dm_core.rb +10 -0
  192. data/spec/dummy/db/migrate/20141114170946_create_user_site_profile.dm_core.rb +27 -0
  193. data/spec/dummy/db/migrate/20141114170947_add_avatar.dm_core.rb +12 -0
  194. data/spec/dummy/db/migrate/20141114170948_add_notify_to_payment_history.dm_core.rb +8 -0
  195. data/spec/dummy/db/migrate/20141114170949_acts_as_votable_migration.dm_core.rb +28 -0
  196. data/spec/dummy/db/migrate/20141114170950_add_user_site_profile_uuid.dm_core.rb +19 -0
  197. data/spec/dummy/db/migrate/20141114170951_add_invoice_id.dm_core.rb +7 -0
  198. data/spec/dummy/db/migrate/20141114170952_acts_as_follower_migration.dm_core.rb +18 -0
  199. data/spec/dummy/db/migrate/20141114170953_rename_invoice_id.dm_core.rb +12 -0
  200. data/spec/dummy/db/migrate/20141114170954_add_core_addresses.dm_core.rb +18 -0
  201. data/spec/dummy/db/migrate/20141114170955_papertrail_increase_column.dm_core.rb +9 -0
  202. data/spec/dummy/db/migrate/20141114170956_acts_as_taggable_on_migration.dm_core.rb +32 -0
  203. data/spec/dummy/db/migrate/20141114170957_add_missing_unique_indices.dm_core.rb +23 -0
  204. data/spec/dummy/db/migrate/20141114170958_add_taggings_counter_cache_to_tags.dm_core.rb +16 -0
  205. data/spec/dummy/db/migrate/20141114170959_create_custom_fields.dm_core.rb +40 -0
  206. data/spec/dummy/db/migrate/20141114170960_add_missing_taggable_index.dm_core.rb +11 -0
  207. data/spec/dummy/db/migrate/20141114170961_create_documents.dm_knowledge.rb +19 -0
  208. data/spec/dummy/db/migrate/20141114170962_add_document_notes.dm_knowledge.rb +7 -0
  209. data/spec/dummy/db/migrate/20160128134522_add_favored_locale.dm_core.rb +17 -0
  210. data/spec/dummy/db/migrate/20160128134523_update_papertrail_v4.dm_core.rb +41 -0
  211. data/spec/dummy/db/schema.rb +590 -0
  212. data/spec/dummy/db/seeds.rb +18 -0
  213. data/spec/dummy/public/404.html +67 -0
  214. data/spec/dummy/public/422.html +67 -0
  215. data/spec/dummy/public/500.html +66 -0
  216. data/spec/dummy/public/favicon.ico +0 -0
  217. data/spec/dummy/themes/_mbus/_readme.md +6 -0
  218. data/spec/dummy/themes/_mbus/_theme.yml +21 -0
  219. data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/application.js +9 -0
  220. data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/bootstrap.js +2114 -0
  221. data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/bootstrap.min.js +6 -0
  222. data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/contact_me.js +75 -0
  223. data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/jqBootstrapValidation.js +912 -0
  224. data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/jquery-1.11.0.js +4 -0
  225. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/application.css +14 -0
  226. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/bootstrap.css +6203 -0
  227. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/bootstrap.min.css +5 -0
  228. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/css/font-awesome.css +1566 -0
  229. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/css/font-awesome.min.css +4 -0
  230. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/FontAwesome.otf +0 -0
  231. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/fontawesome-webfont.eot +0 -0
  232. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/fontawesome-webfont.svg +504 -0
  233. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf +0 -0
  234. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/fontawesome-webfont.woff +0 -0
  235. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/bordered-pulled.less +16 -0
  236. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/core.less +12 -0
  237. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/fixed-width.less +6 -0
  238. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/font-awesome.less +17 -0
  239. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/icons.less +506 -0
  240. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/larger.less +13 -0
  241. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/list.less +19 -0
  242. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/mixins.less +20 -0
  243. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/path.less +14 -0
  244. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/rotated-flipped.less +9 -0
  245. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/spinning.less +32 -0
  246. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/stacked.less +20 -0
  247. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/variables.less +515 -0
  248. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_bordered-pulled.scss +16 -0
  249. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_core.scss +12 -0
  250. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_fixed-width.scss +6 -0
  251. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_icons.scss +506 -0
  252. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_larger.scss +13 -0
  253. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_list.scss +19 -0
  254. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_mixins.scss +20 -0
  255. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_path.scss +14 -0
  256. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_rotated-flipped.scss +9 -0
  257. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_spinning.scss +32 -0
  258. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_stacked.scss +20 -0
  259. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_variables.scss +515 -0
  260. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/font-awesome.scss +17 -0
  261. data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/modern-business.css +93 -0
  262. data/spec/dummy/themes/_mbus/theme_support/config/load_theme.rb +0 -0
  263. data/spec/dummy/themes/_mbus/theme_support/locales/site.cs.yml +57 -0
  264. data/spec/dummy/themes/_mbus/theme_support/locales/site.de.yml +57 -0
  265. data/spec/dummy/themes/_mbus/theme_support/locales/site.en.yml +57 -0
  266. data/spec/dummy/themes/_mbus/theme_support/locales/site.fi.yml +58 -0
  267. data/spec/dummy/themes/_mbus/theme_support/locales/site.ja.yml +57 -0
  268. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_blog_right_sidebar.html.erb +91 -0
  269. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_comment.html.erb +21 -0
  270. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_comment_form.html.erb +16 -0
  271. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_comment_list.html.erb +7 -0
  272. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_comment_section.html.erb +17 -0
  273. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_page_footer.html.erb +11 -0
  274. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_page_header.html.erb +39 -0
  275. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_page_top.html.erb +24 -0
  276. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_post_summary_item.html.erb +11 -0
  277. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_social_buttons_initialization.html.erb +10 -0
  278. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/blog.html.erb +47 -0
  279. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/blog_post.html.erb +55 -0
  280. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/content_full_width.html.erb +28 -0
  281. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/content_with_left_nav.html.erb +44 -0
  282. data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/index.html.erb +19 -0
  283. data/spec/dummy/themes/local/_theme.yml +8 -0
  284. data/spec/factories/accounts.rb +17 -0
  285. data/spec/factories/blogs.rb +19 -0
  286. data/spec/factories/posts.rb +23 -0
  287. data/spec/factories/user_profiles.rb +10 -0
  288. data/spec/factories/users.rb +19 -0
  289. data/spec/features/admin/blog_admin_spec.rb +16 -0
  290. data/spec/models/cms_blog_spec.rb +37 -0
  291. data/spec/models/cms_page_spec.rb +9 -0
  292. data/spec/models/cms_post_spec.rb +44 -0
  293. data/spec/rails_helper.rb +70 -0
  294. data/spec/spec_helper.rb +85 -0
  295. data/spec/support/accounts.rb +17 -0
  296. data/spec/support/devise.rb +44 -0
  297. data/spec/support/fix_locale.rb +57 -0
  298. metadata +545 -0
@@ -0,0 +1,79 @@
1
+ class BlogUserDatatable
2
+ include ActionView::Helpers::TagHelper
3
+
4
+ delegate :params, :link_to, :image_tag, :number_to_currency, :time_ago_in_words, to: :@view
5
+ delegate :url_helpers, to: 'DmCms::Engine.routes'
6
+
7
+ #------------------------------------------------------------------------------
8
+ def initialize(view, blog)
9
+ @view = view
10
+ @blog = blog
11
+ end
12
+
13
+ #------------------------------------------------------------------------------
14
+ def as_json(options = {})
15
+ {
16
+ sEcho: params[:sEcho].to_i,
17
+ iTotalRecords: User.count,
18
+ iTotalDisplayRecords: users.total_entries,
19
+ aaData: data
20
+ }
21
+ end
22
+
23
+ private
24
+
25
+ #------------------------------------------------------------------------------
26
+ def data
27
+ users.map do |user|
28
+ [
29
+ action(user),
30
+ user.country.nil? ? 'n/a' : user.country.english_name,
31
+ ]
32
+ end
33
+ end
34
+
35
+ #------------------------------------------------------------------------------
36
+ def users
37
+ @users ||= fetch_users
38
+ end
39
+
40
+ #------------------------------------------------------------------------------
41
+ def fetch_users
42
+ users = User.includes(:user_profile => [ :country ] ).references(:user_profile).order("#{sort_column} #{sort_direction}")
43
+ users = users.page(page).per_page(per_page)
44
+ if params[:sSearch].present?
45
+ users = users.where("LOWER(user_profiles.first_name) like :search OR LOWER(user_profiles.last_name) like :search OR LOWER(users.email) like :search", search: "%#{params[:sSearch]}%".downcase)
46
+ end
47
+ users
48
+ end
49
+
50
+ #------------------------------------------------------------------------------
51
+ def page
52
+ params[:iDisplayStart].to_i/per_page + 1
53
+ end
54
+
55
+ #------------------------------------------------------------------------------
56
+ def per_page
57
+ params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 50
58
+ end
59
+
60
+ #------------------------------------------------------------------------------
61
+ def sort_column
62
+ columns = ["LOWER(user_profiles.first_name) #{sort_direction}, LOWER(user_profiles.last_name)", 'globalize_countries.english_name']
63
+ columns[params[:iSortCol_0].to_i]
64
+ end
65
+
66
+ #------------------------------------------------------------------------------
67
+ def sort_direction
68
+ params[:sSortDir_0] == "desc" ? "desc" : "asc"
69
+ end
70
+
71
+ #------------------------------------------------------------------------------
72
+ def action(user)
73
+ if @blog.member?(user)
74
+ icons("icon-check") + "  ".html_safe + user.full_name
75
+ else
76
+ link_to(icons("icon-plus"), url_helpers.blog_add_member_admin_cms_blog_path(@blog, :locale => DmCore::Language.locale, :user_id => user.id), :title => 'Add Access') + "  ".html_safe + user.full_name
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,27 @@
1
+ module DmCms
2
+ module AnalyticsHelper
3
+
4
+ # Will insert the google analytics code. First it checks that the GA code was
5
+ # specified in the account. If a theme wants different/more complex analytics
6
+ # code, then they can override the 'customized/analytics/google_analytics' partial
7
+ #------------------------------------------------------------------------------
8
+ def google_analytics_tag
9
+ if Rails.env.production?
10
+ unless (tracking_id = current_account.preferred_google_analytics_tracker_id).blank?
11
+ render partial: 'customized/analytics/google_analytics', locals: { tracking_id: tracking_id, domain_name: current_account.domain }
12
+ end
13
+ end
14
+ end
15
+
16
+ #------------------------------------------------------------------------------
17
+ def mint_tag
18
+ # if Rails.env.production? && !request.ssl?
19
+ # "" # [todo] "<script src='/mint/?js' type='text/javascript'></script>".html_safe
20
+ # elsif Rails.env.production? && request.ssl?
21
+ # "" # [todo] "<script src='/mint/?js' type='text/javascript'></script>".html_safe
22
+ # end
23
+ end
24
+
25
+
26
+ end
27
+ end
@@ -0,0 +1,4 @@
1
+ module DmCms
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,8 @@
1
+ module DmCms::CmsContentitemsHelper
2
+
3
+ # return a select list of the different content types
4
+ #------------------------------------------------------------------------------
5
+ def select_content_type(object = "cms_contentitem")
6
+ select(object, 'itemtype', CmsContentitem::CONTENT_TYPES)
7
+ end
8
+ end
@@ -0,0 +1,30 @@
1
+ module DmCms::CmsPagesHelper
2
+
3
+ #------------------------------------------------------------------------------
4
+ def nested_tree(tree)
5
+ tree.map do |item, sub_items|
6
+ render(:partial => 'tree', :locals => {:item => item, :sub_items => sub_items})
7
+ end.join.html_safe
8
+ end
9
+
10
+ #------------------------------------------------------------------------------
11
+ def nested_tree_sidebar(tree)
12
+ tree.map do |item, sub_items|
13
+ render(:partial => 'tree_sidebar', :locals => {:item => item, :sub_items => sub_items})
14
+ end.join.html_safe
15
+ end
16
+
17
+ # Return a list of templates defined in the theme.yml and it's parent theme.
18
+ # The child templates should override any parent templates
19
+ #------------------------------------------------------------------------------
20
+ def template_menu_list
21
+ theme = current_account.theme_data
22
+ unless theme.empty?
23
+ templates = (current_account.theme_data(parent: true)['templates'] || {}).merge(theme['templates'] || {})
24
+ [['Inherit from parent', '']] + templates.collect {|key, value| [value['name'], key] }
25
+ else
26
+ nil
27
+ end
28
+ end
29
+
30
+ end
@@ -0,0 +1,204 @@
1
+ # Handles building the different content streams for a page
2
+ #------------------------------------------------------------------------------
3
+ module DmCms::PagesHelper
4
+
5
+ # Easy way to get a page url
6
+ # slug can either be a string, or a CmsPage object
7
+ #------------------------------------------------------------------------------
8
+ def page_url(slug, locale = DmCore::Language.locale)
9
+ showpage_url(:locale => locale, :slug => (slug.kind_of?(CmsPage) ? slug.slug : slug))
10
+ end
11
+
12
+ # Given the name of a container, queries for all content items for that
13
+ # container within the given page.
14
+ #------------------------------------------------------------------------------
15
+ def content_by_name( name )
16
+ unless @current_page.nil?
17
+ items = @current_page.cms_contentitems.where(container: name)
18
+ render :partial => (items.nil? ? 'not_found' : 'content_fragment'), :collection => items
19
+ end
20
+ end
21
+
22
+ # Given the name of a container, check if any content is available
23
+ #------------------------------------------------------------------------------
24
+ def content_by_name?(name)
25
+ (@current_page.nil? || @current_page.cms_contentitems.where(container: name).count == 0) ? false : true
26
+ end
27
+
28
+ #------------------------------------------------------------------------------
29
+ def snippet(slug)
30
+ cms_snippet = CmsSnippet.find_by_slug(slug)
31
+ if cms_snippet
32
+ render :partial => 'dm_cms/pages/snippet_fragment', locals: {snippet_fragment: cms_snippet}
33
+ else
34
+ render text: 'Snippet not found'
35
+ end
36
+ end
37
+
38
+ #------------------------------------------------------------------------------
39
+ def snippet?(slug)
40
+ CmsSnippet.where(slug: slug).count == 0 ? false : true
41
+ end
42
+
43
+ #------------------------------------------------------------------------------
44
+ def render_content_item(content_item)
45
+ if content_item.content.blank?
46
+ content = ''
47
+ else
48
+ # --- process content type
49
+ liquid_params = content_item.to_liquid
50
+ liquid_params.reverse_merge!(current_user.to_liquid) if current_user
51
+ case content_item.itemtype.downcase
52
+ when 'textile'
53
+ content = liquidize_textile(content_item.content, liquid_params)
54
+ when 'markdown'
55
+ content = liquidize_markdown(content_item.content, liquid_params)
56
+ when 'html'
57
+ content = liquidize_html(content_item.content, liquid_params)
58
+ else
59
+ content = ''
60
+ end
61
+ end
62
+ return content
63
+ end
64
+
65
+ # Generates a simple multi-level page menu including children
66
+ #------------------------------------------------------------------------------
67
+ def main_menu(options = {})
68
+ return '' if (root = CmsPage.roots[0]).nil?
69
+
70
+ menu_str = ''
71
+ options[:ul] = ''
72
+ options[:ul] += "class='#{options[:class]}' " unless options[:class].blank?
73
+ options[:ul] += "id='#{options[:id]}' " unless options[:id].blank?
74
+ options[:include_root] = root if options[:include_home]
75
+ options[:active_class] ||= 'current'
76
+ children = root.subtree.includes(:translations).arrange(order: :row_order).to_a[0][1]
77
+ menu_str, submenu_active = (options[:type] == :bs3 ? menu_from_pages_bs3(children, options) : menu_from_pages(children, options))
78
+ return menu_str.html_safe
79
+ end
80
+
81
+ #------------------------------------------------------------------------------
82
+ def menu_from_pages(pages, options = {})
83
+ options[:ul] ||= ''
84
+ menu_str = ''
85
+ active_found = false
86
+ if (root = options[:include_root])
87
+ active = (current_page?(root) ? options[:active_class] : nil)
88
+ active_found ||= !active.nil?
89
+ menu_str += content_tag :li, link_to(root.menutitle, dm_cms.showpage_url(root.slug)), class: active
90
+ end
91
+ pages.each do |page, children|
92
+ if allow_page_in_menu?(page)
93
+ submenu, submenu_active = (children.empty? ? '' : menu_from_pages(children, active_class: options[:active_class]))
94
+ active = (submenu_active || current_page?(page) ? options[:active_class] : nil)
95
+ active_found ||= !active.nil?
96
+ menu_str += content_tag(:li, class: active) do
97
+ link_to(page.menutitle, dm_cms.showpage_url(page.slug)) +
98
+ submenu.html_safe
99
+ end
100
+ end
101
+ end
102
+ return (menu_str.blank? ? '' : "<ul #{options[:ul]}>#{menu_str}</ul>"), active_found
103
+ end
104
+
105
+ # Creates a standard Bootstrap 3 version of a main menu
106
+ #------------------------------------------------------------------------------
107
+ def menu_from_pages_bs3(pages, options = {})
108
+ options[:ul] ||= ''
109
+ menu_str = ''
110
+ active_found = false
111
+ if (root = options[:include_root])
112
+ active = (current_page?(root) ? options[:active_class] : nil)
113
+ active_found ||= !active.nil?
114
+ menu_str += content_tag :li, link_to(root.menutitle, dm_cms.showpage_url(root.slug)), class: active
115
+ end
116
+ pages.each do |page, children|
117
+ if allow_page_in_menu?(page)
118
+ submenu, submenu_active = (children.empty? ? '' : menu_from_pages_bs3(children, ul: 'class="dropdown-menu"', active_class: options[:active_class]))
119
+ active = (submenu_active || current_page?(page) ? options[:active_class] : nil)
120
+ active_found ||= !active.nil?
121
+ if !submenu.blank?
122
+ menu_str += content_tag(:li, class: ['dropdown', active].join(' ')) do
123
+ link_to(''.html_safe + page.menutitle + ' <b class="caret"></b>'.html_safe, dm_cms.showpage_url(page.slug), class: 'dropdown-toggle', data: {toggle: 'dropdown'}) +
124
+ submenu.html_safe
125
+ end
126
+ else
127
+ menu_str += content_tag :li, link_to(page.menutitle, dm_cms.showpage_url(page.slug)), class: active
128
+ end
129
+ end
130
+ end
131
+ return (menu_str.blank? ? '' : "<ul #{options[:ul]}>#{menu_str}</ul>"), active_found
132
+ end
133
+
134
+
135
+ # return true if the page should be allowed to be dislpayed in a menu
136
+ #------------------------------------------------------------------------------
137
+ def allow_page_in_menu?(page)
138
+ page.present? && (page.is_published? || is_admin?) && page_authorized?(page) && !page.menutitle.blank?
139
+ end
140
+
141
+ #------------------------------------------------------------------------------
142
+ def main_menu_select(options = {})
143
+ return '' if (root = CmsPage.roots[0]).nil?
144
+ options[:id] ||= ''
145
+ options[:class] ||= ''
146
+ options[:include_root] = root if options[:include_home]
147
+ pages = root.subtree.includes(:translations).arrange(order: :row_order).to_a[0][1]
148
+ menu_str = "<select id='#{options[:id]}' class='#{options[:class]}'>"
149
+ menu_str += "<option value='' selected='selected'>#{nls(:main_menu_select_prompt)}</option>"
150
+ if options[:include_home]
151
+ menu_str += "<option value='#{dm_cms.showpage_url(root.slug)}'>#{root.menutitle}</option>"
152
+ end
153
+ pages.each do |page, children|
154
+ if allow_page_in_menu?(page)
155
+ menu_str += "<option value='#{dm_cms.showpage_url(page.slug)}'>#{page.menutitle}</option>"
156
+ end
157
+ end
158
+ menu_str += "</select>"
159
+ return menu_str.html_safe
160
+ end
161
+
162
+ # return a link to the page's slug, with the passed in link text
163
+ #------------------------------------------------------------------------------
164
+ def page_link(page, text = nil)
165
+ text ||= page.menutitle
166
+ link_to text, dm_cms.showpage_url(page.slug)
167
+ end
168
+
169
+ private
170
+
171
+ # Currently check is page requires a login and if user is logged in.
172
+ # {todo} add additional authorization checks
173
+ #------------------------------------------------------------------------------
174
+ def page_authorized?(page)
175
+ if page.requires_login?
176
+ return user_signed_in?
177
+ else
178
+ true
179
+ end
180
+ end
181
+
182
+ # Determine if this page is currently being displayed
183
+ #------------------------------------------------------------------------------
184
+ def current_page?(page)
185
+ (@current_page == page) ? true : false
186
+ end
187
+
188
+ # Use the request url to determine if the current url matches any passed in paths
189
+ # http://stackoverflow.com/questions/8552763/best-way-to-highlight-current-page-in-rails-3-apply-a-css-class-to-links-con
190
+ #------------------------------------------------------------------------------
191
+ def current_page_path?(*paths)
192
+ active = false
193
+ paths.each { |path| active ||= request.url.include?(path) }
194
+ return active
195
+ end
196
+
197
+ # Determine if the page is in this section
198
+ # {todo} should be able to go to any depth
199
+ #------------------------------------------------------------------------------
200
+ def page_in_section?(page)
201
+ (@current_page == page or @current_page.parent_id == page.id) ? true : false
202
+ end
203
+
204
+ end
@@ -0,0 +1,26 @@
1
+ module DmCms::PostsHelper
2
+ include DmCore::LiquidHelper
3
+
4
+
5
+ # Display the blog summary. Support liquid tags and markdown in the summary
6
+ # field. If the there is no summary, grab the first :words from the content
7
+ # Note: can't support liquid in emails right now. The path to the assets is not
8
+ # generated correctly, and the styles mostly likely don't match. For now,
9
+ # strip out liquid for emails
10
+ #------------------------------------------------------------------------------
11
+ def display_post_summary(post, options = {})
12
+ options.reverse_merge!(words: 50, email: false)
13
+
14
+ if !post.summary.blank?
15
+ options[:email] ? markdown(post.summary, safe: false) : liquidize_markdown(post.summary)
16
+ else
17
+ post.content.blank? ? '' : (options[:email] ? markdown(post.content.smart_truncate(options[:words]), safe: false) : liquidize_markdown(post.content.smart_truncate(options[:words])))
18
+ end
19
+ end
20
+
21
+ #------------------------------------------------------------------------------
22
+ def display_post_content(post)
23
+ post.content.blank? ? '' : liquidize_markdown(post.content)
24
+ end
25
+
26
+ end
@@ -0,0 +1,50 @@
1
+ #------------------------------------------------------------------------------
2
+ module DmCms
3
+ module RenderHelper
4
+ include DmCms::AnalyticsHelper
5
+
6
+ # build title to use on a page
7
+ # note: make sure we return a properly escpaed html_safe string
8
+ #------------------------------------------------------------------------------
9
+ def page_title
10
+ title = current_account.preferred_site_title
11
+ content_for?(:page_title) ? "#{h(content_for :page_title)} | #{h(title)}".html_safe : h(title)
12
+ end
13
+ alias :main_title :page_title # keep old main_title around for now
14
+
15
+ # keywords to use in meta name='keywords'
16
+ #------------------------------------------------------------------------------
17
+ def page_keywords
18
+ content_for?(:page_keywords) ? content_for(:page_keywords) : current_account.preferred_site_keywords
19
+ end
20
+
21
+ # copyright to use in meta name='copyright'
22
+ #------------------------------------------------------------------------------
23
+ def page_copyright
24
+ content_for?(:page_copyright) ? content_for(:page_copyright) : current_account.preferred_site_copyright
25
+ end
26
+
27
+ # description to use in meta name='description'
28
+ #------------------------------------------------------------------------------
29
+ def page_description
30
+ content_for?(:page_description) ? content_for(:page_description) : current_account.preferred_site_description
31
+ end
32
+
33
+ #------------------------------------------------------------------------------
34
+ def social_url(name)
35
+ case name
36
+ when :facebook
37
+ current_account.preferred_facebook_url
38
+ when :youtube
39
+ current_account.preferred_youtube_url
40
+ when :twitter
41
+ current_account.preferred_twitter_url
42
+ when :linkedin
43
+ current_account.preferred_linkedin_url
44
+ else
45
+ nil
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,17 @@
1
+ class MediaInput < SimpleForm::Inputs::FileInput
2
+ def input(wrapper_options)
3
+ # :preview_version is a custom attribute from :input_html hash, so you can pick custom sizes
4
+ version = input_html_options.delete(:preview_version)
5
+ out = '' # the output string we're going to build
6
+
7
+ # append file input. it will work accordingly with your simple_form wrappers
8
+ (out << @builder.file_field(attribute_name, input_html_options)).html_safe
9
+
10
+ # check if there's an uploaded file (eg: edit mode or form not saved)
11
+ if object.send("#{attribute_name}?")
12
+ # append preview image to output
13
+ out << template.image_tag(object.send(attribute_name).tap {|o| break o.send(version) if version}.send('url'))
14
+ end
15
+ return out
16
+ end
17
+ end