[IMP] mark a bunch of dialog stuff as exportable (mostly buttons, but also dialog...
[odoo/odoo.git] / addons / web_process / static / src / js / process.js
1 openerp.web_process = function (openerp) {
2     var QWeb = openerp.web.qweb,
3           _t = openerp.web._t;
4     openerp.web.ViewManager.include({
5         start: function() {
6             this._super();
7             var self = this;
8             this.process_check();
9             this.process_help = this.action ? this.action.help : 'Help: Not Defined';
10             this.model = this.dataset.model;
11             if(this.action) this.process_model = this.action.res_model;
12             else this.process_model = this.model;
13         },
14         process_check: function() {
15             var self = this,
16             grandparent = this.widget_parent && this.widget_parent.widget_parent,
17             view = this.views[this.views_src[0].view_type],
18             $process_view = this.$element.find('.oe-process-view');
19             if (!(grandparent instanceof openerp.web.WebClient) ||
20                 !(view.view_type === this.views_src[0].view_type
21                     && view.view_id === this.views_src[0].view_id)) {
22                         $process_view.hide();
23                         return;
24             }
25             $process_view.click(function() {
26                 self.initialize_process_view();
27             });
28         },
29         initialize_process_view: function() {
30             var self = this;
31             $.when(this.fields_get(), this.help(), this.get_process_object()).pipe(function(fields, help, process) {
32                 self.process_fields = fields;
33                 self.process_help = help;
34                 if(process && process.length) {
35                     if(process.length > 1) {
36                         self.process_selection = process;
37                     } else {
38                         self.process_id = process[0][0],
39                         self.process_title = process[0][1];
40                     }
41                 }
42                 return $.Deferred().resolve();
43             }).pipe(function() {
44                 var def = $.Deferred();
45                 if(self.process_id) {
46                     self.graph_get().done(function(res) {
47                         self.process_notes = res.notes;
48                         self.process_title = res.name;
49                         self.process_subflows = _.filter(res.nodes, function(x) {
50                             return x.subflow != false;
51                         });
52                         self.process_related = res.related;
53                         def.resolve(res);
54                     });
55                 } else def.resolve();
56                 return def.promise();
57             }).done(function(res) {
58                 $.when(self.render_process_view()).done(function() {
59                     if(res) self.draw_process_graph(res);
60                 });
61             });
62         },
63         graph_get: function() {
64             var self = this;
65             var def = $.Deferred();
66             this.process_id = parseInt(this.process_id, 10);
67
68             this.process_dataset
69             .call("graph_get",[this.process_id, this.model || this.dataset.model, false, [80,80,150,100]])
70             .done(function(res) {
71                 self.process_dataset
72                     .call("search_by_model",[self.model || self.dataset.model,self.session.context])
73                     .done(
74                     function(r) {
75                         res['related'] = r;
76                         def.resolve(res);
77                     });
78             });
79             return def.promise();
80         },
81         fields_get : function() {
82             var self = this,
83                 def = $.Deferred(),
84                 dataset = new openerp.web.DataSetStatic(this, this.model || this.dataset.model, this.session.context);
85             dataset
86                 .call('fields_get',[])
87                 .done(function(fields) {
88                     def.resolve(fields);
89                 }).fail(def.reject);
90             return def.promise();
91         },
92         help : function() {
93             var self = this,
94                 def = $.Deferred();
95             if(!this.subflow_model) {
96                 def.resolve(this.action ? (this.action.help!=false ? this.action.help : 'Help: Not Defined') : 'Help: Not Defined');
97             } else {
98                  var dataset = new openerp.web.DataSetSearch(this, "ir.actions.act_window", this.session.context, []);
99                  dataset
100                     .read_slice(['help'],
101                     {
102                         domain: [
103                             ['res_model', '=', this.subflow_model],
104                             ['name', 'ilike', this.subflow_name]
105                         ]
106                     }
107                     ).done(function(res) {
108                         def.resolve(res.help || 'Help: Not Defined');
109                     });
110             }
111             return def.promise();
112         },
113         get_process_object : function() {
114             var self = this,
115                 def = $.Deferred();
116             if(this.process_id)
117                 return def.resolve().promise();
118
119             this.process_dataset = new openerp.web.DataSetStatic(this, "process.process", this.session.context);
120             this.process_dataset
121             .call("search_by_model", [self.process_model,self.session.context])
122             .done(function(res) {
123                 if (!res.length) {
124                     self.process_model = false;
125                     self.get_process_object().done(def.resolve);
126                 }
127                 else {
128                     def.resolve(res);
129                 }
130             })
131             .fail(def.reject);
132             return def.promise();
133         },
134         render_process_view : function() {
135             this.$element.html(QWeb.render("ProcessView", this));
136             var self = this;
137             this.$element.find('#edit_process').click(function() {
138                 self.edit_process_view();
139             });
140             var $parent = this.widget_parent.$element;
141             $parent.find('#change_process').click(function() {
142                 self.process_selection = false,
143                 self.process_id = $parent.find('#select_process').val(),
144                 self.process_title = $.trim($parent.find('#select_process option:selected').text());
145                 self.initialize_process_view();
146             });
147
148             this.$element.find(".toggle_fields").click(function() {
149                 $(this).children().toggle();
150                 self.$element.find('.process_fields').toggle();
151             });
152
153             this.$element.find(".process_subflow").click(function() {
154                 self.process_id = this.id;
155                 self.initialize_process_view();
156             });
157         },
158         draw_process_graph : function(res) {
159             var self = this,
160                 process_graph = new Graph();
161             var process_renderer = function(r, n) {
162                 var process_node,
163                     process_node_text,
164                     process_node_desc,
165                     process_set;
166
167                 var node_button,
168                     node_menu,
169                     img_src;
170
171                 var bg = "node",
172                     clip_rect = "".concat(n.node.x,",",n.node.y,",150,100");
173
174                 //Image part
175                 bg = n.node.kind == "subflow" ? "node-subflow" : "node";
176                 bg = n.node.gray ? bg + "-gray" : bg;
177                 img_src = '/web_process/static/src/img/'+ bg + '.png';
178
179                 r['image'](img_src, n.node.x, n.node.y,150, 100)
180                     .attr({"clip-rect": clip_rect})
181                     .mousedown(function() {
182                         return false;
183                 });
184                 //Node
185                 process_node = r['rect'](n.node.x, n.node.y, 150, 100).attr({stroke: "none"});
186                 // Node text
187                 process_node_text =  r.text(n.node.x, n.node.y, (n.node.name))
188                     .attr({"fill": "#fff", "font-weight": "bold", "cursor": "pointer"});
189                 process_node_text.translate((process_node.getBBox().width/ 2) + 5, 10)
190                 if(n.node.subflow) {
191                     process_node_text.click(function() {
192                         self.process_id = n.node.subflow[0];
193                         self.subflow_model = n.node.model;
194                         self.subflow_name = n.node.name;
195                         self.initialize_process_view();
196                     });
197                 }
198                 //Node Description
199                 new_notes = n.node.notes;
200                 if(n.node.notes.length > 25) {
201                     var new_notes= temp_str = '';
202                     var from = to = 0;
203                     while (1) {
204                         from = 25;
205                         temp_str = n.node.notes.substr(to ,25);
206                         if (temp_str.lastIndexOf(" ") < 25 && temp_str.length >= 25) {
207                             from  =  temp_str.lastIndexOf(" ");
208                         }
209                         new_notes += "\n" + n.node.notes.substr(to , from);
210                         if(new_notes.length > n.node.notes.length) break;
211                         to += from;
212                     }
213                 }
214                 process_node_desc = r.text(n.node.x+85, n.node.y+50, (new_notes));
215                 r['image']('/web/static/src/img/icons/gtk-info.png', n.node.x+20, n.node.y+70, 16, 16)
216                     .attr({"cursor": "pointer", "title": "Help"})
217                     .click(function() {
218                         window.open(n.node.url || "http://doc.openerp.com/v6.0/index.php?model=" + n.node.model);
219                     });
220
221                 if(n.node.menu) {
222                     r['image']('/web/static/src/img/icons/gtk-jump-to.png', n.node.x+115, n.node.y+70, 16, 16)
223                     .attr({"cursor": "pointer", "title": n.node.menu.name})
224                     .click(function() {
225                         self.jump_to_view(n.node.res_model, n.node.menu.id);
226                     });
227                 }
228
229                 process_set = r.set().push(process_node);
230                 process_set.mousedown(function() {
231                     return false;
232                 });
233                 return process_set;
234             };
235
236             _.each(res['nodes'],function(node, node_id) {
237                 node['res_model'] = self.model,
238                 node['res_id'] = false,
239                 node['id'] = node_id;
240                 process_graph.addNode(node['name'], {node: node,render: process_renderer});
241             });
242
243             _.each(res['transitions'], function(transitions) {
244                 var src = res['nodes'][transitions['source']];
245                 var dst = res['nodes'][transitions['target']];
246                 // make active
247                 transitions['active'] = src.active && !dst.gray;
248                 process_graph.addEdge(src['name'], dst['name'], {directed : true});
249             });
250             var width = $(document).width();
251             var height = $(document).height();
252             var layouter = new Graph.Layout.Ordered(process_graph);
253             var render_process_graph = new Graph.Renderer.Raphael('process_canvas', process_graph, width, height);
254         },
255         jump_to_view: function(model, id) {
256             var self = this;
257             var dataset = new openerp.web.DataSetStatic(this, 'ir.values', this.session.context);
258             dataset.call('get',
259                 ['action', 'tree_but_open',[['ir.ui.menu', id]], dataset.context],
260                 function(res) {
261                     self.$element.empty();
262                     var action = res[0][res[0].length - 1];
263                     self.rpc("/web/action/load", {
264                         action_id: action.id,
265                         context: dataset.context
266                         }, function(result) {
267                             var action_manager = new openerp.web.ActionManager(self);
268                             action_manager.appendTo(self.widget_parent.$element);
269                             action_manager.do_action(result.result);
270                         });
271                 });
272         },
273         edit_process_view: function() {
274             var self = this;
275             var action_manager = new openerp.web.ActionManager(this);
276             var dialog = new openerp.web.Dialog(this, {
277                 width: 800,
278                 height: 600,
279                 buttons : [
280                     {text: _t("Cancel"), click: function() { $(this).dialog('destroy'); }},
281                     {text: _t("Save"), click: function() {
282                         var form_view = action_manager.inner_viewmanager.views.form.controller;
283
284                         form_view.do_save(function() {
285                             self.initialize_process_view();
286                         });
287                         $(this).dialog('destroy');
288                     }}
289                 ]
290             }).start().open();
291
292             action_manager.appendTo(dialog.$element);
293             action_manager.do_action({
294                 res_model : 'process.process',
295                 res_id: self.process_id,
296                 views : [[false, 'form']],
297                 type : 'ir.actions.act_window',
298                 flags : {
299                     search_view: false,
300                     sidebar : false,
301                     views_switcher : false,
302                     action_buttons : false,
303                     pager: false
304                 }
305             });
306         }
307     });
308 };
309 // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: