Vaibhav (OpenERP) has proposed merging lp:~openerp-dev/openerp-web/diagram-vda 
into lp:openerp-web.

Requested reviews:
  OpenERP R&D Web Team (openerp-dev-web)

For more details, see:
https://code.launchpad.net/~openerp-dev/openerp-web/diagram-vda/+merge/73350

Diagram view,
used dracula graph js library
seems to be working same as 6.0

You can check it in
Administration > Customization > Workflows > Workflow


-- 
https://code.launchpad.net/~openerp-dev/openerp-web/diagram-vda/+merge/73350
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openerp-web/diagram-vda.
=== modified file 'addons/base/static/src/js/form.js'
--- addons/base/static/src/js/form.js	2011-08-29 15:26:43 +0000
+++ addons/base/static/src/js/form.js	2011-08-30 09:49:23 +0000
@@ -587,6 +587,7 @@
         this.$element = $('#' + this.element_id);
     },
     stop: function() {
+    	this.$element = $('#' + this.element_id);
         this.$element.remove();
     },
     process_modifiers: function() {

=== modified file 'addons/base_diagram/__openerp__.py'
--- addons/base_diagram/__openerp__.py	2011-04-13 12:07:56 +0000
+++ addons/base_diagram/__openerp__.py	2011-08-30 09:49:23 +0000
@@ -1,6 +1,15 @@
 {
     "name" : "OpenERP Web base Diagram",
     "version" : "2.0",
-    "depends" : [],
-    'active': False,
+    "depends" : ["base"],
+    "js": [
+        'static/lib/js/raphael-min.js',
+        'static/lib/js/dracula_graffle.js',
+        'static/lib/js/dracula_graph.js',
+        'static/src/js/diagram.js'
+    ],
+    'css' : [
+        "static/src/css/base_diagram.css",
+    ],
+    'active': True,
 }

=== modified file 'addons/base_diagram/controllers/main.py'
--- addons/base_diagram/controllers/main.py	2011-04-13 02:01:50 +0000
+++ addons/base_diagram/controllers/main.py	2011-08-30 09:49:23 +0000
@@ -6,12 +6,17 @@
 
     @openerpweb.jsonrequest
     def load(self, req, model, view_id):
-        print req
-        print dir(req)
         fields_view = self.fields_view_get(req, model, view_id, 'diagram')
         return {'fields_view': fields_view}
     
     @openerpweb.jsonrequest
+    def get_activity(self, req, id, name, kind, active_model, model):
+        
+        activity_id = req.session.model(model).search([('name','=',name),('kind','=',kind),('wkf_id','=',active_model)], 0, 0, 0, req.session.context)
+        ids = req.session.model(model).search([], 0, 0, 0, req.session.context)
+        return {'activity_id':activity_id, 'ids': ids}
+    
+    @openerpweb.jsonrequest
     def get_diagram_info(self, req, **kw):
         id = kw['id']
         model = kw['model']
@@ -19,7 +24,6 @@
         connector = kw['connector']
         src_node = kw['src_node']
         des_node = kw['des_node']
-        
         visible_node_fields = kw.get('visible_node_fields',[])
         invisible_node_fields = kw.get('invisible_node_fields',[])
         node_fields_string = kw.get('node_fields_string',[])
@@ -44,15 +48,13 @@
                     shapes[shape_colour] = shape_color_state
                     
         ir_view = req.session.model('ir.ui.view')
-        graphs = ir_view.graph_get(id, model, node, connector, src_node, des_node, False,
+        graphs = ir_view.graph_get(int(id), model, node, connector, src_node, des_node, False,
                           (140, 180), req.session.context)
-        
         nodes = graphs['nodes']
         transitions = graphs['transitions']
         isolate_nodes = {}
-        
-        for node in graphs['blank_nodes']:
-            isolate_nodes[node['id']] = node
+        for blnk_node in graphs['blank_nodes']:
+            isolate_nodes[blnk_node['id']] = blnk_node
         else:
             y = map(lambda t: t['y'],filter(lambda x: x['y'] if x['x']==20 else None, nodes.values()))
             y_max = (y and max(y)) or 120
@@ -87,7 +89,6 @@
         fields = req.session.model('ir.model.fields')
         field_ids = fields.search([('model', '=', model), ('relation', '=', node)], 0, 0, 0, req.session.context)
         field_data = fields.read(field_ids, ['relation_field'], req.session.context)
-        
         node_act = req.session.model(node)
         search_acts = node_act.search([(field_data[0]['relation_field'], '=', id)], 0, 0, 0, req.session.context)
         data_acts = node_act.read(search_acts, invisible_node_fields + visible_node_fields, req.session.context)
@@ -123,5 +124,6 @@
 
         out_transition_field_id = fields.search([('relation', '=', connector), ('relation_field', '=', src_node), ('model', '=', node)], 0, 0, 0, req.session.context)
         out_transition_field = fields.read(out_transition_field_id[0], ['name'], req.session.context)['name']
-
-        return dict(nodes=nodes, conn=connectors, in_transition_field=in_transition_field, out_transition_field=out_transition_field)
+        
+        id_model = req.session.model(model).read([id],['name'], req.session.context)[0]['name']
+        return dict(nodes=nodes, conn=connectors, in_transition_field=in_transition_field, out_transition_field=out_transition_field, id_model = id_model)

=== added directory 'addons/base_diagram/static/src/css'
=== added file 'addons/base_diagram/static/src/css/base_diagram.css'
--- addons/base_diagram/static/src/css/base_diagram.css	1970-01-01 00:00:00 +0000
+++ addons/base_diagram/static/src/css/base_diagram.css	2011-08-30 09:49:23 +0000
@@ -0,0 +1,22 @@
+.openerp .diagram {
+	border: 1px solid #999;
+    -moz-border-radius: 8px;
+    -webkit-border-radius: 8px;
+}
+
+.openerp .show_grid {
+	background: url("/base_diagram/static/src/img/grid.jpg") repeat;
+}
+
+.openerp .oe_diagram_pager {
+	text-align: right;
+    white-space: nowrap;
+}
+
+.openerp .oe_diagram_buttons {
+	float: left;
+}
+
+.openerp .diagram path {
+	cursor: pointer;
+}

=== added directory 'addons/base_diagram/static/src/img'
=== added file 'addons/base_diagram/static/src/img/grid.jpg'
Binary files addons/base_diagram/static/src/img/grid.jpg	1970-01-01 00:00:00 +0000 and addons/base_diagram/static/src/img/grid.jpg	2011-08-30 09:49:23 +0000 differ
=== modified file 'addons/base_diagram/static/src/js/diagram.js'
--- addons/base_diagram/static/src/js/diagram.js	2011-07-28 14:49:12 +0000
+++ addons/base_diagram/static/src/js/diagram.js	2011-08-30 09:49:23 +0000
@@ -2,25 +2,24 @@
  * OpenERP base library
  *---------------------------------------------------------*/
 
-openerp.base.diagram = function (openerp) {
-	
-openerp.base.views.add('diagram', 'openerp.base.DiagramView');
-openerp.base.DiagramView = openerp.base.Widget.extend({
-	init: function(view_manager, session, element_id, dataset, view_id){
-		this._super(session, element_id);
-        this.view_manager = view_manager;
+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 = dataset.model;
+        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;
-		
-		console.log('data set>>',this.dataset)
 	},
 	start: function() {
-		this.rpc("/base_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
+		return this.rpc("/base_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
 	},
 	
 	toTitleCase: function(str) {
@@ -31,16 +30,16 @@
 		
 		var self = this;
 		if(this.ids && this.ids.length) {
-			this.id = this.ids[0];
+			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)
 		 */
@@ -95,80 +94,276 @@
 				}
 			}
 		}
-		this.$element.html(QWeb.render("DiagramView", {"fields_view": this.fields_view}));
-		
-		if(this.id) {
-			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);
-			}
-			)
+		
+		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();
+		
+		// New Node,Edge
+		this.$element.find('#new_node.oe_diagram_button_new').click(function(){self.add_edit_node(null, self.node)})
+		this.$element.find('#new_edge.oe_diagram_button_new').click(function(){self.add_edit_node(null, self.connector)})
+		
+		this.$element.find('#toggle_grid').click(function() {
+			self.$element.find('.diagram').toggleClass('show_grid')
+		});
+		
+        if(this.id) {
+        	self.get_diagram_info();
+        }
+	},
+	
+	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 id_record = record['id'];
+    	if(id_record) {
+    		this.id = id_record;
+        	this.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+10 , (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)));
+			}
+	        
+	        //Shape Node Event
+	        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.add_edit_node($this.attr('id'), self.node);
+	        });
+	        
+	        //Text Node Event
+	        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.add_edit_node($this.attr('id'), self.node);
+	        });
+	        return set;
+        }
+        
+        for(node in res_nodes) {
+            var res_node = res_nodes[node];
+            dia.addNode(res_node['name'],{node: res_node,render: renderer});
+        }
+        
+        // Set Ides for Path(Edges)
+        var edge_ids = [];
+        
+        $.each(res_connectors, function(index, connector) {
+        	edge_ids.push(index)
+        	dia.addEdge(connector['source'], connector['destination'], {directed : true});
+        });
+        
+        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();
+        
+      //Path(Edges)
+        $.each(dia.edges, function(index, edge) {
+        	if(edge.connection)
+        		edge.connection.fg.node.id = edge_ids[index];
+        });
+        
+        jQuery('path',renderer.r.canvas).dblclick(function() {
+        	self.add_edit_node(this.id, self.connector)
+        });
+    },
+    
+    add_edit_node: function(id, model) {
+    	var self = this;
+    	
+    	if(!model)
+    		model = self.node;
+    	if(id)
+    		id = parseInt(id, 10);
+    	var action_manager = new openerp.base.ActionManager(this);
+    	var dialog = new openerp.base.Dialog(this, {
+            width: 800,
+            height: 600,
+            buttons : {
+                Cancel : function() {
+                    $(this).dialog('destroy');
+                },
+                Save : function() {
+                	var form_dataset = action_manager.inner_viewmanager.dataset; 
+                	var form_view = action_manager.inner_viewmanager.views.form.controller;
+                	
+                	form_view.do_save(function() {
+                		self.dataset.index = jQuery.inArray(parseInt(self.id,10), self.dataset.ids)
+                		self.dataset.read_index(_.keys(self.fields_view.fields), self.on_diagram_loaded)
+                	});
+                    $(this).dialog('destroy');
+                }
+            }
+        }).start().open();
+    	action_manager.appendTo(dialog.$element);
+    	action_manager.do_action({
+            res_model : model,
+            res_id: id,
+            views : [[false, 'form']],
+            type : 'ir.actions.act_window',
+            auto_search : false,
+            flags : {
+    			search_view: false,
+                sidebar : false,
+                views_switcher : false,
+                action_buttons : false,
+                pager: false
+            }
+        });
+    	
+    	var form_controller = action_manager.inner_viewmanager.views.form.controller;
+    	
+    	var form_fields; 
+    	
+    	if(model == self.node) {
+    		form_fields = ['wkf_id'];
+		} else {
+			form_fields = ['act_from', 'act_to'];
 		}
-	},
-	
-	draw_diagram: function(result) {
-		console.log('this>>>',this)
-		var g = new Graph();
-//		var raphel = new 
-		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'];
-		
-		var render = function(r, n) {
-			var set;
-			if (n.node.shape == 'ellipse') {
-				set = r.set().push(
-				r.ellipse(n.node.x - 30, n.node.y - 13, 40, 40).attr({
-					"fill": n.node.color,
-					r: "12px",
-					"stroke-width": n.distance == 0 ? "3px" : "1px"
-				})).push(r.text(n.node.x - 30, n.node.y - 10, (n.label || n.id)));
-			} else  {
-				set = r.set().push(
-                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" })).push(
-                r.text(n.point[0], n.point[1] + 10, (n.label || n.id) + "\n(" + (n.distance == undefined ? "Infinity" : n.distance) + ")"));
-				
-			}
-            return set;
-        };
-		
-		for(nd in res_nodes) {
-			var res_node = res_nodes[nd];
-			g.addNode(res_node['name'],
-			{
-				node: res_node,
-				render: render
+    	
+    	$.each(form_fields, function(index, fld) {
+			form_controller.on_record_loaded.add_first(function() {
+				form_controller.fields[fld].modifiers.readonly = true;
+				form_controller.fields[fld].$input.attr('disabled', true);
+	    		form_controller.fields[fld].$drop_down.unbind();
+	    		form_controller.fields[fld].$menu_btn.unbind();
 			});
-		}
-		
-		for(cr in res_connectors) {
-			var res_connector = res_connectors[cr];
-			g.addEdge(res_connector['source'], res_connector['destination']);
-		}
-		
-		var layouter = new Graph.Layout.Spring(g);
-		layouter.layout();
-		
-		var renderer = new Graph.Renderer.Raphael('dia-canvas', g, 800, 800);
-		renderer.draw();
-	},
+		});
+    	
+    	if(!id && (model == self.node)) {
+    		$.each(form_fields, function(index, fld) {
+    			form_controller.on_record_loaded.add_last(function() {
+    				form_controller.fields[fld].set_value([self.id,self.active_model])
+    			});
+    		});
+    	}
+    },
+    
+    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();

=== added directory 'addons/base_diagram/static/src/xml'
=== added file 'addons/base_diagram/static/src/xml/base_diagram.xml'
--- addons/base_diagram/static/src/xml/base_diagram.xml	1970-01-01 00:00:00 +0000
+++ addons/base_diagram/static/src/xml/base_diagram.xml	2011-08-30 09:49:23 +0000
@@ -0,0 +1,22 @@
+<template>
+    <t t-name="DiagramView">
+    	<div class="oe_diagram_header" t-att-id="element_id + '_header'">
+	    	<h2 class="oe_view_title"><t t-esc="fields_view.arch.attrs.string"/></h2>
+			<div class="oe_diagram_buttons">
+				<button type="button" id="new_node" class="oe_diagram_button_new">New Node</button>
+				<button type="button" id="new_edge" class="oe_diagram_button_new">New Edge</button>
+				<label>Show Grid:</label><input type="checkbox" id="toggle_grid" checked="checked"/>
+			</div>
+	        <div class="oe_diagram_pager">
+	            <button type="button" data-pager-action="first">First</button>
+	            <button type="button" data-pager-action="previous">&lt;&lt;</button>
+	    
+	            <span class="oe_pager_index">0</span> / <span class="oe_pager_count">0</span>
+	    
+	            <button type="button" data-pager-action="next">&gt;&gt;</button>
+	            <button type="button" data-pager-action="last">Last</button>
+	        </div>
+		</div>
+    	<div id="dia-canvas" class="diagram show_grid" style="overflow: auto;"></div>
+    </t>
+</template>
\ No newline at end of file

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to