Browse Source

Merge pull request #473 from hbrunn/9.0-web_tree_dynamic_colored_field

9.0 web tree dynamic colored field
pull/300/head
Pedro M. Baeza 8 years ago
committed by GitHub
parent
commit
27c6002f82
  1. 44
      web_tree_dynamic_colored_field/README.rst
  2. 21
      web_tree_dynamic_colored_field/__init__.py
  3. 39
      web_tree_dynamic_colored_field/__openerp__.py
  4. 22
      web_tree_dynamic_colored_field/demo/res_users.xml
  5. 26
      web_tree_dynamic_colored_field/i18n/fi.po
  6. 26
      web_tree_dynamic_colored_field/i18n/sl.po
  7. 86
      web_tree_dynamic_colored_field/static/js/web_tree_dynamic_colored_field.js
  8. 95
      web_tree_dynamic_colored_field/static/src/js/web_tree_dynamic_colored_field.js
  9. 4
      web_tree_dynamic_colored_field/static/src/xml/web_tree_dynamic_colored_field.xml
  10. 4
      web_tree_dynamic_colored_field/views/web_tree_dynamic_colored_field.xml

44
web_tree_dynamic_colored_field/README.rst

@ -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`` on fields to change text color of a cell in tree view
* Add attribute 'fg_color' 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.

21
web_tree_dynamic_colored_field/__init__.py

@ -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).

39
web_tree_dynamic_colored_field/__openerp__.py

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

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

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

@ -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)"

86
web_tree_dynamic_colored_field/static/js/web_tree_dynamic_colored_field.js

@ -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);
}
});
}
});
}

95
web_tree_dynamic_colored_field/static/src/js/web_tree_dynamic_colored_field.js

@ -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
web_tree_dynamic_colored_field/static/xml/web_tree_dynamic_colored_field.xml → web_tree_dynamic_colored_field/static/src/xml/web_tree_dynamic_colored_field.xml

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

4
web_tree_dynamic_colored_field/views/web_tree_dynamic_colored_field.xml

@ -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>
Loading…
Cancel
Save