You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
11 KiB
272 lines
11 KiB
//-*- coding: utf-8 -*-
|
|
//############################################################################
|
|
//
|
|
// OpenERP, Open Source Management Solution
|
|
// This module copyright (C) 2014 Therp BV (<http://therp.nl>).
|
|
//
|
|
// 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/>.
|
|
//
|
|
//############################################################################
|
|
|
|
openerp.web_advanced_filters = function(instance)
|
|
{
|
|
var _t = instance.web._t;
|
|
|
|
instance.web.Sidebar.include({
|
|
init: function()
|
|
{
|
|
var result = this._super.apply(this, arguments);
|
|
this.sections.push({
|
|
'name': 'advanced_filters',
|
|
'label': _t('Advanced filters'),
|
|
});
|
|
this.items.advanced_filters = [];
|
|
return result;
|
|
},
|
|
});
|
|
instance.web.ListView.include({
|
|
do_select: function (ids, records)
|
|
{
|
|
var result = this._super(this, arguments);
|
|
this.advanced_filters_show(ids);
|
|
return result;
|
|
},
|
|
load_list: function(data)
|
|
{
|
|
var result = this._super.apply(this, arguments),
|
|
self = this;
|
|
if(!this.sidebar || this.sidebar.items.advanced_filters.length)
|
|
{
|
|
this.advanced_filters_show([]);
|
|
return result;
|
|
}
|
|
this.sidebar.add_items(
|
|
'advanced_filters',
|
|
[
|
|
{
|
|
label: _t('Whole selection (criteria)'),
|
|
classname: 'oe_advanced_filters_header',
|
|
},
|
|
{
|
|
label: _t('To new filter'),
|
|
callback: function ()
|
|
{
|
|
self.advanced_filters_save_criteria.apply(
|
|
self, arguments);
|
|
},
|
|
},
|
|
{
|
|
label: _t('To existing filter'),
|
|
callback: function (item)
|
|
{
|
|
self.advanced_filters_combine_with_existing.apply(
|
|
self, ['union', 'domain', item]);
|
|
},
|
|
},
|
|
{
|
|
label: _t('Remove from existing filter'),
|
|
callback: function (item)
|
|
{
|
|
self.advanced_filters_combine_with_existing.apply(
|
|
self, ['complement', 'domain', item]);
|
|
},
|
|
},
|
|
{
|
|
label: _t('Marked records'),
|
|
classname: 'oe_advanced_filters_header',
|
|
},
|
|
{
|
|
label: _t('To new filter'),
|
|
callback: function ()
|
|
{
|
|
self.advanced_filters_save_selection.apply(
|
|
self, arguments);
|
|
},
|
|
},
|
|
{
|
|
label: _t('To existing filter'),
|
|
callback: function (item)
|
|
{
|
|
self.advanced_filters_combine_with_existing.apply(
|
|
self, ['union', 'ids', item]);
|
|
},
|
|
},
|
|
{
|
|
label: _t('Remove from existing filter'),
|
|
callback: function (item)
|
|
{
|
|
self.advanced_filters_combine_with_existing.apply(
|
|
self, ['complement', 'ids', item]);
|
|
},
|
|
},
|
|
]
|
|
);
|
|
this.do_select([], []);
|
|
return result;
|
|
},
|
|
advanced_filters_show: function(ids)
|
|
{
|
|
var self = this;
|
|
if(this.sidebar)
|
|
{
|
|
this.sidebar.$el.show();
|
|
this.sidebar.$el.children().children().each(function(i, e)
|
|
{
|
|
$e = jQuery(e)
|
|
if($e.find('li.oe_advanced_filters_header').length)
|
|
{
|
|
var search = self.ViewManager.searchview
|
|
.build_search_data();
|
|
$e.find('a[data-index="0"],a[data-index="1"],' +
|
|
'a[data-index="2"],a[data-index="3"]')
|
|
.parent().toggle(
|
|
search.contexts.length > 0 ||
|
|
search.domains.length > 0);
|
|
$e.find('a[data-index="4"],a[data-index="5"],' +
|
|
'a[data-index="6"],a[data-index="7"]')
|
|
.parent().toggle(ids.length > 0);
|
|
$e.toggle(
|
|
search.contexts.length > 0 ||
|
|
search.domains.length > 0 ||
|
|
ids.length > 0);
|
|
}
|
|
else
|
|
{
|
|
$e.toggle(ids.length > 0);
|
|
}
|
|
});
|
|
}
|
|
},
|
|
advanced_filters_save_criteria: function(item)
|
|
{
|
|
var search = this.ViewManager.searchview.build_search_data(),
|
|
self = this;
|
|
instance.web.pyeval.eval_domains_and_contexts({
|
|
domains: search.domains,
|
|
contexts: search.contexts,
|
|
group_by_seq: search.groupbys || []
|
|
}).done(function(search)
|
|
{
|
|
var ctx = search.context;
|
|
_(_.keys(instance.session.user_context)).each(
|
|
function (key) {delete ctx[key]});
|
|
self.do_action({
|
|
name: item.label,
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'ir.filters',
|
|
views: [[false, 'form']],
|
|
target: 'new',
|
|
context: {
|
|
default_model_id: self.dataset._model.name,
|
|
default_domain: JSON.stringify(search.domain),
|
|
default_context: JSON.stringify(ctx),
|
|
default_user_id: JSON.stringify(false),
|
|
form_view_ref: 'web_advanced_filters.form_ir_filters_save_new',
|
|
},
|
|
},
|
|
{
|
|
on_close: function()
|
|
{
|
|
self.ViewManager.setup_search_view(
|
|
self.ViewManager.searchview.view_id,
|
|
self.ViewManager.searchview.defaults);
|
|
},
|
|
});
|
|
});
|
|
},
|
|
advanced_filters_save_selection: function(item)
|
|
{
|
|
var self = this;
|
|
this.do_action({
|
|
name: item.label,
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'ir.filters',
|
|
views: [[false, 'form']],
|
|
target: 'new',
|
|
context: {
|
|
default_model_id: this.dataset._model.name,
|
|
default_domain: JSON.stringify(
|
|
[
|
|
['id', 'in', this.groups.get_selection().ids],
|
|
]
|
|
),
|
|
default_context: JSON.stringify({}),
|
|
default_user_id: JSON.stringify(false),
|
|
form_view_ref: 'web_advanced_filters.form_ir_filters_save_new',
|
|
},
|
|
},
|
|
{
|
|
on_close: function()
|
|
{
|
|
self.ViewManager.setup_search_view(
|
|
self.ViewManager.searchview.view_id,
|
|
self.ViewManager.searchview.defaults);
|
|
},
|
|
});
|
|
},
|
|
advanced_filters_combine_with_existing: function(action, type, item)
|
|
{
|
|
var search = this.ViewManager.searchview.build_search_data(),
|
|
self = this;
|
|
instance.web.pyeval.eval_domains_and_contexts({
|
|
domains: search.domains,
|
|
contexts: search.contexts,
|
|
group_by_seq: search.groupbys || []
|
|
}).done(function(search)
|
|
{
|
|
var domain = [], ctx = {};
|
|
switch(type)
|
|
{
|
|
case 'domain':
|
|
domain = search.domain;
|
|
ctx = search.context;
|
|
_(_.keys(instance.session.user_context)).each(
|
|
function (key) {delete ctx[key]});
|
|
break;
|
|
case 'ids':
|
|
domain = [
|
|
['id', 'in', self.groups.get_selection().ids],
|
|
]
|
|
ctx = {};
|
|
break;
|
|
}
|
|
self.do_action({
|
|
name: item.label,
|
|
type: 'ir.actions.act_window',
|
|
res_model: 'ir.filters.combine.with.existing',
|
|
views: [[false, 'form']],
|
|
target: 'new',
|
|
context: _.extend({
|
|
default_model: self.dataset._model.name,
|
|
default_domain: JSON.stringify(domain),
|
|
default_action: action,
|
|
default_context: JSON.stringify(ctx),
|
|
},
|
|
self.dataset.context.default_filter_id ? {
|
|
default_filter_id:
|
|
self.dataset.context.default_filter_id,
|
|
} : {}),
|
|
},
|
|
{
|
|
on_close: function()
|
|
{
|
|
self.ViewManager.setup_search_view(
|
|
self.ViewManager.searchview.view_id,
|
|
self.ViewManager.searchview.defaults);
|
|
},
|
|
});
|
|
});
|
|
},
|
|
});
|
|
}
|