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"><<</button>
+
+ <span class="oe_pager_index">0</span> / <span class="oe_pager_count">0</span>
+
+ <button type="button" data-pager-action="next">>></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