integral 1.3.0 → 1.4.0

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