forked from Techsystech/web
[ADD] web_x2m_filter (#474)
parent
f6e1503025
commit
b8fb0ef12a
|
@ -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>
|
Binary file not shown.
After Width: | Height: | Size: 9.2 KiB |
Binary file not shown.
After Width: | Height: | 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>
|
Loading…
Reference in New Issue