From 736353b169d451d48cb9d5ae82c2d342543ba57e Mon Sep 17 00:00:00 2001 From: fja-odoo Date: Wed, 19 Jun 2019 15:28:56 +0000 Subject: [PATCH] [IMP] website, *: improve published smart button * = web, website_blog, website_crm_partner_assign, website_event, website_event_track, website_forum, website_hr_recruitment, website_livechat, website_partner, website_profile, website_sale, website_sale_delivery, website_slides The published button name is a bit ambiguous, now it will clearly state what it does with a new title : "Go to Website". The "Published", "Unpublished" state is shown with the globe icon changing color (green and red) and a title on the button. Badge and Delivery don't have a website page, the button will then be a publish/unpublish button in the backend. task-2002435 closes odoo/odoo#34261 Signed-off-by: Xavier Morel (xmo) --- addons/web/static/src/scss/form_view.scss | 1 + addons/website/models/mixins.py | 5 - .../website/static/src/js/backend/button.js | 91 +++++++++++++++++-- .../static/src/xml/website.backend.xml | 9 ++ addons/website/static/tests/website_tests.js | 28 +++--- .../website_blog/views/website_blog_views.xml | 7 +- .../views/res_partner_views.xml | 5 +- addons/website_event/views/event_views.xml | 7 +- .../views/event_track_views.xml | 5 +- .../website_event_track/views/event_views.xml | 4 +- .../website_forum/views/res_users_views.xml | 5 +- .../views/hr_recruitment_views.xml | 6 +- .../views/website_livechat_view.xml | 5 +- .../views/res_partner_views.xml | 5 +- .../views/gamification_badge_views.xml | 7 +- addons/website_sale/models/product.py | 7 +- addons/website_sale/views/product_views.xml | 5 +- .../views/website_sale_delivery_views.xml | 4 +- .../views/slide_channel_views.xml | 5 +- .../views/slide_slide_views.xml | 8 +- 20 files changed, 125 insertions(+), 94 deletions(-) diff --git a/addons/web/static/src/scss/form_view.scss b/addons/web/static/src/scss/form_view.scss index 088fefc03ed..51920df3510 100644 --- a/addons/web/static/src/scss/form_view.scss +++ b/addons/web/static/src/scss/form_view.scss @@ -338,6 +338,7 @@ background-color: transparent; opacity: 0.8; border-radius: 0px; + margin-bottom: 0; // If the button comes from a field &:hover, &:focus { background-color: rgba(black, 0.03); diff --git a/addons/website/models/mixins.py b/addons/website/models/mixins.py index a13fc3d59e4..76c98ca5ce6 100644 --- a/addons/website/models/mixins.py +++ b/addons/website/models/mixins.py @@ -132,11 +132,6 @@ class WebsitePublishedMixin(models.AbstractModel): def website_publish_button(self): self.ensure_one() - if self.env.user.has_group('website.group_website_publisher') and self.website_url != '#': - # Force website to land on record's website to publish/unpublish it - if 'website_id' in self and self.env.user.has_group('website.group_multi_website'): - self.website_id._force() - return self.open_website_url() return self.write({'website_published': not self.website_published}) def open_website_url(self): diff --git a/addons/website/static/src/js/backend/button.js b/addons/website/static/src/js/backend/button.js index 0f6ea22cb7f..23be7708e5b 100644 --- a/addons/website/static/src/js/backend/button.js +++ b/addons/website/static/src/js/backend/button.js @@ -7,8 +7,59 @@ var field_registry = require('web.field_registry'); var _t = core._t; -var WidgetWebsiteButton = AbstractField.extend({ - template: 'WidgetWebsiteButton', +var WebsitePublishButton = AbstractField.extend({ + className: 'o_stat_info', + supportedFieldTypes: ['boolean'], + + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * A boolean field is always set since false is a valid value. + * + * @override + */ + isSet: function () { + return true; + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * This widget is supposed to be used inside a stat button and, as such, is + * rendered the same way in edit and readonly mode. + * + * @override + * @private + */ + _render: function () { + this.$el.empty(); + var text = this.value ? _t("Published") : _t("Unpublished"); + var hover = this.value ? _t("Unpublish") : _t("Publish"); + var valColor = this.value ? 'text-success' : 'text-danger'; + var hoverColor = this.value ? 'text-danger' : 'text-success'; + var $val = $('').addClass('o_stat_text o_not_hover ' + valColor).text(text); + var $hover = $('').addClass('o_stat_text o_hover ' + hoverColor).text(hover); + this.$el.append($val).append($hover); + }, +}); + +var WidgetWebsiteButtonIcon = AbstractField.extend({ + template: 'WidgetWebsiteButtonIcon', + events: { + 'click': '_onClick', + }, + + /** + * @override + */ + start: function () { + this.$icon = this.$('.o_button_icon'); + return this._super.apply(this, arguments); + }, //-------------------------------------------------------------------------- // Public @@ -27,18 +78,40 @@ var WidgetWebsiteButton = AbstractField.extend({ /** * @override - * @private */ _render: function () { this._super.apply(this, arguments); - var $value = this.$('.o_value'); - var published = (this.value === true); - $value.html(published ? _t("Published") : _t("Unpublished")) - .toggleClass('text-danger', !published) - .toggleClass('text-success', published); + var published = this.value; + var info = published ? _t("Published") : _t("Unpublished"); + this.$el.attr('aria-label', info) + .prop('title', info); + this.$icon.toggleClass('text-danger', !published) + .toggleClass('text-success', published); + }, + + //-------------------------------------------------------------------------- + // Handler + //-------------------------------------------------------------------------- + + /** + * Redirects to the website page of the record. + * + * @private + */ + _onClick: function () { + var self = this; + this._rpc({ + model: this.model, + method: 'open_website_url', + args: [this.res_id], + }).then(function (result) { + self.do_action(result); + }); }, }); -field_registry.add('website_button', WidgetWebsiteButton); +field_registry + .add('website_redirect_button', WidgetWebsiteButtonIcon) + .add('website_publish_button', WebsitePublishButton); }); diff --git a/addons/website/static/src/xml/website.backend.xml b/addons/website/static/src/xml/website.backend.xml index 25745afb6b8..1063de39fed 100644 --- a/addons/website/static/src/xml/website.backend.xml +++ b/addons/website/static/src/xml/website.backend.xml @@ -5,6 +5,15 @@ On Website + + + +
diff --git a/addons/website/static/tests/website_tests.js b/addons/website/static/tests/website_tests.js index cd7d14a68a3..8d43100b9d5 100644 --- a/addons/website/static/tests/website_tests.js +++ b/addons/website/static/tests/website_tests.js @@ -31,22 +31,19 @@ QUnit.module('website', { View: FormView, model: 'blog_post', data: this.data, - arch: - '
' + + arch: '' + '' + '
' + - '' + + '' + '
' + '
' + '
', res_id: 1, }); - var selector = '.oe_button_box .oe_stat_button .o_stat_info[name="website_published"] .o_stat_text'; - assert.containsN(form, selector, 2, "there should be two texts displayed"); - selector = '.oe_button_box .oe_stat_button .o_stat_info[name="website_published"] .o_stat_text.o_value.text-danger'; - assert.containsOnce(form, selector, "there should be one text in red"); + var selector = '.oe_button_box .oe_stat_button[name="website_published"] .o_stat_text'; + assert.containsN(form, selector, 1, "there should be one text displayed"); + selector = '.oe_button_box .oe_stat_button[name="website_published"] .o_button_icon.fa-globe.text-danger'; + assert.containsOnce(form, selector, "there should be one icon in red"); form.destroy(); }); QUnit.test("widget website button: display true value", async function (assert) { @@ -56,21 +53,18 @@ QUnit.module('website', { View: FormView, model: 'blog_post', data: this.data, - arch: - '
' + + arch: '' + '' + '
' + - '' + + '' + '
' + '
' + '
', res_id: 2, }); - var selector = '.oe_button_box .oe_stat_button .o_stat_info[name="website_published"] .o_stat_text'; - assert.containsN(form, selector, 2, "should be two texts displayed"); - selector = '.oe_button_box .oe_stat_button .o_stat_info[name="website_published"] .o_stat_text.o_value.text-success'; + var selector = '.oe_button_box .oe_stat_button[name="website_published"] .o_stat_text'; + assert.containsN(form, selector, 1, "should be one text displayed"); + selector = '.oe_button_box .oe_stat_button[name="website_published"] .o_button_icon.fa-globe.text-success'; assert.containsOnce(form, selector, "there should be one text in green"); form.destroy(); }); diff --git a/addons/website_blog/views/website_blog_views.xml b/addons/website_blog/views/website_blog_views.xml index 7152b2c299b..e73f23b9ad8 100644 --- a/addons/website_blog/views/website_blog_views.xml +++ b/addons/website_blog/views/website_blog_views.xml @@ -61,10 +61,7 @@
- +
@@ -260,7 +257,7 @@
- +