dm_cms 4.2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +22 -0
- data/README.md +31 -0
- data/Rakefile +34 -0
- data/app/assets/javascripts/dm_cms/admin.js +58 -0
- data/app/assets/javascripts/dm_cms/application.js +16 -0
- data/app/assets/stylesheets/dm_cms/admin.css +3 -0
- data/app/assets/stylesheets/dm_cms/application.css +13 -0
- data/app/controllers/dm_cms/admin/admin_controller.rb +14 -0
- data/app/controllers/dm_cms/admin/cms_blogs_controller.rb +89 -0
- data/app/controllers/dm_cms/admin/cms_contentitems_controller.rb +96 -0
- data/app/controllers/dm_cms/admin/cms_pages_controller.rb +100 -0
- data/app/controllers/dm_cms/admin/cms_posts_controller.rb +67 -0
- data/app/controllers/dm_cms/admin/cms_snippets_controller.rb +73 -0
- data/app/controllers/dm_cms/admin/dashboard_controller.rb +12 -0
- data/app/controllers/dm_cms/admin/media_files_controller.rb +80 -0
- data/app/controllers/dm_cms/application_controller.rb +9 -0
- data/app/controllers/dm_cms/blogs_controller.rb +50 -0
- data/app/controllers/dm_cms/comments_controller.rb +3 -0
- data/app/controllers/dm_cms/contact_form_controller.rb +27 -0
- data/app/controllers/dm_cms/pages_controller.rb +67 -0
- data/app/controllers/dm_cms/posts_controller.rb +69 -0
- data/app/datatables/blog_user_datatable.rb +79 -0
- data/app/helpers/dm_cms/analytics_helper.rb +27 -0
- data/app/helpers/dm_cms/application_helper.rb +4 -0
- data/app/helpers/dm_cms/cms_contentitems_helper.rb +8 -0
- data/app/helpers/dm_cms/cms_pages_helper.rb +30 -0
- data/app/helpers/dm_cms/pages_helper.rb +204 -0
- data/app/helpers/dm_cms/posts_helper.rb +26 -0
- data/app/helpers/dm_cms/render_helper.rb +50 -0
- data/app/inputs/media_input.rb +17 -0
- data/app/liquid/tags/markdown.rb +30 -0
- data/app/mailers/post_notify_mailer.rb +36 -0
- data/app/models/cms_blog.rb +89 -0
- data/app/models/cms_contentitem.rb +76 -0
- data/app/models/cms_page.rb +227 -0
- data/app/models/cms_post.rb +76 -0
- data/app/models/cms_snippet.rb +42 -0
- data/app/models/contact_form.rb +28 -0
- data/app/models/dm_cms/concerns/ability.rb +54 -0
- data/app/models/dm_cms/permitted_params.rb +34 -0
- data/app/models/media_file.rb +102 -0
- data/app/presenters/cms_blog_presenter.rb +15 -0
- data/app/presenters/cms_page_presenter.rb +23 -0
- data/app/presenters/cms_post_presenter.rb +11 -0
- data/app/presenters/cms_snippet_presenter.rb +10 -0
- data/app/uploaders/media_uploader.rb +169 -0
- data/app/views/customized/analytics/_google_analytics.html.erb +11 -0
- data/app/views/dm_cms/admin/cms_blogs/_form.html.erb +34 -0
- data/app/views/dm_cms/admin/cms_blogs/edit.html.erb +2 -0
- data/app/views/dm_cms/admin/cms_blogs/index.html.erb +44 -0
- data/app/views/dm_cms/admin/cms_blogs/new.html.erb +2 -0
- data/app/views/dm_cms/admin/cms_blogs/show.html.erb +167 -0
- data/app/views/dm_cms/admin/cms_contentitems/_form.html.erb +43 -0
- data/app/views/dm_cms/admin/cms_contentitems/_form_dialog.html.erb +17 -0
- data/app/views/dm_cms/admin/cms_contentitems/edit.html.erb +1 -0
- data/app/views/dm_cms/admin/cms_contentitems/markdown.html.erb +21 -0
- data/app/views/dm_cms/admin/cms_contentitems/new_content.html.erb +1 -0
- data/app/views/dm_cms/admin/cms_pages/_content_toolbar.html.erb +11 -0
- data/app/views/dm_cms/admin/cms_pages/_form.html.erb +50 -0
- data/app/views/dm_cms/admin/cms_pages/_tree.html.erb +20 -0
- data/app/views/dm_cms/admin/cms_pages/_tree_sidebar.html.erb +8 -0
- data/app/views/dm_cms/admin/cms_pages/edit.html.erb +2 -0
- data/app/views/dm_cms/admin/cms_pages/index.html.erb +32 -0
- data/app/views/dm_cms/admin/cms_pages/new_page.html.erb +2 -0
- data/app/views/dm_cms/admin/cms_pages/show.html.erb +54 -0
- data/app/views/dm_cms/admin/cms_posts/_form.html.erb +59 -0
- data/app/views/dm_cms/admin/cms_posts/edit.html.erb +2 -0
- data/app/views/dm_cms/admin/cms_posts/new.html.erb +1 -0
- data/app/views/dm_cms/admin/cms_snippets/_form.html.erb +28 -0
- data/app/views/dm_cms/admin/cms_snippets/edit.html.erb +1 -0
- data/app/views/dm_cms/admin/cms_snippets/index.html.erb +29 -0
- data/app/views/dm_cms/admin/cms_snippets/new.html.erb +1 -0
- data/app/views/dm_cms/admin/dashboard/_widget_blog_comments.html.erb +37 -0
- data/app/views/dm_cms/admin/dashboard/widget_blog_comments.js.erb +1 -0
- data/app/views/dm_cms/admin/media_files/_form.html.erb +102 -0
- data/app/views/dm_cms/admin/media_files/edit.html.erb +3 -0
- data/app/views/dm_cms/admin/media_files/index.html.erb +98 -0
- data/app/views/dm_cms/admin/media_files/new.html.erb +3 -0
- data/app/views/dm_cms/admin/shared/_liquid_tags_ref.html.erb +35 -0
- data/app/views/dm_cms/blogs/show.html.erb +0 -0
- data/app/views/dm_cms/blogs/toggle_follow.js.coffee +5 -0
- data/app/views/dm_cms/contact_form/create.html.erb +2 -0
- data/app/views/dm_cms/contact_form/create.js.erb +2 -0
- data/app/views/dm_cms/pages/_content_fragment.html.erb +13 -0
- data/app/views/dm_cms/pages/_snippet_fragment.html.erb +12 -0
- data/app/views/dm_cms/pages/coming_soon.html.erb +2 -0
- data/app/views/dm_cms/pages/show.html.erb +0 -0
- data/app/views/dm_cms/posts/show.html.erb +0 -0
- data/app/views/dm_cms/shared/_comment.html.erb +22 -0
- data/app/views/dm_cms/shared/_comment_form.html.erb +16 -0
- data/app/views/dm_cms/shared/_comment_list.html.erb +11 -0
- data/app/views/dm_cms/shared/_social_buttons.html.erb +6 -0
- data/app/views/layouts/email_templates/dm_cms_email_layout.html.erb +320 -0
- data/app/views/layouts/email_templates/dm_cms_email_layout.text.erb +1 -0
- data/app/views/layouts/email_templates/dm_cms_post_notify.html.erb +13 -0
- data/app/views/layouts/email_templates/dm_cms_post_notify.text.erb +9 -0
- data/app/views/liquid_tags/_contact_form.html.erb +17 -0
- data/config/initializers/liquid_init.rb +2 -0
- data/config/locales/cms.cs.yml +42 -0
- data/config/locales/cms.de.yml +42 -0
- data/config/locales/cms.en.yml +42 -0
- data/config/locales/cms.fi.yml +42 -0
- data/config/locales/cms.ja.yml +42 -0
- data/config/routes.rb +70 -0
- data/db/migrate/20121103181909_create_cms.rb +91 -0
- data/db/migrate/20130206213720_add_account_to_cms.rb +10 -0
- data/db/migrate/20130507123255_create_blog.rb +61 -0
- data/db/migrate/20130531212537_add_notification_sent.rb +5 -0
- data/db/migrate/20130605184116_add_blog_comment.rb +7 -0
- data/db/migrate/20131128201053_add_blog_image.rb +5 -0
- data/db/migrate/20140217135228_rename_snippet_slug.rb +13 -0
- data/db/migrate/20140303121217_add_requires_subscription_blog.rb +7 -0
- data/db/migrate/20140328205246_add_pages_ranked_model.rb +22 -0
- data/db/migrate/20140423113417_add_blog_owner.rb +6 -0
- data/db/migrate/20140428122156_create_media_files.rb +29 -0
- data/db/migrate/20140523134543_add_cmspage_summary.rb +6 -0
- data/db/migrate/20140601151631_add_blog_image_email_header.rb +5 -0
- data/db/migrate/20141004154725_add_header_image.rb +9 -0
- data/db/migrate/20160821150108_index_foreign_keys_in_cms_blogs.rb +6 -0
- data/db/migrate/20160821150109_index_foreign_keys_in_cms_media_files.rb +6 -0
- data/db/migrate/20160821150110_index_foreign_keys_in_cms_posts.rb +6 -0
- data/lib/dm_cms.rb +4 -0
- data/lib/dm_cms/engine.rb +16 -0
- data/lib/dm_cms/liquid/filters/liquid_filters.rb +11 -0
- data/lib/dm_cms/liquid/tags/contact_form.rb +35 -0
- data/lib/dm_cms/liquid/tags/div.rb +42 -0
- data/lib/dm_cms/liquid/tags/image.rb +76 -0
- data/lib/dm_cms/liquid/tags/quote.rb +38 -0
- data/lib/dm_cms/liquid/tags/snippet.rb +37 -0
- data/lib/dm_cms/liquid/tags/url_asset.rb +41 -0
- data/lib/dm_cms/liquid/tags/url_media.rb +42 -0
- data/lib/dm_cms/liquid/tags/url_protected.rb +31 -0
- data/lib/tasks/dm_cms_tasks.rake +4 -0
- data/spec/controllers/admin/cms_blogs_controller_spec.rb +173 -0
- data/spec/controllers/admin/cms_pages_controller_spec.rb +182 -0
- data/spec/controllers/admin/cms_posts_controller_spec.rb +166 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/ability.rb +12 -0
- data/spec/dummy/app/models/user.rb +6 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +26 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +82 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/_themes_for_rails.rb +39 -0
- data/spec/dummy/config/initializers/account_initialization.rb +28 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/dm_core.rb +6 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +19 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20141114170927_add_globalize_countries.dm_core.rb +50 -0
- data/spec/dummy/db/migrate/20141114170928_devise_create_users.dm_core.rb +46 -0
- data/spec/dummy/db/migrate/20141114170929_add_user_fields.dm_core.rb +14 -0
- data/spec/dummy/db/migrate/20141114170930_rolify_create_roles.dm_core.rb +20 -0
- data/spec/dummy/db/migrate/20141114170931_add_last_access.dm_core.rb +10 -0
- data/spec/dummy/db/migrate/20141114170932_create_versions.dm_core.rb +19 -0
- data/spec/dummy/db/migrate/20141114170933_add_object_changes_column_to_versions.dm_core.rb +12 -0
- data/spec/dummy/db/migrate/20141114170934_create_dm_core_accounts.dm_core.rb +13 -0
- data/spec/dummy/db/migrate/20141114170935_add_account_to_users.dm_core.rb +9 -0
- data/spec/dummy/db/migrate/20141114170936_create_preferences.dm_core.rb +13 -0
- data/spec/dummy/db/migrate/20141114170937_create_comments.dm_core.rb +22 -0
- data/spec/dummy/db/migrate/20141114170938_add_activity.dm_core.rb +21 -0
- data/spec/dummy/db/migrate/20141114170939_add_type_to_comments.dm_core.rb +9 -0
- data/spec/dummy/db/migrate/20141114170940_add_category.dm_core.rb +28 -0
- data/spec/dummy/db/migrate/20141114170941_create_email_table.dm_core.rb +26 -0
- data/spec/dummy/db/migrate/20141114170942_add_user_profile.dm_core.rb +46 -0
- data/spec/dummy/db/migrate/20141114170943_add_profile_email.dm_core.rb +14 -0
- data/spec/dummy/db/migrate/20141114170944_create_payment_history.dm_core.rb +37 -0
- data/spec/dummy/db/migrate/20141114170945_change_anchor_field.dm_core.rb +10 -0
- data/spec/dummy/db/migrate/20141114170946_create_user_site_profile.dm_core.rb +27 -0
- data/spec/dummy/db/migrate/20141114170947_add_avatar.dm_core.rb +12 -0
- data/spec/dummy/db/migrate/20141114170948_add_notify_to_payment_history.dm_core.rb +8 -0
- data/spec/dummy/db/migrate/20141114170949_acts_as_votable_migration.dm_core.rb +28 -0
- data/spec/dummy/db/migrate/20141114170950_add_user_site_profile_uuid.dm_core.rb +19 -0
- data/spec/dummy/db/migrate/20141114170951_add_invoice_id.dm_core.rb +7 -0
- data/spec/dummy/db/migrate/20141114170952_acts_as_follower_migration.dm_core.rb +18 -0
- data/spec/dummy/db/migrate/20141114170953_rename_invoice_id.dm_core.rb +12 -0
- data/spec/dummy/db/migrate/20141114170954_add_core_addresses.dm_core.rb +18 -0
- data/spec/dummy/db/migrate/20141114170955_papertrail_increase_column.dm_core.rb +9 -0
- data/spec/dummy/db/migrate/20141114170956_acts_as_taggable_on_migration.dm_core.rb +32 -0
- data/spec/dummy/db/migrate/20141114170957_add_missing_unique_indices.dm_core.rb +23 -0
- data/spec/dummy/db/migrate/20141114170958_add_taggings_counter_cache_to_tags.dm_core.rb +16 -0
- data/spec/dummy/db/migrate/20141114170959_create_custom_fields.dm_core.rb +40 -0
- data/spec/dummy/db/migrate/20141114170960_add_missing_taggable_index.dm_core.rb +11 -0
- data/spec/dummy/db/migrate/20141114170961_create_documents.dm_knowledge.rb +19 -0
- data/spec/dummy/db/migrate/20141114170962_add_document_notes.dm_knowledge.rb +7 -0
- data/spec/dummy/db/migrate/20160128134522_add_favored_locale.dm_core.rb +17 -0
- data/spec/dummy/db/migrate/20160128134523_update_papertrail_v4.dm_core.rb +41 -0
- data/spec/dummy/db/schema.rb +590 -0
- data/spec/dummy/db/seeds.rb +18 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/themes/_mbus/_readme.md +6 -0
- data/spec/dummy/themes/_mbus/_theme.yml +21 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/application.js +9 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/bootstrap.js +2114 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/bootstrap.min.js +6 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/contact_me.js +75 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/jqBootstrapValidation.js +912 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/javascripts/jquery-1.11.0.js +4 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/application.css +14 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/bootstrap.css +6203 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/bootstrap.min.css +5 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/css/font-awesome.css +1566 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/css/font-awesome.min.css +4 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/FontAwesome.otf +0 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/fontawesome-webfont.eot +0 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/fontawesome-webfont.svg +504 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/fontawesome-webfont.ttf +0 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/fonts/fontawesome-webfont.woff +0 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/bordered-pulled.less +16 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/core.less +12 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/fixed-width.less +6 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/font-awesome.less +17 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/icons.less +506 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/larger.less +13 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/list.less +19 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/mixins.less +20 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/path.less +14 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/rotated-flipped.less +9 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/spinning.less +32 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/stacked.less +20 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/less/variables.less +515 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_bordered-pulled.scss +16 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_core.scss +12 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_fixed-width.scss +6 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_icons.scss +506 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_larger.scss +13 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_list.scss +19 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_mixins.scss +20 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_path.scss +14 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_rotated-flipped.scss +9 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_spinning.scss +32 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_stacked.scss +20 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/_variables.scss +515 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/font-awesome-4.1.0/scss/font-awesome.scss +17 -0
- data/spec/dummy/themes/_mbus/theme_assets/_mbus/stylesheets/modern-business.css +93 -0
- data/spec/dummy/themes/_mbus/theme_support/config/load_theme.rb +0 -0
- data/spec/dummy/themes/_mbus/theme_support/locales/site.cs.yml +57 -0
- data/spec/dummy/themes/_mbus/theme_support/locales/site.de.yml +57 -0
- data/spec/dummy/themes/_mbus/theme_support/locales/site.en.yml +57 -0
- data/spec/dummy/themes/_mbus/theme_support/locales/site.fi.yml +58 -0
- data/spec/dummy/themes/_mbus/theme_support/locales/site.ja.yml +57 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_blog_right_sidebar.html.erb +91 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_comment.html.erb +21 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_comment_form.html.erb +16 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_comment_list.html.erb +7 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_comment_section.html.erb +17 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_page_footer.html.erb +11 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_page_header.html.erb +39 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_page_top.html.erb +24 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_post_summary_item.html.erb +11 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/_social_buttons_initialization.html.erb +10 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/blog.html.erb +47 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/blog_post.html.erb +55 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/content_full_width.html.erb +28 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/content_with_left_nav.html.erb +44 -0
- data/spec/dummy/themes/_mbus/theme_support/views/layouts/cms_templates/index.html.erb +19 -0
- data/spec/dummy/themes/local/_theme.yml +8 -0
- data/spec/factories/accounts.rb +17 -0
- data/spec/factories/blogs.rb +19 -0
- data/spec/factories/posts.rb +23 -0
- data/spec/factories/user_profiles.rb +10 -0
- data/spec/factories/users.rb +19 -0
- data/spec/features/admin/blog_admin_spec.rb +16 -0
- data/spec/models/cms_blog_spec.rb +37 -0
- data/spec/models/cms_page_spec.rb +9 -0
- data/spec/models/cms_post_spec.rb +44 -0
- data/spec/rails_helper.rb +70 -0
- data/spec/spec_helper.rb +85 -0
- data/spec/support/accounts.rb +17 -0
- data/spec/support/devise.rb +44 -0
- data/spec/support/fix_locale.rb +57 -0
- 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,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
|