dm_cms 4.2.1.5

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