[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) <xmo@odoo.com>
This commit is contained in:
fja-odoo
2019-08-08 16:05:33 +00:00
committed by qsm-odoo
parent 50155ae08e
commit 736353b169
20 changed files with 125 additions and 94 deletions
@@ -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);
-5
View File
@@ -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):
+82 -9
View File
@@ -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 = $('<span>').addClass('o_stat_text o_not_hover ' + valColor).text(text);
var $hover = $('<span>').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);
});
@@ -5,6 +5,15 @@
<span class="o_stat_text">On Website</span>
</div>
<t t-name="WidgetWebsiteButtonIcon">
<button type="button" class="btn oe_stat_button">
<i class="fa fa-fw o_button_icon fa-globe"/>
<div class="o_stat_info">
<span class="o_stat_text">Go to<br/>Website</span>
</div>
</button>
</t>
<t t-name="website.WebsiteDashboardMain">
<div class="o_dashboards">
<div class="container-fluid o_website_dashboard">
+11 -17
View File
@@ -31,22 +31,19 @@ QUnit.module('website', {
View: FormView,
model: 'blog_post',
data: this.data,
arch:
'<form>' +
arch: '<form>' +
'<sheet>' +
'<div class="oe_button_box" name="button_box">' +
'<button class="oe_stat_button" name="website_publish_button" type="object" icon="fa-globe">' +
'<field name="website_published" widget="website_button"/>' +
'</button>' +
'<field name="website_published" widget="website_redirect_button"/>' +
'</div>' +
'</sheet>' +
'</form>',
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:
'<form>' +
arch: '<form>' +
'<sheet>' +
'<div class="oe_button_box" name="button_box">' +
'<button class="oe_stat_button" name="website_publish_button" type="object" icon="fa-globe">' +
'<field name="website_published" widget="website_button"/>' +
'</button>' +
'<field name="website_published" widget="website_redirect_button"/>' +
'</div>' +
'</sheet>' +
'</form>',
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();
});
@@ -61,10 +61,7 @@
<sheet>
<widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
<group name="blog_details">
<field name="blog_id"/>
@@ -260,7 +257,7 @@
<menuitem name="Blogs"
id="menu_website_blog_root_global"
sequence="100"
parent="website.menu_website_global_configuration"
parent="website.menu_website_global_configuration"
groups="website.group_website_designer"/>
<menuitem id="menu_website_blog_tag_category_global" parent="menu_website_blog_root_global"
@@ -58,10 +58,7 @@
<form string="Partner Level">
<sheet string="Level">
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
+1 -6
View File
@@ -35,12 +35,7 @@
</field>
<div name="button_box" position="inside">
<field name="website_url" invisible="1"/>
<button name="website_publish_button"
type="object"
class="oe_stat_button"
icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
<label for="is_online" position="after">
<field name="website_menu"/>
@@ -116,10 +116,7 @@
<widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_button_box" name="button_box">
<field name="website_url" invisible="1"/>
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
<field name="kanban_state" widget="state_selection"/>
<div class="oe_title">
@@ -23,7 +23,7 @@
<field name="inherit_id" ref="website_event.event_event_view_form_inherit_website"/>
<field name="model">event.event</field>
<field name="arch" type="xml">
<button name="website_publish_button" position="before">
<field name="is_published" position="before">
<button name="%(action_event_track_from_event)d"
type="action"
class="oe_stat_button"
@@ -36,7 +36,7 @@
icon="fa-users">
<field name="sponsor_count" string="Sponsors" widget="statinfo"/>
</button>
</button>
</field>
<label for="website_menu" position="after">
<field name="website_track" attrs="{'invisible': [('website_menu', '=', False)]}"/>
<label for="website_track" string="Tracks on Website" attrs="{'invisible': [('website_menu', '=', False)]}"/>
@@ -12,10 +12,7 @@
<field name="karma" string="Forum Karma"/>
</field>
<div name="button_box" position="inside">
<button class="oe_stat_button" name="open_website_url"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
</field>
</record>
@@ -17,10 +17,7 @@
<field name="inherit_id" ref="hr_recruitment.hr_job_survey"/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
</field>
</record>
@@ -46,5 +43,4 @@
</field>
</field>
</record>
</odoo>
@@ -8,10 +8,7 @@
<field name="inherit_id" ref="im_livechat.im_livechat_channel_view_form"/>
<field name="arch" type="xml">
<div name="button_box" position="inside">
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
</field>
</record>
@@ -8,10 +8,7 @@
<field name="arch" type="xml">
<data>
<div name="button_box" position="inside">
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
</data>
</field>
@@ -6,11 +6,10 @@
<field name="inherit_id" ref="gamification.badge_form_view"/>
<field name="arch" type="xml">
<xpath expr="//div[@name='button_box']" position="inside">
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
<button name="website_publish_button" type="object" class="oe_stat_button" icon="fa-globe">
<field name="is_published" widget="website_publish_button"/>
</button>
</xpath>
</field>
</record>
</odoo>
</odoo>
+1 -6
View File
@@ -410,12 +410,7 @@ class Product(models.Model):
def website_publish_button(self):
self.ensure_one()
res = self.product_tmpl_id.website_publish_button()
# res can be the result of write() if not website_publisher
if type(res) == dict and res.get('type') == 'ir.actions.act_url':
res['url'] = self.website_url
return res
return self.product_tmpl_id.website_publish_button()
def open_website_url(self):
self.ensure_one()
+1 -4
View File
@@ -99,10 +99,7 @@
<attribute name="invisible">0</attribute>
</xpath>
<div name="button_box" position="inside">
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe" attrs="{'invisible': [('sale_ok','=',False)]}">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button" attrs="{'invisible': [('sale_ok','=',False)]}"/>
</div>
<xpath expr="//page[@name='sales']" position="after">
<page name="shop" string="eCommerce" attrs="{'invisible': [('sale_ok','=',False)]}">
@@ -15,8 +15,8 @@
</page>
</xpath>
<xpath expr="//button[@name='toggle_prod_environment']" position='before'>
<button class="oe_stat_button" name="website_publish_button" type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
<button name="website_publish_button" type="object" class="oe_stat_button" icon="fa-globe">
<field name="is_published" widget="website_publish_button"/>
</button>
</xpath>
</field>
@@ -39,10 +39,7 @@
attrs="{'invisible': [('allow_comment', '=', False)]}">
<field name="rating_count" string="Reviews" widget="statinfo"/>
</button>
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"/>
</div>
<field name="image_1920" widget="image" class="oe_avatar" options="{'preview_image': 'image_128'}"/>
<div class="oe_title">
@@ -42,10 +42,8 @@
<sheet>
<widget name="web_ribbon" text="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_button_box" name="button_box">
<button class="oe_stat_button" name="website_publish_button"
type="object" icon="fa-globe" attrs="{'invisible': [('is_category', '=', True)]}">
<field name="is_published" widget="website_button"/>
</button>
<field name="is_published" widget="website_redirect_button"
attrs="{'invisible': [('is_category', '=', True)]}"/>
</div>
<field name="image_1920" widget="image" class="oe_avatar" options='{"preview_image": "image_256"}'
attrs="{'readonly': [('slide_type', 'in', ('document', 'presentation', 'video'))], 'invisible': [('is_category', '=', True)]}"
@@ -277,4 +275,4 @@
<field name="view_id" ref="slide_slide_view_graph"/>
</record>
</data>
</odoo>
</odoo>