Holger Brunn
8 years ago
committed by
Pedro M. Baeza
10 changed files with 223 additions and 0 deletions
-
67web_x2m_filter/README.rst
-
3web_x2m_filter/__init__.py
-
23web_x2m_filter/__openerp__.py
-
14web_x2m_filter/demo/res_groups.xml
-
BINweb_x2m_filter/static/description/icon.png
-
BINweb_x2m_filter/static/description/screenshot.png
-
5web_x2m_filter/static/src/css/web_x2m_filter.css
-
69web_x2m_filter/static/src/js/web_x2m_filter.js
-
31web_x2m_filter/static/src/xml/web_x2m_filter.xml
-
11web_x2m_filter/views/templates.xml
@ -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. |
@ -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). |
@ -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', |
||||
|
], |
||||
|
} |
@ -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> |
After Width: 128 | Height: 128 | Size: 9.2 KiB |
After Width: 857 | Height: 325 | Size: 14 KiB |
@ -0,0 +1,5 @@ |
|||||
|
tr.web_x2m_filter th |
||||
|
{ |
||||
|
text-align: right; |
||||
|
font-weight: normal; |
||||
|
} |
@ -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); |
||||
|
}, |
||||
|
}); |
||||
|
}; |
@ -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 && 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> |
@ -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> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue