From af30c2ee6136e2f6e693881fa4e81af76d7cb215 Mon Sep 17 00:00:00 2001 From: qsm-odoo Date: Thu, 9 Aug 2018 17:20:10 +0200 Subject: [PATCH] [IMP] website_blog: integrate snippet latest posts Moved from the themes repository. Now, users can use a snippet which showcases the latest blog posts as soon as they install the blog app. Note: in the future we may want to develop a snippet which can showcase any model records (products, projects, ...). task-1874216 --- addons/website_blog/controllers/main.py | 5 + .../static/src/img/s_latest_posts.jpg | Bin 0 -> 3402 bytes .../src/img/s_latest_posts_big_picture.jpg | Bin 0 -> 4021 bytes .../static/src/js/s_latest_posts_editor.js | 106 +++++++++++++ .../static/src/js/s_latest_posts_frontend.js | 142 ++++++++++++++++++ .../static/src/scss/primary_variables.scss | 5 + .../static/src/scss/website_blog.scss | 119 +++++++++++++++ addons/website_blog/views/snippets.xml | 38 +++++ .../views/website_blog_templates.xml | 66 ++++++++ 9 files changed, 481 insertions(+) create mode 100644 addons/website_blog/static/src/img/s_latest_posts.jpg create mode 100644 addons/website_blog/static/src/img/s_latest_posts_big_picture.jpg create mode 100644 addons/website_blog/static/src/js/s_latest_posts_editor.js create mode 100644 addons/website_blog/static/src/js/s_latest_posts_frontend.js create mode 100644 addons/website_blog/static/src/scss/primary_variables.scss diff --git a/addons/website_blog/controllers/main.py b/addons/website_blog/controllers/main.py index 8adb6c5b9e6..f16f6ed761b 100644 --- a/addons/website_blog/controllers/main.py +++ b/addons/website_blog/controllers/main.py @@ -293,3 +293,8 @@ class WebsiteBlog(http.Controller): if not post_id: return False return request.env['blog.post'].browse(int(post_id)).write({'cover_properties': json.dumps(cover_properties)}) + + @http.route(['/blog/render_latest_posts'], type='json', auth='public', website=True) + def render_latest_posts(self, template, domain, limit=None, order='published_date desc'): + posts = request.env['blog.post'].search(domain, limit=limit, order=order) + return request.env.ref(template).render({'posts': posts}) diff --git a/addons/website_blog/static/src/img/s_latest_posts.jpg b/addons/website_blog/static/src/img/s_latest_posts.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87d14400e43d617bc28a601d1d4f419d873f4e46 GIT binary patch literal 3402 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 literal 0 HcmV?d00001 diff --git a/addons/website_blog/static/src/img/s_latest_posts_big_picture.jpg b/addons/website_blog/static/src/img/s_latest_posts_big_picture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38d2ca15a3997620f2c10184ae03f9edaf23ec21 GIT binary patch literal 4021 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 XzlxS1?ukCH(W?9J3+v2pZ+h@QGCek5 literal 0 HcmV?d00001 diff --git a/addons/website_blog/static/src/js/s_latest_posts_editor.js b/addons/website_blog/static/src/js/s_latest_posts_editor.js new file mode 100644 index 00000000000..10052de87b7 --- /dev/null +++ b/addons/website_blog/static/src/js/s_latest_posts_editor.js @@ -0,0 +1,106 @@ +odoo.define('website_blog.s_latest_posts_editor', function (require) { +'use strict'; + +var core = require('web.core'); +var sOptions = require('web_editor.snippets.options'); + +var _t = core._t; + +sOptions.registry.js_get_posts_limit = sOptions.Class.extend({ + + //-------------------------------------------------------------------------- + // Options + //-------------------------------------------------------------------------- + + /** + * @see this.selectClass for parameters + */ + postsLimit: function (previewMode, value, $opt) { + value = parseInt(value); + this.$target.attr('data-posts-limit', value).data('postsLimit', value); + this.trigger_up('animation_start_demand', { + editableMode: true, + $target: this.$target, + }); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @override + */ + _setActive: function () { + var self = this; + this._super.apply(this, arguments); + this.$('[data-posts-limit]').addBack('[data-posts-limit]') + .removeClass('active') + .filter(function () { + return (self.$target.data('postsLimit') || 3) == $(this).data('postsLimit'); + }) + .addClass('active'); + }, +}); + +sOptions.registry.js_get_posts_selectBlog = sOptions.Class.extend({ + /** + * @override + */ + start: function () { + var self = this; + + var def = this._rpc({ + model: 'blog.blog', + method: 'search_read', + args: [[], ['name', 'id']], + }).then(function (blogs) { + var $menu = self.$el.find('[data-filter-by-blog-id="0"]').parent(); + _.each(blogs, function (blog) { + $menu.append($('', { + class: 'dropdown-item', + 'data-filter-by-blog-id': blog.id, + 'data-no-preview': 'true', + text: blog.name, + })); + }); + }); + + return $.when(this._super.apply(this, arguments), def); + }, + + //-------------------------------------------------------------------------- + // Options + //-------------------------------------------------------------------------- + + /** + * @see this.selectClass for parameters + */ + filterByBlogId: function (previewMode, value, $opt) { + value = parseInt(value); + this.$target.attr('data-filter-by-blog-id', value).data('filterByBlogId', value); + this.trigger_up('animation_start_demand', { + editableMode: true, + $target: this.$target, + }); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @override + */ + _setActive: function () { + var self = this; + this._super.apply(this, arguments); + this.$('[data-filter-by-blog-id]').addBack('[data-filter-by-blog-id]') + .removeClass('active') + .filter(function () { + return (self.$target.data('filterByBlogId') || 0) == $(this).data('filterByBlogId'); + }) + .addClass('active'); + }, +}); +}); diff --git a/addons/website_blog/static/src/js/s_latest_posts_frontend.js b/addons/website_blog/static/src/js/s_latest_posts_frontend.js new file mode 100644 index 00000000000..f1b8ea4f23d --- /dev/null +++ b/addons/website_blog/static/src/js/s_latest_posts_frontend.js @@ -0,0 +1,142 @@ +odoo.define('website_blog.s_latest_posts_frontend', function (require) { +'use strict'; + +var core = require('web.core'); +var sAnimation = require('website.content.snippets.animation'); + +var _t = core._t; + +sAnimation.registry.js_get_posts = sAnimation.Class.extend({ + selector : '.js_get_posts', + + /** + * @override + */ + start: function () { + var self = this; + var limit = self.$target.data('postsLimit') || 3; + var blogID = self.$target.data('filterByBlogId'); + var template = self.$target.data('template') || 'website_blog.s_latest_posts_list_template'; + var loading = self.$target.data('loading'); + + this.$target.empty(); // Compatibility with db that saved content inside by mistake + this.$target.attr('contenteditable', 'False'); // Prevent user edition + + var domain = [['website_published', '=', true]]; + if (blogID) { + domain.push(['blog_id', '=', parseInt(blogID)]); + } + + var def = $.Deferred(); + this._rpc({ + route: '/blog/render_latest_posts', + params: { + template: template, + domain: domain, + limit: limit, + }, + }).then(function (posts) { + var $posts = $(posts).filter('.s_latest_posts_post'); + if (!$posts.length) { + self.$target.append($('
', {class: 'col-md-6 offset-md-3'}) + .append($('
', { + class: 'alert alert-warning alert-dismissible text-center', + text: _t("No blog post was found. Make sure your posts are published."), + }))); + return; + } + + if (loading && loading === true) { + // Perform an intro animation + self._showLoading($posts); + } else { + self.$target.html($posts); + } + }, function (e) { + if (self.editableMode) { + self.$target.append($('

', { + class: 'text-danger', + text: _t("An error occured with this latest posts block. If the problem persists, please consider deleting it and adding a new one"), + })); + } + }).always(def.resolve.bind(def)); + return $.when(this._super.apply(this, arguments), def); + }, + /** + * @override + */ + destroy: function () { + this.$target.empty(); + this._super.apply(this, arguments); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @private + */ + _showLoading: function ($posts) { + var self = this; + + _.each($posts, function (post) { + var $post = $(post); + var $loadingContainer = $post.find('.loading_container'); + var $thumb = $post.find('.thumb .o_blog_cover_image'); + var $progress = $('

', { + class: 'progress js-loading', + }).append($('
', { + class: 'progress-bar', + role: 'progressbar', + 'aria-valuenow': '0', + 'aria-valuemin': '0', + 'aria-valuemax': '100', + css: { + width: 0, + }, + })); + + // If can't find loading container or thumb inside the post, then they are the post itself + if (!$loadingContainer.length) { + $loadingContainer = $post; + } + if (!$thumb.length) { + $thumb = $post; + } + + $post.addClass('js-loading'); + $progress.appendTo($loadingContainer); + $post.appendTo(self.$target); + + var m = $thumb.css('background-image').match(/url\(["']?(.+)["']?\)/); + var bg = m ? m[1] : 'none'; + var loaded = false; + + var $bar = $progress.find('.progress-bar'); + $bar.css('width', '50%').attr('aria-valuenow', '50'); + + var $dummyImg = $(''); + + // Show the post after 5sec in any case + var timer = setTimeout(function () { + $dummyImg.remove(); + $post.removeClass('js-loading'); + $progress.hide(); + }, 5000); + + $dummyImg.load(function () { + $bar.css('width', '100%').attr('aria-valuenow', '100'); + setTimeout(function () { + $post.removeClass('js-loading'); + $progress.fadeOut(500); + }, 500); + $dummyImg.remove(); + clearTimeout(timer); + }); + + $dummyImg.attr('src', bg); + }); + }, +}); +}); diff --git a/addons/website_blog/static/src/scss/primary_variables.scss b/addons/website_blog/static/src/scss/primary_variables.scss new file mode 100644 index 00000000000..f5cda7678dc --- /dev/null +++ b/addons/website_blog/static/src/scss/primary_variables.scss @@ -0,0 +1,5 @@ + +$s-latest-posts-big-picture-figure-bg: null; + +@mixin s-latest-posts-js-get-posts-hook {}; +@mixin s-latest-posts-figure-hook {}; diff --git a/addons/website_blog/static/src/scss/website_blog.scss b/addons/website_blog/static/src/scss/website_blog.scss index cff15ed82e5..f16afd40bf2 100644 --- a/addons/website_blog/static/src/scss/website_blog.scss +++ b/addons/website_blog/static/src/scss/website_blog.scss @@ -232,3 +232,122 @@ padding: 2px 15px; } } + +//------------------------------------------------------------------------------ +// Latest posts snippets +//------------------------------------------------------------------------------ + +.s_latest_posts .media > a { + width: 100%; + height: 200px; + + @include media-breakpoint-up(md) { + width: 100px; + height: 100px; + } + + > .o_blog_cover_container { + position: relative; + width: 100%; + height: 100%; + padding: 0; + + > .o_blog_cover_component { + @include o-position-absolute(0, 0, 0, 0); + } + > .o_blog_cover_image { + background-size: cover; + background-position: center; + } + } +} + +$s-latest-posts-big-picture-figure-bg: $white !default; + +.s_latest_posts_big_picture { + .s_latest_posts_post { + position: relative; + height: 250px; + background: $s-latest-posts-big-picture-figure-bg; + text-align: center; + cursor: pointer; + transition: all 300ms; + + &.js-loading { + background: gray('200') !important; + } + + .thumb { + position: relative; + display: block; + width: 100%; + height: 100%; + padding: 0; + opacity: 0.8; + + > .o_blog_cover_component { + @include o-position-absolute(0, 0, 0, 0); + } + > .o_blog_cover_image { + background-size: cover; + background-position: center; + } + } + > div, > div > a { + @include o-position-absolute(0, 0, 0, 0); + padding: 2em; + color: $white; + text-transform: uppercase; + font-size: 1.25em; + backface-visibility: hidden; + &::after, &::before { + pointer-events: none; + } + + > a { + z-index: 1000; + text-indent: 200%; + white-space: nowrap; + font-size: 0; + opacity: 0; + } + h2 { + margin: 0; + font-size: 1.5em; + font-weight: 300; + span { + font-weight: 800; + } + } + p { + margin: 1em 0 0; + letter-spacing: 1px; + font-size: 68.5%; + } + } + @include s-latest-posts-figure-hook; + } + + @include s-latest-posts-js-get-posts-hook; +} + +.s_latest_posts, .s_latest_posts_big_picture { + + .js_get_posts { + position: relative; + min-height: 100px; + } + + .progress.js-loading { + @include o-position-absolute(0, 0, 0, 0); + border-radius: 0; + + .progress-bar { + @include o-position-absolute(45%, 10%, auto, 10%); + height: 10px; + margin: 0; + background: gray('600'); + box-shadow: none; + } + } +} diff --git a/addons/website_blog/views/snippets.xml b/addons/website_blog/views/snippets.xml index 6366b9c5458..9bb7a22136b 100644 --- a/addons/website_blog/views/snippets.xml +++ b/addons/website_blog/views/snippets.xml @@ -1,6 +1,11 @@ + + + diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml index 44d1d4a9ffa..1853eaefaa8 100644 --- a/addons/website_blog/views/website_blog_templates.xml +++ b/addons/website_blog/views/website_blog_templates.xml @@ -1,9 +1,16 @@ + + @@ -14,6 +21,7 @@