2011-05-23 14:46:40 +00:00
|
|
|
openerp.base.tree = function(openerp) {
|
2011-05-11 15:25:48 +00:00
|
|
|
openerp.base.views.add('tree', 'openerp.base.TreeView');
|
2011-06-13 09:54:43 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Genuine tree view (the one displayed as a tree, not the list)
|
|
|
|
*/
|
2011-06-07 07:10:34 +00:00
|
|
|
openerp.base.TreeView = openerp.base.View.extend({
|
2011-06-29 11:46:52 +00:00
|
|
|
/**
|
|
|
|
* Indicates that this view is not searchable, and thus that no search
|
|
|
|
* view should be displayed (if there is one active).
|
|
|
|
*/
|
|
|
|
searchable : false,
|
|
|
|
|
2011-06-07 07:10:34 +00:00
|
|
|
init: function(view_manager, session, element_id, dataset, view_id, options) {
|
|
|
|
this._super(session, element_id);
|
|
|
|
this.view_manager = view_manager || new openerp.base.NullViewManager();
|
|
|
|
this.dataset = dataset;
|
|
|
|
this.model = dataset.model;
|
|
|
|
this.view_id = view_id;
|
2011-06-29 11:46:52 +00:00
|
|
|
this.session = session;
|
2011-06-07 07:10:34 +00:00
|
|
|
this.columns = [];
|
|
|
|
|
2011-07-05 06:57:36 +00:00
|
|
|
this.options = _.extend({}, this.defaults, options || {});
|
2011-06-30 06:42:07 +00:00
|
|
|
|
2011-06-07 07:10:34 +00:00
|
|
|
this.flags = this.view_manager.action.flags;
|
2011-07-05 06:57:36 +00:00
|
|
|
|
2011-06-30 06:42:07 +00:00
|
|
|
this.view_manager.flags.search_view = this.view_manager.action.flags.search_view = false;
|
|
|
|
this.view_manager.flags.sidebar = this.view_manager.action.flags.sidebar = false;
|
2011-07-05 06:55:33 +00:00
|
|
|
|
|
|
|
this.actionmanager = new openerp.base.ActionManager(this.session, this.element_id);
|
|
|
|
this.actionmanager.start();
|
2011-06-07 07:10:34 +00:00
|
|
|
},
|
2011-06-14 06:39:43 +00:00
|
|
|
|
2011-05-11 15:25:48 +00:00
|
|
|
start: function () {
|
|
|
|
this._super();
|
2011-06-07 07:10:34 +00:00
|
|
|
return this.rpc("/base/treeview/load", {
|
|
|
|
model: this.model,
|
|
|
|
view_id: this.view_id,
|
|
|
|
toolbar: this.view_manager ? !!this.view_manager.sidebar : false
|
|
|
|
}, this.on_loaded);
|
2011-05-11 15:25:48 +00:00
|
|
|
},
|
2011-06-13 05:51:02 +00:00
|
|
|
|
2011-06-07 07:10:34 +00:00
|
|
|
on_loaded: function (data) {
|
|
|
|
var self = this;
|
2011-06-22 10:14:41 +00:00
|
|
|
this.fields_view = data.field_parent;
|
|
|
|
this.fields = data.fields;
|
2011-07-07 12:34:35 +00:00
|
|
|
self.dataset.domain = [['parent_id', '=', '']];
|
2011-06-07 07:10:34 +00:00
|
|
|
this.dataset.read_slice([], 0, false, function (response) {
|
2011-07-13 08:56:21 +00:00
|
|
|
|
2011-06-30 07:11:29 +00:00
|
|
|
self.$element.html(QWeb.render('TreeView', { 'field_data' : response, 'title' : self.fields_view.arch.attrs.string }));
|
2011-07-13 08:56:21 +00:00
|
|
|
self.$element.append(QWeb.render('TreeView_Header'));
|
2011-06-13 05:51:02 +00:00
|
|
|
self.$element.find('#parent_id').bind('change', function(){
|
2011-06-28 13:25:07 +00:00
|
|
|
self.getdata($('#parent_id').val(), false);
|
2011-06-07 07:10:34 +00:00
|
|
|
});
|
2011-06-28 13:25:07 +00:00
|
|
|
self.getdata(self.dataset.ids[0], true);
|
2011-06-07 07:10:34 +00:00
|
|
|
});
|
2011-05-11 15:25:48 +00:00
|
|
|
},
|
2011-06-08 13:37:06 +00:00
|
|
|
|
2011-06-13 05:51:02 +00:00
|
|
|
// get child data of selected value
|
|
|
|
getdata: function (id, flag) {
|
2011-06-13 09:54:43 +00:00
|
|
|
var self = this;
|
2011-06-27 11:38:57 +00:00
|
|
|
|
2011-06-13 09:54:43 +00:00
|
|
|
self.dataset.domain = [['parent_id', '=', parseInt(id, 10)]];
|
2011-06-13 05:51:02 +00:00
|
|
|
self.dataset.read_slice([], 0, false, function (response) {
|
2011-06-16 05:34:04 +00:00
|
|
|
|
2011-06-30 05:28:02 +00:00
|
|
|
var is_padding, row_id, record_id;
|
2011-06-28 13:25:07 +00:00
|
|
|
var curr_node = $('tr #treerow_' + id);
|
|
|
|
|
|
|
|
if (curr_node.length == 1) {
|
|
|
|
curr_node.find('td').children(':first-child').attr('src','/base/static/src/img/collapse.gif');
|
|
|
|
curr_node.after(QWeb.render('TreeView_Secondry', {'child_data' : response}));
|
|
|
|
|
|
|
|
for (var i = 0; i < response.length; i++) {
|
|
|
|
row_id = $('tr #treerow_' + response[i].id);
|
2011-06-16 06:50:35 +00:00
|
|
|
if (row_id && row_id.find('td').children(':first-child').attr('id') == 'parentimg_' + response[i].id) {
|
2011-06-28 13:25:07 +00:00
|
|
|
is_padding = true;
|
2011-06-15 09:10:11 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-06-30 05:28:02 +00:00
|
|
|
var padding = curr_node.find('td').css('paddingLeft');
|
|
|
|
var padd = parseInt(padding.replace('px',''), 10);
|
2011-06-30 06:42:07 +00:00
|
|
|
var fixpadding;
|
|
|
|
|
2011-06-28 13:25:07 +00:00
|
|
|
for (var i = 0; i < response.length; i++) {
|
|
|
|
row_id = $('tr #treerow_' + response[i].id);
|
2011-06-16 06:50:35 +00:00
|
|
|
if (row_id) {
|
2011-06-28 13:25:07 +00:00
|
|
|
if (!is_padding) {
|
|
|
|
fixpadding = padd + 40;
|
2011-07-13 07:13:08 +00:00
|
|
|
row_id.find('td:first').css('paddingLeft', fixpadding);
|
2011-06-14 06:39:43 +00:00
|
|
|
} else {
|
2011-06-28 13:25:07 +00:00
|
|
|
if (padd == 1) {
|
|
|
|
fixpadding = padd + 17;
|
2011-06-15 09:10:11 +00:00
|
|
|
} else {
|
2011-06-28 13:25:07 +00:00
|
|
|
fixpadding = padd + 20;
|
2011-06-15 09:10:11 +00:00
|
|
|
}
|
2011-07-13 07:13:08 +00:00
|
|
|
var curr_node_elem = row_id.find('td:first');
|
2011-06-28 13:25:07 +00:00
|
|
|
curr_node_elem.children(':first-child').addClass("parent_top");
|
|
|
|
if (curr_node_elem.children(':first-child').attr('id') == "parentimg_" + response[i].id) {
|
|
|
|
curr_node_elem.css('paddingLeft', fixpadding );
|
2011-06-16 05:34:04 +00:00
|
|
|
} else {
|
2011-06-28 13:25:07 +00:00
|
|
|
curr_node_elem.css('paddingLeft', (fixpadding + 20));
|
2011-06-15 09:10:11 +00:00
|
|
|
}
|
2011-06-14 06:39:43 +00:00
|
|
|
}
|
2011-06-13 09:22:52 +00:00
|
|
|
}
|
|
|
|
}
|
2011-06-13 09:54:43 +00:00
|
|
|
} else {
|
2011-06-28 13:25:07 +00:00
|
|
|
if (!flag) {
|
2011-06-13 05:51:02 +00:00
|
|
|
self.$element.find('tr').remove();
|
2011-07-13 08:56:21 +00:00
|
|
|
self.$element.append(QWeb.render('TreeView_Header'));
|
2011-06-07 07:10:34 +00:00
|
|
|
}
|
2011-07-13 08:56:21 +00:00
|
|
|
|
2011-06-16 05:34:04 +00:00
|
|
|
self.$element.append(QWeb.render('TreeView_Secondry', {'child_data' : response}));
|
|
|
|
self.$element.find('tr[id ^= treerow_]').each( function() {
|
2011-06-28 13:25:07 +00:00
|
|
|
$(this).find('td').children(':first-child').addClass("parent_top");
|
|
|
|
if (!($(this).find('td').children(':first-child').attr('id'))) {
|
|
|
|
$(this).find('td').css('paddingLeft', '20px');
|
2011-06-16 05:34:04 +00:00
|
|
|
}
|
|
|
|
});
|
2011-06-13 05:51:02 +00:00
|
|
|
}
|
2011-06-07 13:14:19 +00:00
|
|
|
|
2011-07-13 07:13:08 +00:00
|
|
|
self.$element.find('tr').find('td:first').mouseover( function() {
|
2011-06-28 13:25:07 +00:00
|
|
|
$(this).css('color', '#0000FF');
|
|
|
|
}).mouseout( function() {
|
|
|
|
$(this).css('color','#000000');
|
2011-06-14 06:39:43 +00:00
|
|
|
});
|
|
|
|
|
2011-07-05 06:55:33 +00:00
|
|
|
self.$element.find('tr[id ^= treerow_] td').children(':first-child').click( function() {
|
2011-06-30 05:28:02 +00:00
|
|
|
var is_loaded = 0;
|
2011-06-28 13:25:07 +00:00
|
|
|
if ($(this).length == 1) {
|
2011-06-30 05:28:02 +00:00
|
|
|
record_id = (this.id).split('_')[1];
|
2011-06-28 13:25:07 +00:00
|
|
|
for (var i = 0; i < response.length; i++) {
|
2011-06-30 05:28:02 +00:00
|
|
|
if (record_id == response[i].id && response[i].child_id.length > 0) {
|
2011-06-28 13:25:07 +00:00
|
|
|
$(response[i].child_id).each (function(e, childid) {
|
|
|
|
if ($('tr #treerow_' + childid).length > 0) {
|
|
|
|
if ($('tr #treerow_' + childid).is(':hidden')) {
|
|
|
|
is_loaded = -1;
|
2011-06-16 05:34:04 +00:00
|
|
|
} else {
|
2011-06-28 13:25:07 +00:00
|
|
|
is_loaded++;
|
2011-06-13 05:51:02 +00:00
|
|
|
}
|
|
|
|
}
|
2011-06-16 05:34:04 +00:00
|
|
|
});
|
2011-06-28 13:25:07 +00:00
|
|
|
if (is_loaded == 0) {
|
|
|
|
if ($(this).attr('src') == '/base/static/src/img/expand.gif') {
|
2011-06-30 05:28:02 +00:00
|
|
|
self.getdata(record_id, true);
|
2011-06-16 05:34:04 +00:00
|
|
|
}
|
2011-06-28 13:25:07 +00:00
|
|
|
} else if (is_loaded > 0) {
|
2011-06-30 05:28:02 +00:00
|
|
|
self.showcontent(record_id, true, response[i].child_id);
|
2011-06-28 13:25:07 +00:00
|
|
|
} else {
|
2011-06-30 05:28:02 +00:00
|
|
|
self.showcontent(record_id, false, response[i].child_id);
|
2011-06-13 05:51:02 +00:00
|
|
|
}
|
2011-06-28 13:25:07 +00:00
|
|
|
}
|
2011-06-13 05:51:02 +00:00
|
|
|
}
|
2011-06-08 13:37:06 +00:00
|
|
|
}
|
2011-06-13 05:51:02 +00:00
|
|
|
});
|
2011-06-22 10:14:41 +00:00
|
|
|
|
2011-06-29 11:46:52 +00:00
|
|
|
self.$element.find('tr[id ^= treerow_]').find('td').children(':last-child').click( function(e) {
|
2011-06-27 11:38:57 +00:00
|
|
|
row_id = $(this).parent().parent().attr('id');
|
2011-06-30 05:28:02 +00:00
|
|
|
record_id = row_id.split('_')[1];
|
|
|
|
self.showrecord(record_id, self.model);
|
2011-06-29 11:46:52 +00:00
|
|
|
e.stopImmediatePropagation();
|
2011-06-16 05:34:04 +00:00
|
|
|
});
|
2011-06-13 05:51:02 +00:00
|
|
|
});
|
|
|
|
},
|
2011-06-08 13:37:06 +00:00
|
|
|
|
2011-06-27 11:38:57 +00:00
|
|
|
// Get details in listview
|
2011-06-29 11:46:52 +00:00
|
|
|
showrecord: function(id, model){
|
2011-06-22 10:14:41 +00:00
|
|
|
var self = this;
|
|
|
|
self.dataset.model = 'product.product';
|
2011-06-27 12:20:39 +00:00
|
|
|
self.dataset.domain = [['categ_id', 'child_of', parseInt(id, 10)]];
|
2011-06-28 13:25:07 +00:00
|
|
|
var modes = !!modes ? modes.split(",") : ["tree", "form"];
|
2011-06-22 10:14:41 +00:00
|
|
|
var views = [];
|
|
|
|
_.each(modes, function(mode) {
|
|
|
|
var view = [false, mode == "tree" ? "list" : mode];
|
|
|
|
if (self.fields.views && self.fields.views[mode]) {
|
|
|
|
view.push(self.fields.views[mode]);
|
|
|
|
}
|
|
|
|
views.push(view);
|
|
|
|
});
|
2011-07-05 06:55:33 +00:00
|
|
|
this.actionmanager.do_action({
|
2011-06-29 11:46:52 +00:00
|
|
|
"res_model" : self.dataset.model,
|
|
|
|
"domain" : self.dataset.domain,
|
2011-06-27 12:42:43 +00:00
|
|
|
"views" : views,
|
|
|
|
"type" : "ir.actions.act_window",
|
|
|
|
"auto_search" : true,
|
2011-07-05 06:55:33 +00:00
|
|
|
"view_mode" : "list",
|
|
|
|
"flags": {
|
|
|
|
search_view: true,
|
|
|
|
sidebar : true,
|
|
|
|
views_switcher : true,
|
|
|
|
action_buttons : true,
|
|
|
|
pager: true,
|
|
|
|
new_window : true
|
|
|
|
}
|
|
|
|
});
|
2011-06-22 10:14:41 +00:00
|
|
|
|
2011-06-29 11:46:52 +00:00
|
|
|
self.dataset.model = model;
|
2011-06-22 10:14:41 +00:00
|
|
|
},
|
|
|
|
|
2011-06-13 05:51:02 +00:00
|
|
|
// show & hide the contents
|
|
|
|
showcontent: function (id, flag, childid) {
|
2011-06-15 09:10:11 +00:00
|
|
|
var self = this;
|
2011-06-28 13:25:07 +00:00
|
|
|
|
2011-06-27 12:20:39 +00:00
|
|
|
var first_child = $('tr #treerow_' + id).find('td').children(':first-child');
|
2011-06-28 13:25:07 +00:00
|
|
|
if (flag) {
|
2011-06-27 12:20:39 +00:00
|
|
|
first_child.attr('src', '/base/static/src/img/expand.gif');
|
2011-06-14 06:39:43 +00:00
|
|
|
}
|
|
|
|
else {
|
2011-06-27 12:20:39 +00:00
|
|
|
first_child.attr('src', '/base/static/src/img/collapse.gif');
|
2011-06-13 05:51:02 +00:00
|
|
|
}
|
2011-06-08 13:37:06 +00:00
|
|
|
|
2011-06-28 13:25:07 +00:00
|
|
|
for (var i = 0; i < childid.length; i++) {
|
|
|
|
if (flag) {
|
2011-06-13 09:54:43 +00:00
|
|
|
self.dataset.domain = [['parent_id', '=', parseInt(childid[i], 10)]];
|
2011-06-28 13:25:07 +00:00
|
|
|
var childimg = $('tr #treerow_' + childid[i]).find('td').children(':first-child').attr('src');
|
2011-06-14 09:40:35 +00:00
|
|
|
|
2011-06-13 09:54:43 +00:00
|
|
|
if (childimg == "/base/static/src/img/collapse.gif") {
|
2011-06-16 05:34:04 +00:00
|
|
|
$('tr #treerow_' + childid[i]).find('td').children(':first-child').attr('src','/base/static/src/img/expand.gif');
|
2011-06-13 09:22:52 +00:00
|
|
|
}
|
2011-06-15 09:10:11 +00:00
|
|
|
|
2011-06-13 05:51:02 +00:00
|
|
|
self.dataset.read_slice([], 0, false, function (response) {
|
2011-06-28 13:25:07 +00:00
|
|
|
for (var j = 0; j < response.length; j++) {
|
|
|
|
var res_ids = $('tr #treerow_' + response[j].id);
|
2011-06-27 12:20:39 +00:00
|
|
|
if (res_ids.length > 0) {
|
|
|
|
res_ids.hide();
|
2011-06-28 13:25:07 +00:00
|
|
|
var subchildids = response[j].child_id;
|
2011-06-15 09:10:11 +00:00
|
|
|
if (subchildids.length > 0) {
|
2011-06-28 13:25:07 +00:00
|
|
|
self.showcontent(response[j].id, true, subchildids);
|
2011-06-15 09:10:11 +00:00
|
|
|
}
|
2011-06-13 05:51:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2011-06-28 13:25:07 +00:00
|
|
|
$ ('tr #treerow_' + childid[i]).hide();
|
2011-06-13 05:51:02 +00:00
|
|
|
}
|
2011-06-13 09:54:43 +00:00
|
|
|
else {
|
2011-06-28 13:25:07 +00:00
|
|
|
$ ('tr #treerow_' + childid[i]).show();
|
2011-06-13 05:51:02 +00:00
|
|
|
}
|
2011-06-07 07:10:34 +00:00
|
|
|
}
|
|
|
|
},
|
2011-06-13 05:51:02 +00:00
|
|
|
|
2011-06-29 11:46:52 +00:00
|
|
|
do_show: function () {
|
|
|
|
this.$element.show();
|
|
|
|
this.view_manager.sidebar.do_refresh(true);
|
|
|
|
},
|
2011-06-30 06:42:07 +00:00
|
|
|
|
2011-06-29 11:46:52 +00:00
|
|
|
do_hide: function () {
|
|
|
|
this.$element.hide();
|
|
|
|
this.hidden = true;
|
2011-07-05 06:55:33 +00:00
|
|
|
}
|
2011-05-11 15:25:48 +00:00
|
|
|
});
|
2011-07-05 06:55:33 +00:00
|
|
|
};
|