mirror of
https://github.com/OCA/web.git
synced 2025-02-22 13:21:25 +02:00
Merge pull request #473 from hbrunn/9.0-web_tree_dynamic_colored_field
9.0 web tree dynamic colored field
This commit is contained in:
@@ -4,14 +4,20 @@ Colorize field in tree views
|
||||
This module aims to add support for dynamically coloring fields in tree view
|
||||
according to data in the record.
|
||||
|
||||
It provides new attributes with the same syntax as 'colors' attribute in tree tag.
|
||||
It provides attributes on fields with the same syntax as the 'colors' attribute
|
||||
in tree tags.
|
||||
|
||||
Further, it provides a ``color_field`` attribute on tree tags to use a field's
|
||||
value as color.
|
||||
|
||||
Features
|
||||
========
|
||||
|
||||
* Add attribute 'bg_color' to color background of a cell in tree view
|
||||
* Add attribute ``bg_color`` on fields to color background of a cell in tree view
|
||||
|
||||
* Add attribute 'fg_color' to change text color of a cell in tree view
|
||||
* Add attribute ``fg_color`` on fields to change text color of a cell in tree view
|
||||
|
||||
* Add attribute ``color_field`` on the tree element to use as color
|
||||
|
||||
|
||||
Usage
|
||||
@@ -45,16 +51,31 @@ Usage
|
||||
|
||||
With this example, column which renders 'name' field will have its text colored in white.
|
||||
|
||||
* In the tree view declaration, use color_field="color" attribute in the tree tag::
|
||||
|
||||
...
|
||||
<field name="arch" type="xml">
|
||||
<tree string="View name" color_field="color">
|
||||
...
|
||||
<field name="color" invisible="1" />
|
||||
...
|
||||
</tree>
|
||||
</field>
|
||||
...
|
||||
|
||||
With this example, the content of the field named `color` will be used to
|
||||
populate the `color` CSS value. Use a function field to return whichever
|
||||
color you want depending on the other record values. Note that this
|
||||
overrides the `colors` attribute, and that you need the tree to load your
|
||||
field in the first place by adding it as invisible field.
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
|
||||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/web/issues>`_.
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback
|
||||
`here <https://github.com/OCA/web/issues/new?body=module:%20web_widget_color_tree_field%0Aversion:%208.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
|
||||
Bugs are tracked on `GitHub Issues
|
||||
<https://github.com/OCA/web/issues>`_. In case of trouble, please
|
||||
check there if your issue has already been reported. If you spotted it first,
|
||||
help us smashing it by providing a detailed and welcomed feedback.
|
||||
|
||||
Credits
|
||||
=======
|
||||
@@ -63,13 +84,14 @@ Contributors
|
||||
------------
|
||||
|
||||
* Damien Crier <damien.crier@camptocamp.com>
|
||||
* Holger Brunn <hbrunn@therp.nl>
|
||||
|
||||
Maintainer
|
||||
----------
|
||||
|
||||
.. image:: http://odoo-community.org/logo.png
|
||||
.. image:: https://odoo-community.org/logo.png
|
||||
:alt: Odoo Community Association
|
||||
:target: http://odoo-community.org
|
||||
:target: https://odoo-community.org
|
||||
|
||||
This module is maintained by the OCA.
|
||||
|
||||
@@ -77,4 +99,4 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
|
||||
mission is to support the collaborative development of Odoo features and
|
||||
promote its widespread use.
|
||||
|
||||
To contribute to this module, please visit http://odoo-community.org.
|
||||
To contribute to this module, please visit https://odoo-community.org.
|
||||
|
||||
@@ -1,20 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Damien Crier
|
||||
# Copyright 2015 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
# © 2015 Camptocamp SA, Damien Crier
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
@@ -1,37 +1,22 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Author: Damien Crier
|
||||
# Copyright 2015 Camptocamp SA
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
# © 2015 Camptocamp SA, Damien Crier
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
{
|
||||
'name': 'web tree dynamic colored field',
|
||||
'category': 'Hidden',
|
||||
'version': '8.0.1.0.0',
|
||||
'name': 'Colorize field in tree views',
|
||||
'summary': 'Allows you to dynamically color fields on tree views',
|
||||
'category': 'Hidden/Dependency',
|
||||
'version': '9.0.2.0.0',
|
||||
'depends': ['web'],
|
||||
'author': "Camptocamp,Odoo Community Association (OCA)",
|
||||
'author': "Camptocamp,Therp BV,Odoo Community Association (OCA)",
|
||||
'license': 'AGPL-3',
|
||||
'website': 'http://www.camptocamp.com',
|
||||
'website': 'https://github.com/OCA/web',
|
||||
'demo': [
|
||||
"demo/res_users.xml",
|
||||
],
|
||||
'data': [
|
||||
'views/web_tree_dynamic_colored_field.xml',
|
||||
],
|
||||
'qweb': [
|
||||
'static/xml/*.xml',
|
||||
'static/src/xml/*.xml',
|
||||
],
|
||||
'auto_install': False,
|
||||
'installable': False,
|
||||
}
|
||||
|
||||
22
web_tree_dynamic_colored_field/demo/res_users.xml
Normal file
22
web_tree_dynamic_colored_field/demo/res_users.xml
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<record id="view_users_tree" model="ir.ui.view">
|
||||
<field name="model">res.users</field>
|
||||
<field name="inherit_id" ref="base.view_users_tree" />
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="." position="attributes">
|
||||
<attribute name="color_field">lang</attribute>
|
||||
</xpath>
|
||||
<field name="login_date" position="attributes">
|
||||
<attribute name="bg_color">red: login_date == False</attribute>
|
||||
<attribute name="fg_color">white: login_date == False</attribute>
|
||||
</field>
|
||||
<field name="name" position="attributes">
|
||||
<attribute name="bg_color">red: login == 'admin'</attribute>
|
||||
<attribute name="fg_color">white: login == 'admin'</attribute>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
26
web_tree_dynamic_colored_field/i18n/fi.po
Normal file
26
web_tree_dynamic_colored_field/i18n/fi.po
Normal file
@@ -0,0 +1,26 @@
|
||||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * web_tree_dynamic_colored_field
|
||||
#
|
||||
# Translators:
|
||||
# Jarmo Kortetjärvi <jarmo.kortetjarvi@gmail.com>, 2016
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 8.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-07-08 16:36+0000\n"
|
||||
"PO-Revision-Date: 2016-07-08 16:36+0000\n"
|
||||
"Last-Translator: Jarmo Kortetjärvi <jarmo.kortetjarvi@gmail.com>, 2016\n"
|
||||
"Language-Team: Finnish (https://www.transifex.com/oca/teams/23907/fi/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Language: fi\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. module: web_tree_dynamic_colored_field
|
||||
#. openerp-web
|
||||
#: code:addons/web_tree_dynamic_colored_field/static/src/xml/web_tree_dynamic_colored_field.xml:7
|
||||
#, python-format
|
||||
msgid "columns.fct_colorize(record, column)"
|
||||
msgstr "columns.fct_colorize(record, column)"
|
||||
26
web_tree_dynamic_colored_field/i18n/sl.po
Normal file
26
web_tree_dynamic_colored_field/i18n/sl.po
Normal file
@@ -0,0 +1,26 @@
|
||||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * web_tree_dynamic_colored_field
|
||||
#
|
||||
# Translators:
|
||||
# Matjaž Mozetič <m.mozetic@matmoz.si>, 2016
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 8.0\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-06-24 00:46+0000\n"
|
||||
"PO-Revision-Date: 2016-06-24 00:46+0000\n"
|
||||
"Last-Translator: Matjaž Mozetič <m.mozetic@matmoz.si>, 2016\n"
|
||||
"Language-Team: Slovenian (https://www.transifex.com/oca/teams/23907/sl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: \n"
|
||||
"Language: sl\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
|
||||
|
||||
#. module: web_tree_dynamic_colored_field
|
||||
#. openerp-web
|
||||
#: code:addons/web_tree_dynamic_colored_field/static/src/xml/web_tree_dynamic_colored_field.xml:7
|
||||
#, python-format
|
||||
msgid "columns.fct_colorize(record, column)"
|
||||
msgstr "columns.fct_colorize(record, column)"
|
||||
@@ -1,86 +0,0 @@
|
||||
openerp.web_tree_dynamic_colored_field = function(instance){
|
||||
var _t = instance.web._t,
|
||||
_lt = instance.web._lt;
|
||||
var QWeb = instance.web.qweb;
|
||||
|
||||
var pair_colors = function(pair_color){
|
||||
if (pair_color != ""){
|
||||
var pair_list = pair_color.split(':'),
|
||||
color = pair_list[0],
|
||||
expression = pair_list[1];
|
||||
return [color, py.parse(py.tokenize(expression)), expression]
|
||||
}
|
||||
};
|
||||
|
||||
var colorize_helper = function(obj, record, column, field_attribute, css_attribute){
|
||||
var result = '';
|
||||
if (column[field_attribute]){
|
||||
var colors = _(column[field_attribute].split(';'))
|
||||
.chain()
|
||||
.map(pair_colors)
|
||||
.value();
|
||||
var colors = colors.filter(function CheckUndefined(value, index, ar) {
|
||||
return value != undefined;
|
||||
})
|
||||
var ctx = _.extend(
|
||||
{},
|
||||
record.attributes,
|
||||
{
|
||||
uid: obj.session.uid,
|
||||
current_date: new Date().toString('yyyy-MM-dd')
|
||||
}
|
||||
);
|
||||
for(i=0, len=colors.length; i<len; ++i) {
|
||||
pair = colors[i];
|
||||
var color = pair[0];
|
||||
var expression = pair[1];
|
||||
if (py.evaluate(expression, ctx).toJSON()) {
|
||||
result = css_attribute + ': ' + color + ';';
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
};
|
||||
|
||||
var colorize = function(record, column){
|
||||
var res = '';
|
||||
res += colorize_helper(this, record, column, 'bg_color', 'background-color');
|
||||
res += colorize_helper(this, record, column, 'fg_color', 'color');
|
||||
return res;
|
||||
};
|
||||
|
||||
instance.web.ListView.List.include({
|
||||
init: function(group, opts){
|
||||
this._super(group, opts);
|
||||
this.columns.fct_colorize = colorize;
|
||||
},
|
||||
fct_colorize: colorize,
|
||||
render: function() {
|
||||
this.$current.empty().append(
|
||||
QWeb.render('ListView.rows', _.extend({
|
||||
render_cell: function () {
|
||||
return self.render_cell.apply(self, arguments); },
|
||||
fct_colorize: function(){
|
||||
return self.fct_colorize.apply(self, arguments);
|
||||
}
|
||||
}, this)));
|
||||
this.pad_table_to(4);
|
||||
},
|
||||
render_record: function(record) {
|
||||
var self = this;
|
||||
var index = this.records.indexOf(record);
|
||||
return QWeb.render('ListView.row', {
|
||||
columns: this.columns,
|
||||
options: this.options,
|
||||
record: record,
|
||||
row_parity: (index % 2 === 0) ? 'even' : 'odd',
|
||||
view: this.view,
|
||||
render_cell: function () {
|
||||
return self.render_cell.apply(self, arguments); },
|
||||
fct_colorize: function(){
|
||||
return self.fct_colorize.apply(self, arguments);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
odoo.define('web_tree_dynamic_colored_field', function(require)
|
||||
{
|
||||
'use strict';
|
||||
var ListView = require('web.ListView'),
|
||||
pyeval = require('web.pyeval'),
|
||||
py = window.py;
|
||||
|
||||
var pair_colors = function(pair_color){
|
||||
if (pair_color !== ""){
|
||||
var pair_list = pair_color.split(':'),
|
||||
color = pair_list[0],
|
||||
expression = pair_list[1];
|
||||
return [color, py.parse(py.tokenize(expression)), expression];
|
||||
}
|
||||
};
|
||||
|
||||
var get_eval_context = function(record){
|
||||
return _.extend(
|
||||
{},
|
||||
record.attributes,
|
||||
pyeval.context()
|
||||
);
|
||||
};
|
||||
|
||||
var colorize_helper = function(obj, record, column, field_attribute, css_attribute){
|
||||
var result = '';
|
||||
if (column[field_attribute]){
|
||||
var colors = _(column[field_attribute].split(';'))
|
||||
.chain()
|
||||
.map(pair_colors)
|
||||
.value()
|
||||
.filter(function CheckUndefined(value, index, ar) {
|
||||
return value !== undefined;
|
||||
});
|
||||
var ctx = get_eval_context(record);
|
||||
for(var i=0, len=colors.length; i<len; ++i) {
|
||||
var pair = colors[i],
|
||||
color = pair[0],
|
||||
expression = pair[1];
|
||||
if (py.evaluate(expression, ctx).toJSON()) {
|
||||
result = css_attribute + ': ' + color + ';';
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
var colorize = function(record, column){
|
||||
var res = '';
|
||||
res += colorize_helper(this, record, column, 'bg_color', 'background-color');
|
||||
res += colorize_helper(this, record, column, 'fg_color', 'color');
|
||||
return res;
|
||||
};
|
||||
|
||||
ListView.List.include({
|
||||
init: function(group, opts){
|
||||
this._super(group, opts);
|
||||
this.columns.fct_colorize = colorize;
|
||||
},
|
||||
});
|
||||
|
||||
ListView.include({
|
||||
load_view: function()
|
||||
{
|
||||
var self = this;
|
||||
return this._super.apply(this, arguments)
|
||||
.then(function()
|
||||
{
|
||||
// the style_for helper is only called if one of colors or
|
||||
// fonts is not null
|
||||
if(self.fields_view.arch.attrs.color_field)
|
||||
{
|
||||
self.colors = [];
|
||||
}
|
||||
});
|
||||
},
|
||||
style_for: function (record)
|
||||
{
|
||||
var result = this._super.apply(this, arguments);
|
||||
if(this.fields_view.arch.attrs.color_field)
|
||||
{
|
||||
var color = py.evaluate(
|
||||
py.parse(py.tokenize(
|
||||
this.fields_view.arch.attrs.color_field
|
||||
)),
|
||||
get_eval_context(record)).toJSON();
|
||||
if(color)
|
||||
{
|
||||
result += 'color: ' + color;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
<tr t-extend="ListView.row">
|
||||
<t t-jquery="td[t-att-data-field='column.id']" t-operation="attributes">
|
||||
<attribute name="t-att-style">fct_colorize(record, column)</attribute>
|
||||
<attribute name="t-att-style">columns.fct_colorize(record, column)</attribute>
|
||||
</t>
|
||||
</tr>
|
||||
|
||||
</templates>
|
||||
</templates>
|
||||
@@ -5,8 +5,8 @@
|
||||
<data>
|
||||
<template id="assets_backend" name="web_tree_dynamic_colored_field assets" inherit_id="web.assets_backend">
|
||||
<xpath expr="." position="inside">
|
||||
<script type="text/javascript" src="/web_tree_dynamic_colored_field/static/js/web_tree_dynamic_colored_field.js"></script>
|
||||
<script type="text/javascript" src="/web_tree_dynamic_colored_field/static/src/js/web_tree_dynamic_colored_field.js"></script>
|
||||
</xpath>
|
||||
</template>
|
||||
</data>
|
||||
</openerp>
|
||||
</openerp>
|
||||
|
||||
Reference in New Issue
Block a user