/*--------------------------------------------------------- * OpenERP base library *---------------------------------------------------------*/ openerp.base_diagram = function (openerp) { QWeb.add_template('/base_diagram/static/src/xml/base_diagram.xml'); openerp.base.views.add('diagram', 'openerp.base_diagram.DiagramView'); openerp.base_diagram.DiagramView = openerp.base.View.extend({ init: function(parent, element_id, dataset, view_id, options) { this._super(parent, element_id); this.set_default_options(options); this.view_manager = parent; this.dataset = dataset; this.model = this.dataset.model; this.view_id = view_id; this.name = ""; this.domain = this.dataset._domain ? this.dataset._domain: []; this.context = {}; this.ids = this.dataset.ids; }, start: function() { return this.rpc("/base_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); }, toTitleCase: function(str) { return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); }, on_loaded: function(result) { var self = this; if(this.ids && this.ids.length) { this.id = this.ids[self.dataset.index || 0]; } this.fields_view = result.fields_view; this.view_id = this.fields_view.view_id; this.name = this.fields_view.name; this.fields = this.fields_view.fields; var children = this.fields_view.arch.children; /* * For Nodes (Fields) */ this.node = ''; this.bgcolor = ''; this.shape = ''; this.visible_fields_nodes = []; this.invisible_fields_nodes = []; this.fields_nodes_string = []; /* * For Arraows(Connector) */ this.connector = ''; this.src_node = ''; this.des_node = ''; this.connector_fields = []; this.fields_connector_string = []; for(ch in children) { if(children[ch]['tag'] == 'node') { this.node = children[ch]['attrs']['object']; this.bgcolor = children[ch]['attrs']['bgcolor'] || ''; this.shape = children[ch]['attrs']['shape'] || ''; for(node_chld in children[ch]['children']) { if (children[ch]['children'][node_chld]['tag'] = 'field') { var ch_name = children[ch]['children'][node_chld]['attrs']['name']; if (children[ch]['children'][node_chld]['attrs']['invisible']) { if (children[ch]['children'][node_chld]['attrs']['invisible'] == 1 && children[ch]['children'][node_chld]['attrs']['invisible'] == '1') { this.invisible_fields_nodes.push(ch_name) } } else { this.visible_fields_nodes.push(ch_name); var ch_node_string = this.fields[ch_name]['string'] || this.toTitleCase(ch_name); this.fields_nodes_string.push(ch_node_string) } } } } else if(children[ch]['tag'] == 'arrow') { this.connector = children[ch]['attrs']['object']; this.src_node = children[ch]['attrs']['source']; this.des_node = children[ch]['attrs']['destination']; for (arrow_chld in children[ch]['children']) { if (children[ch]['children'][arrow_chld]['tag'] = 'field') { var arr_ch_name = children[ch]['children'][arrow_chld]['attrs']['name']; var ch_node_string = this.fields[arr_ch_name]['string'] || this.toTitleCase(arr_ch_name); this.fields_connector_string.push(ch_node_string); this.connector_fields.push(arr_ch_name); } } } } this.$element.html(QWeb.render("DiagramView", this)); this.$element.find('div.oe_diagram_pager button[data-pager-action]').click(function() { var action = $(this).data('pager-action'); self.on_pager_action(action); }); this.do_update_pager(); this.$element.find('.oe_diagram_button_new').click(function(){self.add_node()}) if(this.id) { self.get_diagram_info(); } }, add_node: function() { var self = this; console.log('self>>', self) }, get_diagram_info: function() { var self = this; this.rpc( '/base_diagram/diagram/get_diagram_info', { 'id': this.id, 'model': this.model, 'bgcolor': this.bgcolor, 'shape': this.shape, 'node': this.node, 'connector': this.connector, 'src_node': this.src_node, 'des_node': this.des_node, 'visible_node_fields': this.visible_fields_nodes, 'invisible_node_fields': this.invisible_fields_nodes, 'node_fields_string': this.fields_nodes_string, 'connector_fields': this.connector_fields, 'connector_fields_string': this.fields_connector_string }, function(result) { self.draw_diagram(result); } ); }, on_diagram_loaded: function(record) { var self = this; var id_record = record['id'] if(id_record) { self.get_diagram_info(); } }, draw_diagram: function(result) { var dia = new Graph(); this.active_model = result['id_model']; this.in_transition_field = result['in_transition_field']; this.out_transition_field = result['out_transition_field']; var res_nodes = result['nodes']; var res_connectors = result['conn']; //Custom logic var self = this; var renderer= function(r, n) { var node; var set; // ellipse if (n.node.shape == 'ellipse') { var node = r.ellipse(n.node.x - 30, n.node.y - 13, 40, 20).attr({ "fill": n.node.color, r: "12px", "stroke-width": n.distance == 0 ? "3px" : "1px" }); set = r.set().push(node).push(r.text(n.node.x - 30, n.node.y - 10, (n.label || n.id))); } // rectangle else if(n.node.shape == 'rectangle') { var node = r.rect(n.node.x-30, n.node.y-13, 60, 44).attr({ "fill": n.node.color, r : "12px", "stroke-width" : n.distance == 0 ? "3px" : "1px" }); set = r.set().push(node).push(r.text(n.node.x , n.node.y+5 , (n.label || n.id))); } // circle else { var node = r.circle(n.node.x, n.node.y, 150).attr({ "fill": n.node.color, r : "30px", "stroke-width" : n.distance == 0 ? "3px" : "1px" }); set = r.set().push(node).push(r.text(n.node.x , n.node.y , (n.label || n.id))); } jQuery(node.node).attr({ 'id': n.node.id, 'name': n.id, 'kind': n.node.options['Kind'] || n.node.options['kind'] }).dblclick(function() { var $this = jQuery(this); self.search_activity($this.attr('id'), $this.attr('name'), $this.attr('kind')) }); jQuery(node.next.node).attr({ 'id': n.node.id, 'name': n.id, 'kind': n.node.options['Kind'] || n.node.options['kind'] }).dblclick(function() { var $this = jQuery(this); self.search_activity($this.attr('id'), $this.attr('name'), $this.attr('kind')) }); return set; } for(node in res_nodes) { var res_node = res_nodes[node]; dia.addNode(res_node['name'],{node: res_node,render: renderer}); } for(cr in res_connectors) { var res_connector = res_connectors[cr]; dia.addEdge(res_connector['source'], res_connector['destination']); } var layouter = new Graph.Layout.Spring(dia); layouter.layout(); if ($('div#dia-canvas').children().length > 0) { $('div#dia-canvas').children().remove(); } var renderer = new Graph.Renderer.Raphael('dia-canvas', dia, $('div#dia-canvas').width(), $('div#dia-canvas').height()); renderer.draw(); }, search_activity: function(id, name, kind) { var self = this; this.rpc( '/base_diagram/diagram/get_activity', { 'id': id, 'name': name, 'kind': kind, 'active_model': this.active_model, 'model': this.node }, function(result) { self.popup_activity(result) } ) }, popup_activity: function(result) { var self = this; var action_manager = new openerp.base.ActionManager(this); var dialog = new openerp.base.Dialog(this, { title : 'Activity', width: 800, height: 600, buttons : { Cancel : function() { $(this).dialog('destroy'); }, Save : function() { $(this).dialog('destroy'); } } }).start().open(); action_manager.appendTo(dialog.$element); action_manager.do_action({ res_model : this.node, res_id: result.activity_id[0], views : [[false, 'form']], type : 'ir.actions.act_window', auto_search : false, flags : { search_view: false, sidebar : false, views_switcher : false, action_buttons : false } }); }, do_search: function(domains, contexts, groupbys) { var self = this; this.rpc('/base/session/eval_domain_and_context', { domains: domains, contexts: contexts, group_by_seq: groupbys }, function (results) { // TODO: handle non-empty results.group_by with read_group self.dataset.context = self.context = results.context; self.dataset.domain = self.domain = results.domain; self.dataset.read_slice(self.fields, 0, self.limit,function(events){ self.schedule_events(events) }); }); }, on_pager_action: function(action) { switch (action) { case 'first': this.dataset.index = 0; break; case 'previous': this.dataset.previous(); break; case 'next': this.dataset.next(); break; case 'last': this.dataset.index = this.dataset.ids.length - 1; break; } this.dataset.read_index(_.keys(this.fields_view.fields), this.on_diagram_loaded); this.do_update_pager(); }, do_update_pager: function(hide_index) { var $pager = this.$element.find('div.oe_diagram_pager'); var index = hide_index ? '-' : this.dataset.index + 1; if(!this.dataset.count) this.dataset.count = this.dataset.ids.length $pager.find('span.oe_pager_index').html(index); $pager.find('span.oe_pager_count').html(this.dataset.count); }, do_show: function () { this.$element.show(); }, do_hide: function () { this.$element.hide(); } }); }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: