diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 36ea829a2f9..0cd5db39b35 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -756,3 +756,20 @@ class Action(openerpweb.Controller): if action: value = clean_action(action[0], req.session) return {'result': value} +class TreeView(View): + _cp_path = "/base/treeview" + + @openerpweb.jsonrequest + def load(self, req, model, view_id, toolbar=False): + fields_view = self.fields_view_get(req, model, view_id, 'tree', toolbar=toolbar) + return {'field_parent': fields_view} + + def fields_view_get(self, request, model, view_id, view_type="tree", + transform=True, toolbar=False, submenu=False): + """ Sets @editable on the view's arch if it isn't already set and + ``set_editable`` is present in the request context + """ + view = super(TreeView, self).fields_view_get( + request, model, view_id, view_type, transform, toolbar, submenu) + + return view \ No newline at end of file diff --git a/addons/base/static/src/js/tree.js b/addons/base/static/src/js/tree.js index e333c295473..5670a7e74d1 100644 --- a/addons/base/static/src/js/tree.js +++ b/addons/base/static/src/js/tree.js @@ -1,26 +1,105 @@ -/*--------------------------------------------------------- - * OpenERP base library - *---------------------------------------------------------*/ - openerp.base.tree = function(openerp) { - openerp.base.views.add('tree', 'openerp.base.TreeView'); -openerp.base.TreeView = openerp.base.Controller.extend({ -/** - * Genuine tree view (the one displayed as a tree, not the list) - */ +openerp.base.TreeView = openerp.base.View.extend({ + 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; + + this.columns = []; + + this.options = _.extend({}, this.defaults, options || {}); + this.flags = this.view_manager.action.flags; + }, start: function () { this._super(); - this.$element.append('Tree view'); + 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); }, - do_show: function () { - this.$element.show(); + on_loaded: function (data) { + var self = this; + this.dataset.read_slice([], 0, false, function (response) { + self.$element.html(QWeb.render('TreeView', {'field_data':response})); + id=self.dataset.ids[0]; + self.dataset.domain=[['parent_id','=',parseInt(id,10)]]; + self.dataset.read_slice([], 0, false, function (response) { + $('#parent_id').change(self.getch(($('#parent_id').attr('value')),0)); + self.$element.append(QWeb.render('TreeView_Secondry', {'child_data':response})); + $('#child_id').find('div').click(function(){ + self.getch(this.id,1) + }); + }); + }); }, - do_hide: function () { - this.$element.hide(); + getch: function(id,flag) { + + var self=this; + if(flag==0){ + $('#parent_id').change(function(){ + self.on_change($('#parent_id').attr('value'),0); + }); + } + else if(flag==1){ + self.on_change(id,1); + }else{ + self.on_change(id,2); + } + }, + on_change:function(parentid,flag){ + var self=this; + if(parentid>0){ + this.dataset.domain=[['parent_id','=',parseInt(parentid,10)]]; + this.dataset.read_slice([],0,false, function (response) { + if(flag==0){ + $('#child_id').remove(); + self.$element.append(QWeb.render('TreeView_Secondry', {'child_data':response})); + }else if(flag==1){ + jQuery('#'+parentid).append(QWeb.render('TreeView_Children', {'childdata':response})) + $('#'+parentid).find('#subchild').find('#subchild').remove(); + $('#'+parentid).find('#subchild').slice(1,3).remove(); + }else if(flag==2){ + $("#subchild #"+parentid).find('#subchild').remove(); + $("#subchild #"+parentid).find('#childsubchild').remove(); + $("#subchild #"+parentid).append(QWeb.render('TreeView_SubChildren', {'subchilddata':response})) + } + $('#child_id').find('div').click(function(){ + self.getch(this.id,1) + }); + $('#child_id div #subchild').find('div').click(function(){ + self.getch(this.id,2) + }); + }); + } + }, + reload_view: function (grouped) { + var self = this; + this.dataset.offset = 0; + this.dataset.limit = false; + return this.rpc('/base/treeview/load', { + model: this.model, + view_id: this.view_id, + toolbar: !!this.flags.sidebar + }, function (field_view_get) { + self.on_loaded(field_view_get, grouped); + }); + }, + do_search: function (domains, contexts, groupbys) { + var self = this; + return this.rpc('/base/session/eval_domain_and_context', { + domains: domains, + contexts: contexts, + group_by_seq: groupbys + }, function (results) { + self.dataset.context = results.context; + self.dataset.domain = results.domain; + self.reload_view(!!results.group_by).then( + $.proxy(self, 'reload_content')); + }); } }); - -}; - -// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: +} \ No newline at end of file diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index cd939571e94..1d46df2eda5 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -229,7 +229,63 @@