[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:
@@ -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);
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user