integral 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -30
  3. data/Rakefile +1 -1
  4. data/app/assets/images/integral/defaults/no_image_available.jpg +0 -0
  5. data/app/assets/javascripts/integral/backend.js +102 -11
  6. data/app/assets/javascripts/integral/frontend.js +37 -0
  7. data/app/assets/javascripts/integral/support/confirm_modal.coffee +2 -2
  8. data/app/assets/javascripts/integral/support/gallery.coffee +71 -54
  9. data/app/assets/javascripts/integral/support/lib/lazysizes.js +755 -0
  10. data/app/assets/javascripts/integral/support/lib/materialize-tags.js +49 -44
  11. data/app/assets/javascripts/integral/support/ls.instagram.js +57 -0
  12. data/app/assets/javascripts/integral/support/ls.twitter.js +66 -0
  13. data/app/assets/javascripts/integral/support/record_selector.coffee +1 -1
  14. data/app/assets/javascripts/integral/support/remote_form.coffee +5 -2
  15. data/app/assets/stylesheets/integral/backend.sass +2 -1
  16. data/app/assets/stylesheets/integral/backend/_foundation_settings.scss +3 -4
  17. data/app/assets/stylesheets/integral/backend/dashboard-layout.scss +4 -1
  18. data/app/assets/stylesheets/integral/backend/materialize-tags.sass +1 -1
  19. data/app/assets/stylesheets/integral/backend/modules/timeline.scss +214 -0
  20. data/app/assets/stylesheets/integral/backend/shared.sass +80 -11
  21. data/app/assets/stylesheets/integral/frontend.scss +45 -0
  22. data/app/assets/stylesheets/integral/frontend/_foundation_settings.scss +2 -2
  23. data/app/assets/stylesheets/integral/frontend/blog.sass +155 -142
  24. data/app/assets/stylesheets/integral/frontend/layout.sass +3 -3
  25. data/app/assets/stylesheets/integral/frontend/modules/article-footer.scss +55 -0
  26. data/app/assets/stylesheets/integral/frontend/modules/article.scss +34 -0
  27. data/app/assets/stylesheets/integral/frontend/modules/horizontal-post.scss +44 -0
  28. data/app/assets/stylesheets/integral/frontend/modules/inline-articles.scss +23 -0
  29. data/app/assets/stylesheets/integral/frontend/modules/latest-post.scss +37 -0
  30. data/app/assets/stylesheets/integral/frontend/modules/list-widget.scss +50 -0
  31. data/app/assets/stylesheets/integral/frontend/modules/piped-list.scss +33 -0
  32. data/app/assets/stylesheets/integral/frontend/modules/post-tags.scss +19 -0
  33. data/app/assets/stylesheets/integral/frontend/modules/scroll-container.scss +9 -0
  34. data/app/assets/stylesheets/integral/frontend/modules/sidebar-articles.scss +42 -0
  35. data/app/assets/stylesheets/integral/frontend/modules/sidebar-tags.scss +6 -0
  36. data/app/assets/stylesheets/integral/frontend/modules/sidebar-widget.scss +47 -0
  37. data/app/assets/stylesheets/integral/frontend/modules/vertical-post.scss +31 -0
  38. data/app/assets/stylesheets/integral/frontend/share_modal.sass +0 -5
  39. data/app/assets/stylesheets/integral/support/gallery.sass +8 -0
  40. data/app/assets/stylesheets/integral/support/media-query-indicator.sass +6 -0
  41. data/app/controllers/integral/application_controller.rb +7 -1
  42. data/app/controllers/integral/backend/activities_controller.rb +13 -2
  43. data/app/controllers/integral/backend/base_controller.rb +60 -7
  44. data/app/controllers/integral/backend/categories_controller.rb +49 -0
  45. data/app/controllers/integral/backend/pages_controller.rb +7 -2
  46. data/app/controllers/integral/backend/posts_controller.rb +8 -3
  47. data/app/controllers/integral/backend/static_pages_controller.rb +4 -0
  48. data/app/controllers/integral/backend/users_controller.rb +13 -7
  49. data/app/controllers/integral/categories_controller.rb +31 -0
  50. data/app/controllers/integral/pages_controller.rb +1 -1
  51. data/app/controllers/integral/posts_controller.rb +5 -3
  52. data/app/decorators/integral/category_decorator.rb +30 -0
  53. data/app/decorators/integral/category_version_decorator.rb +7 -0
  54. data/app/decorators/integral/image_version_decorator.rb +7 -0
  55. data/app/decorators/integral/list_decorator.rb +1 -1
  56. data/app/decorators/integral/list_version_decorator.rb +7 -0
  57. data/app/decorators/integral/page_version_decorator.rb +7 -0
  58. data/app/decorators/integral/post_decorator.rb +9 -1
  59. data/app/decorators/integral/post_version_decorator.rb +7 -0
  60. data/app/decorators/integral/user_decorator.rb +1 -1
  61. data/app/decorators/integral/user_version_decorator.rb +7 -0
  62. data/app/decorators/integral/version_decorator.rb +51 -12
  63. data/app/helpers/integral/backend/base_helper.rb +56 -2
  64. data/app/helpers/integral/blog_helper.rb +21 -4
  65. data/app/jobs/integral/webhook/delivery_job.rb +37 -0
  66. data/app/mailers/integral/contact_mailer.rb +4 -1
  67. data/app/models/concerns/integral/lazy_contentable.rb +54 -0
  68. data/app/models/concerns/integral/webhook/delivery.rb +30 -0
  69. data/app/models/concerns/integral/webhook/observable.rb +23 -0
  70. data/app/models/integral/category.rb +20 -0
  71. data/app/models/integral/category_version.rb +8 -0
  72. data/app/models/integral/list_item.rb +1 -2
  73. data/app/models/integral/page.rb +18 -3
  74. data/app/models/integral/post.rb +28 -1
  75. data/app/models/integral/version.rb +2 -2
  76. data/app/models/integral/webhook/endpoint.rb +40 -0
  77. data/app/models/integral/webhook/event.rb +20 -0
  78. data/app/policies/integral/base_policy.rb +1 -0
  79. data/app/policies/integral/category_policy.rb +9 -0
  80. data/app/serializers/integral/post_serializer.rb +24 -0
  81. data/app/uploaders/integral/avatar_uploader.rb +1 -1
  82. data/app/views/integral/backend/activities/_activity.haml +21 -0
  83. data/app/views/integral/backend/activities/_grid.haml +1 -2
  84. data/app/views/integral/backend/activities/shared/_grid.haml +3 -2
  85. data/app/views/integral/backend/activities/shared/{_listing.haml → index.haml} +1 -0
  86. data/app/views/integral/backend/activities/shared/{_log.haml → show.haml} +0 -0
  87. data/app/views/integral/backend/categories/_modal.haml +25 -0
  88. data/app/views/integral/backend/lists/_child_fields.haml +1 -1
  89. data/app/views/integral/backend/lists/_item_container.haml +1 -1
  90. data/app/views/integral/backend/lists/_item_modal.haml +1 -1
  91. data/app/views/integral/backend/lists/_list_item_fields.haml +1 -1
  92. data/app/views/integral/backend/pages/_form.haml +1 -4
  93. data/app/views/integral/backend/pages/_grid.haml +34 -9
  94. data/app/views/integral/backend/pages/edit.haml +9 -3
  95. data/app/views/integral/backend/pages/index.haml +11 -21
  96. data/app/views/integral/backend/pages/list.haml +22 -0
  97. data/app/views/integral/backend/pages/show.haml +48 -0
  98. data/app/views/integral/backend/posts/_form.haml +8 -6
  99. data/app/views/integral/backend/posts/_grid.haml +33 -7
  100. data/app/views/integral/backend/posts/index.haml +13 -19
  101. data/app/views/integral/backend/posts/list.haml +20 -0
  102. data/app/views/integral/backend/posts/show.haml +54 -0
  103. data/app/views/integral/backend/shared/_activity_modal.haml +13 -0
  104. data/app/views/integral/backend/shared/cards/_categories.haml +34 -0
  105. data/app/views/integral/backend/{static_pages/_card.haml → shared/cards/_object.haml} +0 -0
  106. data/app/views/integral/backend/shared/cards/_recent_activity.haml +20 -0
  107. data/app/views/integral/backend/shared/cards/_recent_pages.haml +19 -0
  108. data/app/views/integral/backend/shared/cards/_recent_posts.haml +18 -0
  109. data/app/views/integral/backend/shared/cards/_recent_user_activity.haml +1 -0
  110. data/app/views/integral/backend/shared/cards/_recent_users.haml +19 -0
  111. data/app/views/integral/backend/shared/cards/_top_post_authors.haml +19 -0
  112. data/app/views/integral/backend/shared/record_selector/_record.haml +6 -4
  113. data/app/views/integral/backend/static_pages/dashboard.haml +13 -11
  114. data/app/views/integral/backend/users/_grid.haml +24 -7
  115. data/app/views/integral/backend/users/index.haml +11 -17
  116. data/app/views/integral/backend/users/list.haml +18 -0
  117. data/app/views/integral/backend/users/show.haml +5 -11
  118. data/app/views/integral/categories/show.haml +5 -0
  119. data/app/views/integral/posts/_article_footer.haml +17 -0
  120. data/app/views/integral/posts/_card.haml +11 -0
  121. data/app/views/integral/posts/_latest_post.haml +8 -0
  122. data/app/views/integral/posts/_most_read_section.haml +8 -0
  123. data/app/views/integral/posts/_post.haml +11 -0
  124. data/app/views/integral/posts/_similar_posts.haml +5 -0
  125. data/app/views/integral/posts/index.haml +6 -5
  126. data/app/views/integral/posts/templates/default.haml +34 -33
  127. data/app/views/integral/shared/_subscribe_modal.haml +14 -0
  128. data/app/views/integral/shared/blog/_categories.haml +15 -0
  129. data/app/views/integral/shared/blog/_layout.haml +9 -0
  130. data/app/views/integral/shared/blog/_sidebar.haml +10 -0
  131. data/app/views/integral/shared/gallery/_placeholder.haml +1 -1
  132. data/app/views/integral/shared/gallery/_slide.haml +2 -2
  133. data/app/views/integral/shared/gallery/gallery.haml +5 -2
  134. data/app/views/integral/shared/sidebar/_item.haml +8 -0
  135. data/app/views/integral/shared/sidebar/_newsletter_signup.haml +7 -0
  136. data/app/views/integral/shared/sidebar/_popular_posts.haml +7 -0
  137. data/app/views/integral/shared/sidebar/_popular_tags.haml +7 -0
  138. data/app/views/integral/shared/sidebar/_recent_posts.haml +7 -0
  139. data/app/views/integral/tags/index.haml +2 -2
  140. data/app/views/integral/tags/show.haml +3 -6
  141. data/app/views/layouts/integral/backend.html.haml +3 -0
  142. data/app/views/layouts/integral/backend/_main_menu_items.haml +10 -0
  143. data/app/views/layouts/integral/frontend.html.haml +3 -3
  144. data/config/locales/en.yml +52 -49
  145. data/db/migrate/20190414172018_create_webhook_endpoints.rb +10 -0
  146. data/db/migrate/20190929191412_add_integral_post_categories.rb +13 -0
  147. data/db/migrate/20191203090008_add_image_to_integral_categories.rb +6 -0
  148. data/db/migrate/20200401210442_create_category_versions.rb +20 -0
  149. data/db/seeds.rb +3 -1
  150. data/lib/generators/integral/assets_generator.rb +2 -2
  151. data/lib/generators/integral/install_generator.rb +1 -1
  152. data/lib/generators/integral/views_generator.rb +1 -1
  153. data/lib/generators/templates/integral.rb +5 -0
  154. data/lib/integral.rb +3 -30
  155. data/lib/integral/acts_as_listable.rb +2 -2
  156. data/lib/integral/chart_renderer/base.rb +2 -0
  157. data/lib/integral/content_renderer.rb +2 -2
  158. data/lib/integral/engine.rb +2 -2
  159. data/lib/integral/grids/activities_grid.rb +15 -1
  160. data/lib/integral/list_item_renderer.rb +4 -2
  161. data/lib/integral/list_renderer.rb +1 -0
  162. data/lib/integral/middleware/page_router.rb +15 -6
  163. data/lib/integral/router.rb +19 -3
  164. data/lib/integral/version.rb +1 -1
  165. data/lib/integral/widgets/swiper_list.rb +3 -2
  166. data/public/images/integral/demo/continous-integration.png +0 -0
  167. data/public/images/integral/demo/foundation-frontend-framework.jpg +0 -0
  168. data/public/images/integral/demo/heroku.png +0 -0
  169. data/public/images/integral/demo/integral-cms-without-hassle.jpg +0 -0
  170. data/public/images/integral/demo/integral-features-activity-tracking.jpg +0 -0
  171. data/public/images/integral/demo/integral-features-contact-form.png +0 -0
  172. data/public/images/integral/demo/integral-features-design.jpg +0 -0
  173. data/public/images/integral/demo/integral-features-dynamic-pages.jpg +0 -0
  174. data/public/images/integral/demo/integral-features-image-management.jpg +0 -0
  175. data/public/images/integral/demo/integral-features-integrated-blog.jpg +0 -0
  176. data/public/images/integral/demo/integral-features-list-management.jpg +0 -0
  177. data/public/images/integral/demo/integral-features-seo-ready.jpg +0 -0
  178. data/public/images/integral/demo/integral-features-user-management.jpg +0 -0
  179. data/public/images/integral/demo/integral-presentation.png +0 -0
  180. data/spec/factories.rb +15 -7
  181. metadata +110 -98
  182. data/app/assets/javascripts/ckeditor/plugins/integral-card/icons/copywidget.png +0 -0
  183. data/app/assets/javascripts/ckeditor/plugins/integral-card/icons/editwidget.png +0 -0
  184. data/app/assets/javascripts/ckeditor/plugins/integral-card/icons/hidpi/copywidget.png +0 -0
  185. data/app/assets/javascripts/ckeditor/plugins/integral-card/icons/hidpi/editwidget.png +0 -0
  186. data/app/assets/javascripts/ckeditor/plugins/integral-card/icons/hidpi/removewidget.png +0 -0
  187. data/app/assets/javascripts/ckeditor/plugins/integral-card/icons/hidpi/widget.png +0 -0
  188. data/app/assets/javascripts/ckeditor/plugins/integral-card/icons/removewidget.png +0 -0
  189. data/app/assets/javascripts/ckeditor/plugins/integral-card/icons/widget.png +0 -0
  190. data/app/assets/javascripts/ckeditor/plugins/integral-card/plugin.js +0 -86
  191. data/app/assets/javascripts/ckeditor/plugins/integralrecentposts/dialogs/integralrecentposts.js +0 -40
  192. data/app/assets/javascripts/ckeditor/plugins/integralrecentposts/plugin.js +0 -32
  193. data/app/assets/javascripts/ckeditor/plugins/numericinput/LICENSE.md +0 -363
  194. data/app/assets/javascripts/ckeditor/plugins/numericinput/README.md +0 -16
  195. data/app/assets/javascripts/ckeditor/plugins/numericinput/plugin.js +0 -354
  196. data/app/assets/stylesheets/integral/frontend.sass +0 -25
  197. data/app/views/integral/backend/pages/activities.haml +0 -2
  198. data/app/views/integral/backend/pages/activity.haml +0 -1
  199. data/app/views/integral/backend/posts/activities.haml +0 -3
  200. data/app/views/integral/backend/posts/activity.haml +0 -1
  201. data/app/views/integral/posts/_collection.haml +0 -4
  202. data/app/views/integral/posts/_item.haml +0 -16
  203. data/app/views/integral/shared/_blog_layout.haml +0 -15
  204. data/app/views/integral/shared/_blog_sidebar.haml +0 -49
  205. data/lib/integral/slack_bot.rb +0 -45
@@ -0,0 +1,5 @@
1
+ - if @related_posts.present?
2
+ %h2.blog-subheading= t('integral.blog.widgets.related_posts')
3
+ .scroll-container{ 'data-item-width' => 250 }
4
+ .grid-x.grid-margin-x.scroll-wrapper
5
+ = render partial: 'integral/posts/card', collection: Integral::PostDecorator.decorate_collection(@related_posts), as: :post
@@ -1,7 +1,8 @@
1
1
  = render_posts_as_json_ld(@posts.decorate)
2
2
 
3
- = render layout: 'integral/shared/blog_layout', locals: { title: t('.title'), subtitle: t('.subtitle'), image: image_url('integral/posts-hero-banner.jpg') } do
4
- %ul.post-list
5
- - @posts.decorate.each do |post|
6
- %li= render partial: 'integral/posts/item', locals: { post: post }
7
- = will_paginate @posts, renderer: FoundationPagination::Rails
3
+ = render layout: 'integral/shared/blog/layout', locals: { title: t('.title') } do
4
+ - if @latest_post.present?
5
+ = render partial: 'latest_post', locals: { post: @latest_post }
6
+ = render partial: @posts.decorate, cached: true
7
+ = render partial: 'most_read_section' if display_most_read_posts_widget?
8
+ .center= will_paginate @posts, renderer: FoundationPagination::Rails
@@ -1,37 +1,38 @@
1
1
  = render_post_as_json_ld(@post)
2
- = link_to 'Edit', edit_backend_post_url(@post.id), class: 'button primary button--edit-resource', data: { 'turbolinks' => 'false' } if current_user.present?
3
- = link_to posts_url, class: 'view-all' do
4
- = icon('list')
5
- VIEW ALL BLOG POSTS
6
- = render layout: 'integral/shared/blog_layout', locals: { title: @post.title, subtitle: @post.header_tags, image: @post.image(:large) } do
7
- %p
8
- %span.post-date= @post.published_at
9
- %article#post-content.wysiwyg-content
10
- = @post.body.html_safe
11
2
 
12
- .share-widget
13
- %p
14
- %span{ 'data-open' => 'share-modal' }= t('integral.actions.share')
15
- = link_to facebook_share_url, target: :blank do
16
- = icon('facebook')
17
- = link_to twitter_share_url(message: @post.title), target: :blank do
18
- = icon('twitter')
19
- = link_to linkedin_share_url(message: @post.title), target: :blank do
20
- = icon('linkedin')
3
+ = render partial: 'integral/shared/breadcrumbs'
4
+ #blog-wrapper.grid-container
5
+ .grid-x.grid-padding-x
6
+ .cell.large-9
7
+ %article.article
8
+ %header
9
+ %h1
10
+ = @post.title
11
+ - if user_signed_in?
12
+ %span.label.entity-status{ class: @post.status }= @post.status
13
+ %span.small= link_to 'Edit', integral.edit_backend_post_url(@post.id), class: "button medium", data: { 'turbolinks' => 'false' }
14
+ .grid-x
15
+ .cell.medium-8
16
+ .article-author
17
+ %span= @post.avatar
18
+ = @post.author.name
19
+ %ul.list-unstyled.piped-list
20
+ %li= @post.published_at
21
+ %li= link_to @post.category.title, category_path(@post.category)
22
+ .cell.small-4.text-right.show-for-medium
23
+ %button.button{ 'data-open' => 'share-modal' }
24
+ = icon('share', class: 'show-for-medium')
25
+ = t('integral.actions.share')
26
+ %section.wysiwyg-content.wysiwyg-content--post
27
+ = @post.body.html_safe
28
+ = render partial: 'integral/posts/article_footer'
29
+ .hide-for-large= render partial: 'similar_posts'
21
30
 
22
- %ul.tag-list.left
23
- - @post.tags_on(@post.tag_context).each do |tag|
24
- %li.post-tag
25
- = link_to tag_url(tag.name) do
26
- = tag.name
31
+ = render partial: 'integral/shared/blog/sidebar'
27
32
 
28
- - if @related_posts.present?
29
- %section.related-posts
30
- %h3= t('integral.blog.widgets.related_posts')
31
- .grid-x.grid-padding-x
32
- - Integral::PostDecorator.decorate_collection(@related_posts).each do |p|
33
- .cell.medium-4
34
- = link_to integral.post_url(p) do
35
- = image_tag p.image(:medium)
36
- %h5= p.title
37
- %span.subtitle= p.published_at
33
+ .grid-container.show-for-large
34
+ = render partial: 'similar_posts'
35
+
36
+ = render partial: 'integral/shared/blog/categories'
37
+ = render partial: 'integral/shared/share_modal'
38
+ = render partial: 'integral/shared/subscribe_modal'
@@ -0,0 +1,14 @@
1
+ #subscribe-modal.reveal.text-center{ data: { reveal: '' } }
2
+ %button.close-button{ data: { close: '' }, aria: { label: "Close modal" }}
3
+ %span{ aria: { hidden: true } } ×
4
+
5
+ %h3= t('integral.blog.widgets.newsletter_signup.title')
6
+ %hr.modal-topbar
7
+
8
+ %p= t('integral.blog.widgets.newsletter_signup.subtitle')
9
+
10
+ = simple_form_for Integral::NewsletterSignup.new, url: newsletter_signup_url, validate: true, remote: true, html: { class: 'remote-form', data: { 'remote-form-success-message' => t('integral.blog.widgets.newsletter_signup.success') }} do |f|
11
+ = f.input :email, placeholder: t('integral.blog.widgets.newsletter_signup.placeholder'), label: false
12
+ = f.button :submit, t('integral.blog.widgets.newsletter_signup.submit'), class: 'button expanded'
13
+
14
+
@@ -0,0 +1,15 @@
1
+ .grid-container
2
+ %h2.blog-subheading= t('integral.blog.widgets.categories')
3
+ .scroll-container{ 'data-item-width' => 250 }
4
+ .grid-x.grid-margin-x.scroll-wrapper
5
+ - featured_categories.decorate.each do |category|
6
+ .cell.medium-3
7
+ .list-widget
8
+ .list-widget-image
9
+ = link_to category_path(category) do
10
+ = image_tag category.image_url
11
+ .list-widget-tag= category.title
12
+ %ul.no-bullet
13
+ - category.posts(4).each do |post|
14
+ %li= link_to post.title, integral.post_path(post)
15
+
@@ -0,0 +1,9 @@
1
+ = render partial: 'integral/shared/breadcrumbs'
2
+
3
+ #blog-wrapper.grid-container
4
+ %h1= title
5
+ .grid-x.grid-padding-x
6
+ .cell.large-9{ 'data-post-list' => true }
7
+ = yield
8
+ = render partial: 'integral/shared/blog/sidebar'
9
+ = render partial: 'integral/shared/blog/categories'
@@ -0,0 +1,10 @@
1
+ .cell.small-12.large-3
2
+ - if display_newsletter_signup_widget?
3
+ = render partial: 'integral/shared/sidebar/newsletter_signup'
4
+
5
+ - if display_recent_posts_widget?
6
+ = render partial: 'integral/shared/sidebar/recent_posts'
7
+
8
+ - if display_popular_posts_widget?
9
+ = render partial: 'integral/shared/sidebar/popular_posts'
10
+ = render partial: 'integral/shared/sidebar/popular_tags'
@@ -1,7 +1,7 @@
1
1
  #gallery-placeholder.reveal.full.modal--gallery{ data: {reveal: true }}
2
2
  %button.close-button{ data: { close: '' }, aria: { label: "Close modal" }}
3
3
  %span{ aria: { hidden: true } } ×
4
- .content
5
4
  .placeholder
6
5
  = icon('spinner', class: 'fa-pulse')
7
6
  %p Loading..
7
+ .content
@@ -1,5 +1,5 @@
1
1
  - if type == 'Integral::Link'
2
- .responsive-embed.widescreen
3
- %iframe{ src: url, frameborder: '0', allow: 'autoplay; encrypted-media', allowfullscreen: true }
2
+ -# Assumes url is a YouTube embed URL i.e -> https://www.youtube.com/embed/mNzvpFcJXU
3
+ %iframe{ src: "#{url}?enablejsapi=1", frameborder: '0', allow: 'autoplay; encrypted-media', allowfullscreen: true }
4
4
  - else
5
5
  = image_tag image
@@ -1,6 +1,9 @@
1
1
  - if @list.list_items.present?
2
- = render_gallery(@list, { html_classes: 'main-swiper'})
3
- = render_thumb_gallery(@list, { html_classes: 'thumb-swiper'})
2
+ - if @list.list_items.count > 1
3
+ = render_gallery(@list, { html_classes: 'main-swiper'})
4
+ = render_thumb_gallery(@list, { html_classes: 'thumb-swiper'})
5
+ - else
6
+ = Integral::PartialListItemRenderer.new(@list.list_items.first, partial_path: 'integral/shared/gallery/slide').render_item
4
7
  - else
5
8
  %p.text-center
6
9
  Sorry, no media available.
@@ -0,0 +1,8 @@
1
+ .grid-x.list-item
2
+ .cell.small-3.image
3
+ = link_to url do
4
+ = image_tag image, class: 'thumbnail' unless image.empty? #TODO: Should thumbnail be here?
5
+ .cell.small-9.data
6
+ = link_to title, url
7
+ %ul.list-unstyled.piped-list
8
+ %li= subtitle
@@ -0,0 +1,7 @@
1
+ .sidebar-widget.newsletter-signup
2
+ = icon('envelope-open')
3
+ %h4= t('integral.blog.widgets.newsletter_signup.title')
4
+ %p= t('integral.blog.widgets.newsletter_signup.subtitle')
5
+ = simple_form_for Integral::NewsletterSignup.new, url: newsletter_signup_url, validate: true, remote: true, html: { class: 'remote-form', data: { 'remote-form-success-message' => t('integral.blog.widgets.newsletter_signup.success') }} do |f|
6
+ = f.input :email, placeholder: t('integral.blog.widgets.newsletter_signup.placeholder'), label: false
7
+ = f.button :submit, t('integral.blog.widgets.newsletter_signup.submit'), class: 'button'
@@ -0,0 +1,7 @@
1
+ - cache [@popular_posts.map(&:id), @popular_posts.maximum(:updated_at)] do
2
+ .sidebar-widget
3
+ %h2.sidebar-widget-title= t('integral.blog.widgets.popular_posts')
4
+ .sidebar-articles
5
+ -# TODO: Use collection rendering - possibly create a post sidebar item partial?
6
+ - @popular_posts.decorate.each do |post|
7
+ = render 'integral/shared/sidebar/item', url: integral.post_url(post), image: post.image(:small), title: post.title, subtitle: t('integral.blog.posted_ago', time: time_ago_in_words(post.published_at))
@@ -0,0 +1,7 @@
1
+ .sidebar-widget
2
+ %h2.sidebar-widget-title= t('integral.blog.widgets.popular_tags')
3
+ .sidebar-tags
4
+ %ul.post-tags
5
+ - @blog_tags.each do |tag|
6
+ %li= link_to tag.name, tag_url(tag.name)
7
+ = link_to 'View All', integral.tags_url, class: 'sidebar-widget-link'
@@ -0,0 +1,7 @@
1
+ - cache [@recent_posts.map(&:id), @recent_posts.maximum(:updated_at)] do
2
+ .sidebar-widget
3
+ %h2.sidebar-widget-title= t('integral.blog.widgets.recent_posts')
4
+ .sidebar-articles
5
+ -# TODO: Use collection rendering - possibly create a post sidebar item partial?
6
+ - @recent_posts.decorate.each do |post|
7
+ = render 'integral/shared/sidebar/item', url: integral.post_url(post), image: post.image(:small), title: post.title, subtitle: t('integral.blog.posted_ago', time: time_ago_in_words(post.published_at))
@@ -1,5 +1,5 @@
1
- = render layout: 'integral/shared/blog_layout', locals: { title: t('.title'), subtitle: t('.subtitle'), image: image_url('integral/posts-hero-banner.jpg')} do
2
- %ul.tag-list
1
+ = render layout: 'integral/shared/blog/layout', locals: { title: t('.title') } do
2
+ %ul.post-tags.text-center
3
3
  - @tags.each do |tag|
4
4
  %li
5
5
  = link_to tag_url(tag.name) do
@@ -1,6 +1,3 @@
1
- = render layout: 'integral/shared/blog_layout', locals: { title: "##{@tag.name}", subtitle: t('.subtitle'), image: image_url('integral/posts-hero-banner.jpg')} do
2
- %ul.post-list
3
- - @tagged_posts.decorate.each do |post|
4
- %li= render partial: 'integral/posts/item', locals: { post: post }
5
- = will_paginate @tagged_posts, renderer: FoundationPagination::Rails
6
-
1
+ = render layout: 'integral/shared/blog/layout', locals: { title: "##{@tag.name}" } do
2
+ = render partial: @tagged_posts.decorate, cached: true
3
+ .center= will_paginate @tagged_posts, renderer: FoundationPagination::Rails
@@ -91,3 +91,6 @@
91
91
  #content-area
92
92
  = render partial: 'integral/backend/shared/breadcrumbs'
93
93
  = yield
94
+ .record-image
95
+ = render partial: 'integral/backend/shared/image_selector'
96
+ = render partial: 'integral/backend/shared/activity_modal'
@@ -18,6 +18,10 @@
18
18
  %li
19
19
  = link_to new_backend_page_url do
20
20
  %span= t('integral.actions.create')
21
+ %li
22
+ = link_to list_backend_pages_url do
23
+ %span= t('integral.navigation.listing')
24
+
21
25
 
22
26
  - if policy(Integral::Post).index? && Integral.blog_enabled?
23
27
  %li
@@ -33,6 +37,9 @@
33
37
  %li
34
38
  = link_to new_backend_post_url do
35
39
  %span= t('integral.actions.create')
40
+ %li
41
+ = link_to list_backend_posts_url do
42
+ %span= t('integral.navigation.listing')
36
43
 
37
44
  - if policy(Integral::List).index?
38
45
  %li
@@ -77,6 +84,9 @@
77
84
  %li
78
85
  = link_to new_backend_user_url do
79
86
  %span= t('integral.actions.create')
87
+ %li
88
+ = link_to list_backend_users_url do
89
+ %span= t('integral.navigation.listing')
80
90
 
81
91
  - if policy(Integral::Version).manager?
82
92
  %li
@@ -16,19 +16,19 @@
16
16
  = render 'layouts/integral/frontend/admin_bar' if user_signed_in?
17
17
 
18
18
  -# Off Canvas - Mobile Menu
19
- #offCanvas.off-canvas.position-left{ 'data-off-canvas' => true }
19
+ #offCanvas.off-canvas.position-right{ 'data-off-canvas' => true }
20
20
  = link_to site_title, root_url, class: 'site-title'
21
21
  = render_list(main_menu_list, { html_classes: 'menu vertical'})
22
22
 
23
23
  -# Off Canvas - Main Content
24
24
  .off-canvas-content{ 'data-off-canvas-content' => true }
25
- %header
25
+ %header.body-header
26
26
  = render partial: 'layouts/integral/frontend/header'
27
27
 
28
28
  %main
29
29
  = yield
30
30
 
31
- %footer
31
+ %footer.body-footer
32
32
  = render partial: 'layouts/integral/frontend/footer'
33
33
 
34
34
  = render partial: 'integral/shared/share_modal'
@@ -4,7 +4,7 @@ en:
4
4
  default: "%d %B"
5
5
  time:
6
6
  formats:
7
- default: "%B %d, %Y at %l:%M%P"
7
+ default: "%b %d %Y, %l:%M %P"
8
8
  blog: "%B %d, %Y"
9
9
  twelve_hour: "%I:%M %p"
10
10
 
@@ -46,6 +46,12 @@ en:
46
46
  forward_enquiry:
47
47
  subject: Website Enquiry
48
48
  actions:
49
+ tense:
50
+ past:
51
+ update: Updated
52
+ create: Created
53
+ publish: Published
54
+ destroy: Deleted
49
55
  confirmation:
50
56
  deletion: If you delete this item it will be gone forever. Are you sure you want to proceed?
51
57
  clone: Are you sure you want to clone this item?
@@ -55,6 +61,8 @@ en:
55
61
  add_image: Add Image
56
62
  add_image_or_video: Add an image or video
57
63
  view_main_site: View main site
64
+ view_on_site: View on site
65
+ publish: Publish
58
66
  create: Create
59
67
  clone: Clone
60
68
  save: Save
@@ -66,18 +74,23 @@ en:
66
74
  view: View
67
75
  view_record: View Record
68
76
  view_user: View User
77
+ view_history: View history
69
78
  read_more: Read more..
70
79
  reply: Reply
71
80
  log_out: Logout
72
81
  upload: Upload
73
- share: Share this
82
+ share: Share
74
83
  apply: Apply
75
84
  select: Select
76
85
  copy_url: Copy URL
77
86
  copied: Copied
78
87
  search: Search
88
+ subscribe: Subscribe
79
89
  confirm: Confirm
80
90
  cancel: Cancel
91
+ view_all: View All
92
+ view_more: View More
93
+ open_in_new_tab: Open in new tab
81
94
  prompts:
82
95
  select_image: Select Image..
83
96
  select_type: Select Type..
@@ -91,6 +104,7 @@ en:
91
104
  archived: Archived
92
105
  records:
93
106
  attributes:
107
+ category: Category
94
108
  locale: Language
95
109
  image: Image
96
110
  featured_image: Featured Image
@@ -135,6 +149,7 @@ en:
135
149
  home: Home
136
150
  posts: Posts
137
151
  post: Post
152
+ tags: Tags
138
153
  pages: Pages
139
154
  page: Page
140
155
  users: Users
@@ -148,6 +163,7 @@ en:
148
163
  log_out: Logout
149
164
  my_account: Account & Profile
150
165
  settings: Settings
166
+ listing: Listing
151
167
 
152
168
  posts:
153
169
  index:
@@ -155,6 +171,8 @@ en:
155
171
  subtitle: All things Integral
156
172
  show:
157
173
  subtitle: An interesting read
174
+ footer:
175
+ blurb: Have questions about this article, want to provide feedback or contact us for any reason? Get in touch with us today. We'd love to hear from you.
158
176
  item:
159
177
  read_more: Read More
160
178
  tags:
@@ -166,7 +184,9 @@ en:
166
184
  subtitle: Related Articles
167
185
  description: "All articles tagged %{tag_name} within our blog"
168
186
  blog:
187
+ posted_ago: "Published %{time} ago"
169
188
  widgets:
189
+ most_read: Most Read Articles
170
190
  related_posts: Related Posts
171
191
  recent_posts: Recent Posts
172
192
  popular_posts: Popular Posts
@@ -180,9 +200,27 @@ en:
180
200
  submit: Sign Up
181
201
  success: Great choice! Stay tuned for some quality content direct to your inbox.
182
202
  backend:
203
+ titles:
204
+ new: "New %{type_singular}"
205
+ create: "Create %{type_singular}"
206
+ edit: "Edit %{type_singular}"
207
+ update: "Update %{type_singular}"
208
+ index: "%{type_plural}"
209
+ list: "%{type_singular} Listing"
210
+ notifications:
211
+ clone_success: "%{type} successfully cloned."
212
+ clone_failure: "%{type} clone failed."
213
+ creation_success: "%{type} successfully created."
214
+ creation_failure: "%{type} creation failed."
215
+ edit_success: "%{type} successfully updated."
216
+ edit_failure: "%{type} update failed."
217
+ delete_success: "%{type} successfully deleted."
218
+ delete_failure: "%{type} deletion failed."
183
219
  graphs:
184
220
  data_unavailable: Data Unavailable
185
221
  cards:
222
+ your_activity: Your Activity
223
+ recent_activity: Recent Activity
186
224
  at_a_glance: At a glance
187
225
  last_week: Last week
188
226
  shared:
@@ -227,6 +265,9 @@ en:
227
265
  activities:
228
266
  index:
229
267
  title: Website Activity
268
+ shared:
269
+ index:
270
+ title: "Activities: %{title}"
230
271
  lists:
231
272
  items:
232
273
  type:
@@ -247,15 +288,6 @@ en:
247
288
  columns:
248
289
  title: 'Title'
249
290
  description: 'Description'
250
- notification:
251
- clone_success: 'List successfully cloned.'
252
- clone_failure: 'List clone failed.'
253
- creation_success: 'List successfully created.'
254
- creation_failure: 'List creation failed.'
255
- edit_success: 'List successfully updated.'
256
- edit_failure: 'Failed to update list.'
257
- delete_success: 'List successfully deleted.'
258
- delete_failure: 'Failed to delete list.'
259
291
  settings:
260
292
  index:
261
293
  title: Settings
@@ -296,7 +328,6 @@ en:
296
328
  views: 'Views'
297
329
  status: 'Status'
298
330
  index:
299
- title: 'Posts'
300
331
  new_post: 'Create post'
301
332
  published_count: "%{count} published"
302
333
  drafts_count: "%{count} drafted"
@@ -305,22 +336,13 @@ en:
305
336
  title: 'Edit Post'
306
337
  new:
307
338
  title: 'New Post'
308
- activities:
309
- title: "Activities: %{title}"
310
- notification:
311
- clone_success: 'Post successfully cloned.'
312
- clone_failure: 'Post clone failed.'
313
- creation_success: 'Post successfully created.'
314
- creation_failure: 'Post creation failed.'
315
- edit_success: 'Post successfully updated.'
316
- edit_failure: 'Failed to update post.'
317
- delete_success: 'Post successfully deleted.'
318
- delete_failure: 'Failed to delete post.'
319
339
  pages:
320
340
  templates:
321
341
  default: Default
322
342
  prompts:
323
343
  choose_template: Choose Template
344
+ activities:
345
+ title: Page Activity
324
346
  index:
325
347
  title: 'Page listing'
326
348
  non_available: 'No pages available. Try creating one!'
@@ -333,15 +355,6 @@ en:
333
355
  description: 'Description'
334
356
  path: 'Path'
335
357
  last_updated_at: 'Last updated'
336
- notification:
337
- clone_success: 'Page successfully cloned.'
338
- clone_failure: 'Page clone failed.'
339
- creation_success: 'Page successfully created.'
340
- creation_failure: 'Page creation failed.'
341
- edit_success: 'Page successfully updated.'
342
- edit_failure: 'Failed to update page.'
343
- delete_success: 'Page successfully deleted.'
344
- delete_failure: 'Failed to delete page.'
345
358
  edit:
346
359
  title: 'Editing page - %{title}'
347
360
  new:
@@ -355,15 +368,6 @@ en:
355
368
  title: 'Image listing'
356
369
  no_images_available: 'No images available. Try uploading some!'
357
370
  new_image: 'New image'
358
- notification:
359
- creation_success: 'Image successfully created.'
360
- creation_failure: 'Image creation failed.'
361
- edit_success: 'Image successfully updated.'
362
- edit_failure: 'Failed to update Image.'
363
- delete_success: 'Image successfully deleted.'
364
- delete_failure: 'Failed to delete image.'
365
- edit:
366
- title: 'Editing image - %{name}'
367
371
  users:
368
372
  available_locales:
369
373
  en: English
@@ -371,13 +375,6 @@ en:
371
375
  status:
372
376
  draft: 'Draft'
373
377
  published: 'Published'
374
- notification:
375
- creation_success: 'User has been invited.'
376
- creation_failure: 'User creation failed.'
377
- edit_success: 'User successfully updated.'
378
- edit_failure: 'Failed to update user.'
379
- delete_success: 'User successfully deleted.'
380
- delete_failure: 'Failed to delete user.'
381
378
  prompts:
382
379
  select_language: 'Select language..'
383
380
  grid:
@@ -418,7 +415,7 @@ en:
418
415
  description: "Summarise the content. This will be displayed in search results and is an important part of on-page SEO. <a target='_blank' href='https://moz.com/learn/seo/meta-description'>Learn More.</a>"
419
416
  path: Path to the record, this will be appended onto the website domain to create a URL. Example - /company/privacy-policy
420
417
  parent: "You can arrange your pages in hierarchies by selecting a top level page for your other pages. <a target='_blank' href='https://en.wikipedia.org/wiki/Breadcrumb_(navigation)#Websites'>Learn More.</a>"
421
- #tag_list: Use key terms to summarise your content and seperate words with '-', i.e. internet-marketing-tips
418
+ tag_list: Use key terms to summarise your content and seperate words with '-', i.e. internet-marketing-tips
422
419
  template: Layout which will be used to render the page.
423
420
 
424
421
  image:
@@ -489,3 +486,9 @@ en:
489
486
  someone_invited_you: "%{name} has invited you to %{url}, you can accept it through the link below."
490
487
  ckeditor:
491
488
  populate_editor: Populate editor with example content.
489
+
490
+ activerecord:
491
+ models:
492
+ integral/post:
493
+ one: Post
494
+ other: Posts