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 @@
- +