diff --git a/addons/account/models/account.py b/addons/account/models/account.py index 819ecfd8243..8d4d833a731 100644 --- a/addons/account/models/account.py +++ b/addons/account/models/account.py @@ -34,7 +34,7 @@ class AccountAccountTag(models.Model): name = fields.Char(required=True) applicability = fields.Selection([('accounts', 'Accounts'), ('taxes', 'Taxes')], required=True, default='accounts') - color = fields.Integer('Color Index', default=10) + color = fields.Integer('Color Index') active = fields.Boolean(default=True, help="Set active to false to hide the Account Tag without removing it.") #---------------------------------------------------------- diff --git a/addons/analytic/models/analytic_account.py b/addons/analytic/models/analytic_account.py index a87a948e1fa..47fee210a3f 100644 --- a/addons/analytic/models/analytic_account.py +++ b/addons/analytic/models/analytic_account.py @@ -8,7 +8,7 @@ class AccountAnalyticTag(models.Model): _name = 'account.analytic.tag' _description = 'Analytic Tags' name = fields.Char(string='Analytic Tag', index=True, required=True) - color = fields.Integer('Color Index', default=10) + color = fields.Integer('Color Index') active = fields.Boolean(default=True, help="Set active to false to hide the Analytic Tag without removing it.") diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 08dbd62cc0e..fb3505b5b5e 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -1220,7 +1220,7 @@ class Tag(models.Model): _description = "Category of lead" name = fields.Char('Name', required=True, translate=True) - color = fields.Integer('Color Index', default=10) + color = fields.Integer('Color Index') _sql_constraints = [ ('name_uniq', 'unique (name)', "Tag name already exists !"), diff --git a/addons/fleet/models/fleet_vehicle.py b/addons/fleet/models/fleet_vehicle.py index 2d6b59285ec..082f802f5f9 100644 --- a/addons/fleet/models/fleet_vehicle.py +++ b/addons/fleet/models/fleet_vehicle.py @@ -297,7 +297,7 @@ class FleetVehicleTag(models.Model): _name = 'fleet.vehicle.tag' name = fields.Char(required=True, translate=True) - color = fields.Integer('Color Index', default=10) + color = fields.Integer('Color Index') _sql_constraints = [('name_uniq', 'unique (name)', "Tag name already exists !")] diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 99635b600c3..0738c31728e 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -873,7 +873,7 @@ class ProjectTags(models.Model): _description = "Tasks Tags" name = fields.Char(required=True) - color = fields.Integer(string='Color Index', default=10) + color = fields.Integer(string='Color Index') _sql_constraints = [ ('name_uniq', 'unique (name)', "Tag name already exists!"), diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index 6f775e789d4..f9ed847cefc 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -1703,6 +1703,7 @@ var FormFieldMany2ManyTags = FieldMany2ManyTags.extend({ events: _.extend({}, FieldMany2ManyTags.prototype.events, { 'click .badge': '_onOpenColorPicker', 'mousedown .o_colorpicker a': '_onUpdateColor', + 'mousedown .o_colorpicker .o_hide_in_kanban': '_onUpdateColor', 'focusout .o_colorpicker': '_onCloseColorPicker', }), @@ -1713,43 +1714,63 @@ var FormFieldMany2ManyTags = FieldMany2ManyTags.extend({ /** * @private */ - _onCloseColorPicker: function (){ + _onCloseColorPicker: function () { this.$color_picker.remove(); }, /** * @private - * @param {MouseEvent} event + * @param {MouseEvent} ev */ - _onOpenColorPicker: function (event) { - var tag_id = $(event.currentTarget).data('id'); - var tag = _.findWhere(this.value.data, { res_id: tag_id }); + _onOpenColorPicker: function (ev) { + var tagID = $(ev.currentTarget).data('id'); + var tagColor = $(ev.currentTarget).data('color'); + var tag = _.findWhere(this.value.data, { res_id: tagID }); if (tag && this.colorField in tag.data) { // if there is a color field on the related model this.$color_picker = $(qweb.render('FieldMany2ManyTag.colorpicker', { 'widget': this, - 'tag_id': tag_id, + 'tag_id': tagID, })); - $(event.currentTarget).append(this.$color_picker); + $(ev.currentTarget).append(this.$color_picker); this.$color_picker.dropdown('toggle'); this.$color_picker.attr("tabindex", 1).focus(); + if (!tagColor) { + this.$('.o_checkbox input').prop('checked', true); + } } }, /** + * Update color based on target of ev + * either by clicking on a color item or + * by toggling the 'Hide in Kanban' checkbox. + * * @private - * @param {MouseEvent} event + * @param {MouseEvent} ev */ - _onUpdateColor: function (event) { - event.preventDefault(); - var self = this; - var color = $(event.currentTarget).data('color'); - var id = $(event.currentTarget).data('id'); - var tag = self.$("span.badge[data-id='" + id + "']"); - var current_color = tag.data('color'); - - if (color === current_color) { return; } - + _onUpdateColor: function (ev) { + ev.preventDefault(); + var $target = $(ev.currentTarget); + var color = $target.data('color'); + var id = $target.data('id'); + var tag = this.$("span.badge[data-id='" + id + "']"); + var currentColor = tag.data('color'); var changes = {}; + + if ($target.is('.o_hide_in_kanban')) { + var $checkbox = $('.o_hide_in_kanban .o_checkbox input'); + $checkbox.prop('checked', !$checkbox.prop('checked')); // toggle checkbox + this.prevColors = this.prevColors ? this.prevColors : {}; + if ($checkbox.is(':checked')) { + this.prevColors[id] = currentColor + } else { + color = this.prevColors[id] ? this.prevColors[id] : 1; + } + } else if ($target.is('[class^="o_tag_color"]')) { // $target.is('o_tag_color_') + if (color === currentColor) { return; } + } + changes[this.colorField] = color; + this.trigger_up('field_changed', { dataPointID: _.findWhere(this.value.data, {res_id: id}).id, changes: changes, diff --git a/addons/web/static/src/less/fields.less b/addons/web/static/src/less/fields.less index 9450147e7e8..358e9e81897 100644 --- a/addons/web/static/src/less/fields.less +++ b/addons/web/static/src/less/fields.less @@ -91,16 +91,6 @@ .o-flex-flow(row, wrap); .o-align-items(baseline); - .o-tag-color(@size: 0) when (@size < @odoo-nb-ui-color) { - .o_tag_color_@{size} { - &, &::after { - background-color: ~"@{odoo-color-@{size}}"; - } - } - .o-tag-color(@size + 1); - } - .o-tag-color(); - > .o_field_widget { .o-flex(1, 0, 100px); position: initial; @@ -119,8 +109,45 @@ max-width: 200px; } + // o-kanban-colorpicker without customizing + // '&:first-child > a::before' (transparent red-crossed colorpick) + .o-tag-colorpicker() { + @o-tag-colorpicker-padding-right: @odoo-dropdown-hpadding - 2 * @o-kanban-inner-hmargin; + + max-width: 100%; + padding: 3px @o-tag-colorpicker-padding-right 3px @odoo-dropdown-hpadding; + + > li { + display: inline-block; + margin: @o-kanban-inner-hmargin @o-kanban-inner-hmargin 0 0; + border: 1px solid white; + box-shadow: 0 0 0 1px @gray-lighter-dark; + + > a { + display: block; + + &::after { + content: ""; + display: block; + width: 20px; + height: 15px; + } + } + + &:last-of-type { + box-shadow: 0 0 0 0px white; // remove grey border on hide in kanban + color: @odoo-main-text-color; + } + } + } + + > .tagcolor_dropdown_menu { + min-width: 150px; // down from 160px of .dropdown-menu + margin-right: 0px; // cancel right margin of .dropdown-menu + } + > .o_colorpicker > ul { - .o-kanban-colorpicker(); + .o-tag-colorpicker(); white-space: normal; } @@ -128,6 +155,27 @@ cursor: pointer; } } + + .o-tag-color(@size: 0) when (@size < @odoo-nb-ui-color) { + .o_tag_color_@{size} when (@size = 0) { + & { + background-color: white; + color: ~"@{odoo-color-@{size}}"; + box-shadow: inset 0 0 0 2px ~"@{odoo-color-@{size}}"; + } + &::after { + background-color: ~"@{odoo-color-@{size}}"; + } + } + .o_tag_color_@{size} when (@size > 0) { + &, &::after { + background-color: ~"@{odoo-color-@{size}}"; + } + } + .o-tag-color(@size + 1); + } + .o-tag-color(); + } // Stars diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index f1af2e7d762..78ffa4cac1e 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -792,14 +792,23 @@ -