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