Files
app-odoo/app_search_range/static/src/js/tree.js
2017-11-16 03:48:38 +08:00

279 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
odoo.define('app_search_range_range.tree', function (require) {
"use strict";
var time = require('web.time');
var core = require('web.core');
var data = require('web.data');
var session = require('web.session');
var utils = require('web.utils');
var Model = require('web.Model');
var ListView = require('web.ListView');
var datepicker = require('web.datepicker');
var ViewManager = require('web.ViewManager')
var _t = core._t;
var _lt = core._lt;
var QWeb = core.qweb;
ListView.include({
init: function(parent, dataset, view_id, options) {
this._super.apply(this, arguments);
this.ts_context = dataset.context.tree_search;
this.fields_range = dataset.context.fields_range;
this.ts_fields = [];
},
on_button_click: function (event) {
var self = this;
var $target = $(event.target),
field, key, first_item;
field = $target.parent().data('field');
key = $target.parent().data('key');
if (field == -1) {
first_item = $target.parent().parent().children('.tgl_first_item.selected');
if (!first_item.length) {
$target.parent().parent().children('li').removeClass('selected')
}
} else {
first_item = $target.parent().parent().children('.tgl_first_item').removeClass('selected');
}
$target.parent().toggleClass('selected');
this.tgl_search()
event.stopPropagation();
},
render_buttons: function($node) {
var self = this;
this._super.apply(this, arguments);
var l10n = _t.database.parameters;
var datepickers_options = {
pickTime: false,
startDate: moment({ y: 1900 }),
endDate: moment().add(200, "y"),
calendarWeeks: true,
icons : {
time: 'fa fa-clock-o',
date: 'fa fa-calendar',
up: 'fa fa-chevron-up',
down: 'fa fa-chevron-down'
},
language : moment.locale(),
format : time.strftime_to_moment_format(l10n.date_format),
}
self.$buttons.find('.app-search').remove();
var date_fields = [];
// 增加参数控制app_show_search_date
new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_show_search_date']], ['value']]).then(function (show) {
if (show.length >= 1 && (show[0]['value'] == "True")) {
_.each(self.columns, function (value, key, list) {
if (value.store && value.type === "datetime" || value.type === "date") {
date_fields.push([value.name, value.string, value.type]);
}
});
if (date_fields.length > 0) {
self.$search_button = $(QWeb.render('odooApp.buttons', {'date_fields': date_fields}))
self.$search_button.find('.app_start_date').datetimepicker(datepickers_options);
self.$search_button.find('.app_end_date').datetimepicker(datepickers_options);
// self.$search_button.find('.app_search_date_rate').click(function() {
// self.tgl_search();
// });
self.$search_button.find('.app_start_date').on('change', function () {
self.tgl_search();
});
self.$search_button.find('.app_end_date').on('change', function () {
self.tgl_search();
});
self.$search_button.find('.app_select_field').on('change', function () {
self.tgl_search();
});
self.$search_button.appendTo(self.$buttons);
}
}
});
var number_fields = [];
// 增加参数控制app_show_search_number
new Model('ir.config_parameter').call('search_read', [[['key', '=', 'app_show_search_number']], ['value']]).then(function (show) {
if (show.length >= 1 && (show[0]['value'] == "True")) {
_.each(self.columns, function (value, key, list) {
if (value.string && value.string.length > 1 && value.store && (value.type === "integer" || value.type === "float" || value.type === "monetary")) {
number_fields.push([value.name, value.string]);
}
});
if (number_fields.length == 0) {
if (self.fields_range) {
number_fields = self.fields_range;
}
}
if (number_fields.length > 0) {
self.$search_range = $(QWeb.render('odooApp.SearchRange', {'number_fields': number_fields}))
// self.$search_range.find('.app_search_date_range').click(function() {
// self.tgl_search();
// });
self.$search_range.find('.app_select_range_field').on('change', function () {
self.tgl_search();
});
self.$search_range.find('.app_start_range').on('change', function () {
self.tgl_search();
});
self.$search_range.find('.app_end_range').on('change', function () {
self.tgl_search();
});
self.$search_range.appendTo(self.$buttons);
}
}
});
// Dropdown list
_.each(this.ts_context, function(item){
var field = _.find(self.columns, function(column){
return column.type == 'many2one' && column.relation && column.name === item.name;
});
if (field) {
self.ts_fields.push(item.name);
new Model(field.relation).query(['id', 'display_name']).filter(new data.CompoundDomain(item.domain, field.domain)).context(new data.CompoundContext()).all().then(function (result) {
// var single_search = $(QWeb.render('odooApp.selection', {
// 'string': item.string,
// 'class_name': 'app_item_' + item.name,
// 'fields': result,
// }));
if (!$('.after_control_panel').length) {
// $(QWeb.render('odooApp.after_control_panel', {})).appendTo($('.o_control_panel'));
// $(QWeb.render('odooApp.after_control_panel', {})).appendTo($('.o_cp_left'));
// $(QWeb.render('odooApp.after_control_panel', {})).appendTo(self.$buttons);
var multi_search = $(QWeb.render("TGL.TreeSearch.Item", {'widget': {
'string': item.string,
'key': item.name,
'class_name': 'app_multi_item_' + item.name,
'fields': result,
}}))
multi_search.find('li').click(self.on_button_click.bind(self));
multi_search.appendTo(self.$buttons);
}
// single_search.appendTo($('.after_control_panel'));
// $('.app_item_' + item.name).on('change', function() {
// self.tgl_search();
// })
});
}
});
},
do_search: function(domain, context, group_by) {
var self = this;
this.last_domain = domain;
this.last_context = context;
this.last_group_by = group_by;
this.old_search = _.bind(this._super, this);
return self.tgl_search();
},
tgl_search: function() {
var self = this;
var domain = [], value, value_tmp;
_.each(self.ts_fields, function(field){
value = $('.app_item_' + field).val();
var select_fields = $('.app_multi_item_' + field).children('.selected'),
select_value = [];
if (select_fields.length > 0) {
_.each(select_fields, function(item){
value_tmp = $(item).data('field');
if (value_tmp > 0) {
select_value.push($(item).data('field'));
}
});
if (select_value.length) {
domain.push([field, 'in', select_value]);
}
}
// if (value) {
// value_tmp = parseInt(value);
// if (value_tmp != 0) {
// domain.push([field,'=',value_tmp]);
// } else {
// domain.push([field,'!=', false]);
// }
// }
});
// todo: 注意date和datetime型的处理是不同的已处理完datetime类型还有date类型
if (self.$search_button) {
var start_date = self.$search_button.find('.app_start_date').val(),
end_date = self.$search_button.find('.app_end_date').val(),
field = self.$search_button.find('.app_select_field').val(),
field_type = 'datetime';
var tz = session.user_context.tz,
start_utc,
end_utc;
_.each(self.columns, function (value, key, list) {
if (value.name == field) {
field_type = value.type;
return false;
}
});
moment.locale(tz);
var l10n = _t.database.parameters;
if (start_date) {
if (field_type = 'date') {
//日期类型无须utc处理
start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD');
domain.push([field, '>=', start_date]);
} else {
//日期时间处理utc
start_date = moment(moment(start_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00');
start_utc = moment(start_date)
domain.push([field, '<=', start_utc]);
}
}
if (end_date) {
if (field_type = 'date') {
end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD');
domain.push([field, '>=', end_date]);
} else {
end_date = moment(moment(end_date, time.strftime_to_moment_format(l10n.date_format))).format('YYYY-MM-DD 00:00:00');
end_utc = moment(end_date)
domain.push([field, '<=', end_utc]);
}
}
}
if (self.$search_range) {
var start_range = self.$search_range.find('.app_start_range').val(),
end_range = self.$search_range.find('.app_end_range').val(),
range_field = self.$search_range.find('.app_select_range_field').val();
if (start_range) {
domain.push([range_field, '>=', parseInt(start_range)]);
}
if (end_range) {
domain.push([range_field, '<=', parseInt(end_range)]);
}
}
// console.log(domain);
var compound_domain = new data.CompoundDomain(self.last_domain, domain);
self.dataset.domain = compound_domain.eval();
return self.old_search(compound_domain, self.last_context, self.last_group_by);
},
});
});