Browse Source

[ADD] web_x2m_filter (#474)

pull/485/head
Holger Brunn 8 years ago
committed by Pedro M. Baeza
parent
commit
b8fb0ef12a
  1. 67
      web_x2m_filter/README.rst
  2. 3
      web_x2m_filter/__init__.py
  3. 23
      web_x2m_filter/__openerp__.py
  4. 14
      web_x2m_filter/demo/res_groups.xml
  5. BIN
      web_x2m_filter/static/description/icon.png
  6. BIN
      web_x2m_filter/static/description/screenshot.png
  7. 5
      web_x2m_filter/static/src/css/web_x2m_filter.css
  8. 69
      web_x2m_filter/static/src/js/web_x2m_filter.js
  9. 31
      web_x2m_filter/static/src/xml/web_x2m_filter.xml
  10. 11
      web_x2m_filter/views/templates.xml

67
web_x2m_filter/README.rst

@ -0,0 +1,67 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
=========================
Filters for x2many fields
=========================
This module was written to allow developers to add filter buttons to an x2many field.
.. image:: /web_x2m_filter/static/description/screenshot.png
:alt: Screenshot
Usage
=====
To use this module, you need to:
#. add a key ``web_x2m_filter`` to the field's ``options`` dictionary
#. this key should contain a list if dictionaries which describe a button by the properties ``name`` and ``domain``::
{'web_x2m_filter': [{'name': 'Only admins', 'domain': [('groups_id', '=', %(base.group_erp_manager)s)]}]}
#. to have one filter being active on form load, add a key named ``default`` with value ``True``
#. the string in ``name`` is subject to the standard translation mechanism
#. the domain is evaluated with the user's context and the current form values
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
:alt: Try me on Runbot
:target: https://runbot.odoo-community.org/runbot/162/8.0
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.
Credits
=======
Images
------
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_.
Contributors
------------
* Holger Brunn <hbrunn@therp.nl>
Do not contact contributors directly about help with questions or problems concerning this addon, but use the `community mailing list <mailto:community@mail.odoo.com>`_ or the `appropriate specialized mailinglist <https://odoo-community.org/groups>`_ for help, and the bug tracker linked in `Bug Tracker`_ above for technical issues.
Maintainer
----------
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
This module is maintained by the OCA.
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 https://odoo-community.org.

3
web_x2m_filter/__init__.py

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
# © 2016 Therp BV <http://therp.nl>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

23
web_x2m_filter/__openerp__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# © 2016 Therp BV <http://therp.nl>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Filters for x2many fields",
"version": "8.0.1.0.0",
"author": "Therp BV,Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Hidden/Dependency",
"summary": "Allows to define filters in x2many list fields",
"depends": [
'web',
],
"demo": [
"demo/res_groups.xml",
],
"data": [
'views/templates.xml',
],
"qweb": [
'static/src/xml/web_x2m_filter.xml',
],
}

14
web_x2m_filter/demo/res_groups.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="view_groups_form" model="ir.ui.view">
<field name="model">res.groups</field>
<field name="inherit_id" ref="base.view_groups_form" />
<field name="arch" type="xml">
<field name="users" position="attributes">
<attribute name="options">{'web_x2m_filter': [{'name': 'Only admins', 'domain': [('groups_id', '=', %(base.group_erp_manager)s)], 'default': True}]}</attribute>
</field>
</field>
</record>
</data>
</openerp>

BIN
web_x2m_filter/static/description/icon.png

After

Width: 128  |  Height: 128  |  Size: 9.2 KiB

BIN
web_x2m_filter/static/description/screenshot.png

After

Width: 857  |  Height: 325  |  Size: 14 KiB

5
web_x2m_filter/static/src/css/web_x2m_filter.css

@ -0,0 +1,5 @@
tr.web_x2m_filter th
{
text-align: right;
font-weight: normal;
}

69
web_x2m_filter/static/src/js/web_x2m_filter.js

@ -0,0 +1,69 @@
//-*- coding: utf-8 -*-
//© 2016 Therp BV <http://therp.nl>
//License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
openerp.web_x2m_filter = function(instance)
{
instance.web.ListView.include({
init: function()
{
this.events['click button.web_x2m_filter'] = 'web_x2m_filter_click';
return this._super.apply(this, arguments);
},
web_x2m_filter_click: function(e)
{
var $button = jQuery(e.currentTarget);
this.$('button.web_x2m_filter:disabled').prop('disabled', false);
$button.prop('disabled', true);
return (this.getParent().o2m || this.getParent())
.web_x2m_filter_apply_domain($button.attr('data-domain'))
.then(this.proxy('reload_content'));
},
start: function()
{
var self = this;
return this._super.apply(this, arguments).then(function()
{
self.$('button.web_x2m_filter[data-default]').click();
});
},
});
var apply_domain = function(o2m, domain)
{
var compound_domain = new instance.web.CompoundDomain(
JSON.parse(domain),
o2m.field.domain,
[
[
'id', 'in', _.filter(
o2m.field_manager.datarecord[o2m.name],
function(x) { return !window.isNaN(x); }
),
]
]
);
return o2m.dataset._model.query(['id']).filter(
compound_domain
.set_eval_context(o2m.field_manager.build_eval_context())
.eval()
).all()
.then(function(records)
{
o2m.dataset.alter_ids(_.map(records, function(x) {
return x.id;
}));
});
};
instance.web.form.FieldOne2Many.include({
web_x2m_filter_apply_domain: function(domain)
{
return apply_domain(this, domain);
},
});
instance.web.form.FieldMany2Many.include({
web_x2m_filter_apply_domain: function(domain)
{
return apply_domain(this, domain);
},
});
};

31
web_x2m_filter/static/src/xml/web_x2m_filter.xml

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<t t-extend="ListView">
<t t-jquery="thead tr:first-child" t-operation="after">
<tr t-if="getParent().options &amp;&amp; getParent().options.web_x2m_filter" class="web_x2m_filter">
<th t-att-colspan="columns_count">
<t t-foreach="getParent().options.web_x2m_filter || {}" t-as="filter">
<button t-attf-class="oe_button oe_list_add web_x2m_filter #{filter.class || ''}" t-att-data-domain="JSON.stringify(filter.domain || [])" t-att-data-default="filter.default">
<t t-esc="_t(filter.name)" />
</button>
</t>
<button t-att-data-domain="JSON.stringify(getParent().field.domain)" class="oe_button oe_list_add web_x2m_filter" disabled="disabled"><i class="fa fa-refresh" aria-hidden="true"></i></button>
</th>
</tr>
</t>
</t>
<t t-extend="One2Many.listview">
<t t-jquery="thead tr:first-child" t-operation="after">
<tr t-if="getParent().o2m.options.web_x2m_filter" class="web_x2m_filter">
<th t-att-colspan="columns_count">
<t t-foreach="getParent().o2m.options.web_x2m_filter" t-as="filter">
<button t-attf-class="oe_button oe_list_add web_x2m_filter #{filter.class || ''}" t-att-data-domain="JSON.stringify(filter.domain || [])" t-att-data-default="filter.default">
<t t-esc="_t(filter.name)" />
</button>
</t>
<button t-att-data-domain="JSON.stringify(getParent().o2m.field.domain || [])" class="oe_button oe_list_add web_x2m_filter" disabled="disabled"><i class="fa fa-refresh" aria-hidden="true"></i></button>
</th>
</tr>
</t>
</t>
</templates>

11
web_x2m_filter/views/templates.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<template id="assets_backend" name="web_x2m_filter assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/web_x2m_filter/static/src/js/web_x2m_filter.js"></script>
<link rel="stylesheet" href="/web_x2m_filter/static/src/css/web_x2m_filter.css"/>
</xpath>
</template>
</data>
</openerp>
Loading…
Cancel
Save