1 /*---------------------------------------------------------
3 *---------------------------------------------------------*/
5 openerp.base$views = function(openerp) {
7 openerp.base.Action = openerp.base.Controller.extend({
8 init: function(session, element_id) {
9 this._super(session, element_id);
12 this.searchview_id = false;
13 this.searchview = null;
14 this.listview_id = false;
16 this.formview_id = false;
20 this.$element.html(QWeb.render("Action", {"prefix":this.element_id}));
21 this.$element.find("#mode_list").bind('click',this.on_mode_list);
22 this.$element.find("#mode_form").bind('click',this.on_mode_form);
25 on_mode_list: function() {
26 $("#oe_action_form").hide();
27 $("#oe_action_search").show();
28 $("#oe_action_list").show();
30 on_mode_form: function() {
31 $("#oe_action_form").show();
32 $("#oe_action_search").hide();
33 $("#oe_action_list").hide();
35 do_action: function(action) {
36 // instantiate the right controllers by understanding the action
41 if(action.type == "ir.actions.act_window") {
42 this.do_action_window(action);
45 do_action_window: function(action) {
46 this.formview_id = false;
47 this.dataset = new openerp.base.DataSet(this.session, "oe_action_dataset", action.res_model);
50 // Locate first tree view
51 this.listview_id = false;
52 for(var i = 0; i < action.views.length; i++) {
53 if(action.views[i][1] == "tree") {
54 this.listview_id = action.views[i][0];
58 this.listview = new openerp.base.ListView(this.session, "oe_action_list", this.dataset, this.listview_id);
59 this.listview.start();
61 // Locate first form view
62 this.listview_id = false;
63 for(var j = 0; j < action.views.length; j++) {
64 if(action.views[j][1] == "form") {
65 this.formview_id = action.views[j][0];
69 this.formview = new openerp.base.FormView(this.session, "oe_action_form", this.dataset, this.formview_id);
70 this.formview.start();
72 // Take the only possible search view. Is that consistent ?
73 this.searchview_id = false;
74 if(this.listview && action.search_view_id) {
75 this.searchview_id = action.search_view_id[0];
77 this.searchview = new openerp.base.SearchView(this.session, "oe_action_search", this.dataset, this.searchview_id);
78 this.searchview.start();
82 openerp.base.View = openerp.base.Controller.extend({
86 openerp.base.DataSet = openerp.base.Controller.extend({
87 init: function(session, element_id, model) {
88 this._super(session, element_id);
90 this.model_fields = null;
92 // SHOULD USE THE ONE FROM FIELDS VIEW GET BECAUSE OF SELECTION
102 fields of row1 field fieldname
103 { type: value: text: text_format: text_completions type_*: a
107 this.rpc("/base/dataset/fields", {"model":this.model}, this.on_fields);
109 on_fields: function(result) {
110 this.model_fields = result.fields;
113 do_load: function(offset, limit) {
114 this.rpc("/base/dataset/load", {model: this.model, fields: this.fields }, this.on_loaded);
116 on_loaded: function(data) {
118 this.values = data.values;
120 on_reloaded: function(ids) {
124 openerp.base.DataRecord = openerp.base.Controller.extend({
125 init: function(session, model, fields) {
126 this._super(session, null);
129 this.fields = fields;
133 this.rpc("/base/datarecord/load", {"model": this.model, "id": this.id, "fields": "todo"}, this.on_loaded);
135 on_loaded: function(result) {
136 this.values = result.values;
138 on_change: function() {
140 on_reload: function() {
144 openerp.base.SearchView = openerp.base.Controller.extend({
145 init: function(session, element_id, dataset, view_id) {
146 this._super(session, element_id);
147 this.dataset = dataset;
148 this.model = dataset.model;
149 this.view_id = view_id;
150 this.input_index = 0;
155 //this.log('Starting SearchView '+this.model+this.view_id)
156 this.rpc("/base/searchview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded);
158 on_loaded: function(data) {
159 this.fields_view = data.fields_view;
160 this.log(this.fields_view);
162 this.$element.html(QWeb.render("SearchView", {"fields_view": this.fields_view}));
163 this.$element.find("#search").bind('click',this.on_search);
164 // TODO bind click event on all button
165 // TODO we don't do many2one yet, but in the future bind a many2one controller on them
166 this.log(this.$element.find("#search"));
168 register_input: function(node) {
169 // self should be passed in the qweb dict to do:
170 // <input t-add-id="self.register_input(node)"/>
173 var id = this.element_id + "_" + this.input_index++;
174 // TODO construct a nice object
175 // save it in our registry
176 this.input_ids[id] = {
186 on_click: function() {
187 // event catched on a button
188 // flip the disabled flag
189 // adjust the css class
191 on_search: function() {
192 this.log("on_search");
193 // collect all non disabled domains definitions, AND them
194 // evaluate as python expression
195 // save the result in this.domain
196 this.dataset.do_load();
198 on_clear: function() {
202 openerp.base.SearchViewInput = openerp.base.Controller.extend({
203 // TODO not sure should we create a controller for every input ?
205 // of we just keep a simple dict for each input in
206 // openerp.base.SearchView#input_ids
207 // and use if when we get an event depending on the type
208 // i think it's less bloated to avoid useless controllers
210 // but i think for many2one a controller would be nice
211 // so simple dict for simple inputs
212 // an controller for many2one ?
216 openerp.base.FormView = openerp.base.Controller.extend({
217 init: function(session, element_id, dataset, view_id) {
218 this._super(session, element_id);
219 this.dataset = dataset;
220 this.dataset_index = 0;
221 this.model = dataset.model;
222 this.view_id = view_id;
223 this.fields_views = {};
226 this.datarecord = {};
229 //this.log('Starting FormView '+this.model+this.view_id)
230 this.rpc("/base/formview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded);
232 on_loaded: function(data) {
233 this.fields_view = data.fields_view;
234 //this.log(this.fields_view);
236 var frame = new openerp.base.WidgetFrame(this.session, null, this, this.fields_view.arch);
238 this.$element.html(QWeb.render("FormView", { "frame": frame, "view": this }));
239 for (var i in this.widgets) {
240 this.widgets[i].register();
242 // bind to all wdigets that have onchange ??
244 // When the dataset is loaded load the first record (like gtk)
245 this.dataset.on_loaded.add_last(this.do_load_record);
247 // When a datarecord is loaded display the values in the inputs
248 this.datarecord = new openerp.base.DataRecord(this.session, this.model,{});
249 this.datarecord.on_loaded.add(this.on_record_loaded);
252 do_load_record: function() {
253 // if dataset is empty display the empty datarecord
254 if(this.dataset.ids.length == 0) {
255 this.on_record_loaded();
257 this.datarecord.load(this.dataset.ids[this.dataset_index]);
259 on_record_loaded: function() {
260 //for i in this.fields: f.update_from_datarecord()
264 openerp.base.ListView = openerp.base.Controller.extend({
265 init: function(session, element_id, dataset, view_id) {
266 this._super(session, element_id);
267 this.dataset = dataset;
268 this.model = dataset.model;
269 this.view_id = view_id;
278 this.event_loading = false; // TODO in the future prevent abusive click by masking
281 //this.log('Starting ListView '+this.model+this.view_id)
282 this.rpc("/base/listview/load", {"model": this.model, "view_id":this.view_id}, this.on_loaded);
284 on_loaded: function(data) {
285 this.fields_view = data.fields_view;
286 //this.log(this.fields_view);
287 this.name = "" + this.fields_view.arch.attrs.string;
288 this.$element.html(QWeb.render("ListView", {"fields_view": this.fields_view}));
289 this.$table = this.$element.find("table");
293 // TODO uss a object for each col, fill it with view and fallback to dataset.model_field
294 var tree = this.fields_view.arch.children;
295 for(var i = 0; i < tree.length; i++) {
297 if(col.tag == "field") {
298 this.cols.push(col.attrs.name);
299 this.colnames.push(col.attrs.name);
300 this.colmodel.push({ name: col.attrs.name, index: col.attrs.name });
303 //this.log(this.cols);
304 this.dataset.fields = this.cols;
305 this.dataset.on_loaded.add_last(this.do_fill_table);
307 do_fill_table: function() {
308 //this.log("do_fill_table");
311 //this.log(this.dataset.data);
313 var ids = this.dataset.ids;
314 for(var i = 0; i < ids.length; i++) {
315 // TODO very strange is sometimes non existing ? even as admin ? example ir.ui.menu
316 var row = this.dataset.values[ids[i]];
328 //rowList: [10,20,30],
329 colNames: this.colnames,
330 colModel: this.colmodel,
334 }).setGridWidth(this.$element.width());
335 $(window).bind('resize', function() { self.$table.setGridWidth(self.$element.width()); }).trigger('resize');
339 openerp.base.TreeView = openerp.base.Controller.extend({
342 openerp.base.Widget = openerp.base.Controller.extend({
343 // TODO Change this to init: function(view, node) { and use view.session and a new element_id for the super
344 // it means that widgets are special controllers
345 init: function(session, element_id, view, node) {
346 var type = view.fields_view.fields[node.attrs.name] || {};
347 this.type = node.attrs.widget || type.type || node.tag;
348 this.name = node.attrs.name;
349 var type = view.fields_view.fields[node.attrs.name] || {};
350 this.type = node.attrs.widget || type.type || node.tag;
351 this.element_id = (node.tag == this.type ? node.tag : node.tag + '_' + this.type) + '_';
352 this.element_id += (this.name ? this.name + (this.is_field_label ? '_label' : '') + '_' : '');
353 this.element_id += Math.round(Math.random() * (new Date()).getTime());
354 this._super(session, this.element_id);
356 this.view.widgets[this.element_id] = this;
358 this.children = node.children;
359 this.colspan = parseInt(node.attrs.colspan || 1);
360 if (node.tag == 'field') {
361 this.view.fields[node.attrs.name] = this;
362 if (node.attrs.nolabel != '1' && this.colspan > 1) {
366 this.field = view.fields_view.fields[node.attrs.name];
367 this.template = "FormView.widget";
369 this.invisible = (node.attrs.invisible == '1');
370 this.string = node.attrs.string || (this.field ? this.field.string : undefined);
371 this.help = node.attrs.help || (this.field ? this.field.help : undefined);
372 this.nolabel = (node.attrs.nolabel == '1');
374 register: function() {
375 this.$element = $('#' + this.element_id);
379 var template = this.template;
380 return QWeb.render(template, { "widget": this });
384 openerp.base.WidgetFrame = openerp.base.Widget.extend({
385 init: function(session, element_id, view, node) {
386 this._super(session, element_id, view, node);
387 this.template = "FormView.frame";
388 this.columns = node.attrs.col || 4;
393 for (var i = 0; i < node.children.length; i++) {
394 var n = node.children[i];
395 if (n.tag == "newline") {
401 this.set_row_cells_with(this.table[this.table.length - 1]);
404 if (this.table.length) {
405 this.set_row_cells_with(this.table[this.table.length - 1]);
408 this.table.push(row);
413 set_row_cells_with: function(row) {
414 for (var i = 0; i < row.length; i++) {
416 if (w.is_field_label) {
419 row[i + 1].width = Math.round((100 / this.columns) * (w.colspan + 1) - 1) + '%';
421 } else if (w.width === undefined) {
422 w.width = Math.round((100 / this.columns) * w.colspan) + '%';
426 handle_node: function(n) {
427 var type = this.view.fields_view.fields[n.attrs.name] || {};
428 var widget_type = n.attrs.widget || type.type || n.tag;
429 if (openerp.base.widgets[widget_type]) {
430 var widget = new openerp.base.widgets[widget_type](this.session, null, this.view, n);
431 if (n.tag == 'field' && n.attrs.nolabel != '1') {
432 var label = new openerp.base.widgets['label'](this.session, null, this.view, n);
433 label["for"] = widget;
434 this.add_widget(label);
436 this.add_widget(widget);
438 console.log("Unhandled widget type : " + widget_type, n);
441 add_widget: function(w) {
443 var current_row = this.table[this.table.length - 1];
444 if (current_row.length && (this.x + w.colspan) > this.columns) {
445 current_row = this.add_row();
454 openerp.base.WidgetNotebook = openerp.base.Widget.extend({
455 init: function(session, element_id, view, node) {
456 this._super(session, element_id, view, node);
457 this.template = "FormView.notebook";
459 for (var i = 0; i < node.children.length; i++) {
460 var n = node.children[i];
461 if (n.tag == "page") {
462 var page = new openerp.base.WidgetFrame(this.session, null, this.view, n);
463 this.pages.push(page);
469 openerp.base.WidgetSeparator = openerp.base.Widget.extend({
470 init: function(session, element_id, view, node) {
471 this._super(session, element_id, view, node);
472 this.template = "FormView.separator";
476 openerp.base.WidgetLabel = openerp.base.Widget.extend({
477 init: function(session, element_id, view, node) {
478 this.is_field_label = true;
479 this._super(session, element_id, view, node);
480 this.template = "FormView.label";
485 openerp.base.WidgetButton = openerp.base.Widget.extend({
486 init: function(session, element_id, view, node) {
487 this._super(session, element_id, view, node);
488 this.template = "FormView.button";
492 openerp.base.Field = openerp.base.Widget.extend({
493 init: function(session, element_id, view, node) {
494 this._super(session, element_id, view, node);
495 // this.datarecord = this.view.datarecord ??
499 openerp.base.FieldChar = openerp.base.Field.extend({
500 init: function(session, element_id, view, node) {
501 this._super(session, element_id, view, node);
502 this.template = "FormView.field.char";
506 // this.$element.bind('leaving_focus',)
508 set_value: function() {
509 // this.$element.val(this.view.datarecord.values[this.name])
511 on_change: function() {
512 //this.view.update_field(this.name,value);
517 openerp.base.FieldEmail = openerp.base.Field.extend({
518 init: function(session, element_id, view, node) {
519 this._super(session, element_id, view, node);
520 this.template = "FormView.field.char";
524 openerp.base.FieldFloat = openerp.base.Field.extend({
525 init: function(session, element_id, view, node) {
526 this._super(session, element_id, view, node);
527 this.template = "FormView.field.char";
531 openerp.base.FieldBoolean = openerp.base.Field.extend({
532 init: function(session, element_id, view, node) {
533 this._super(session, element_id, view, node);
534 this.template = "FormView.field.boolean";
538 openerp.base.FieldDate = openerp.base.Field.extend({
539 init: function(session, element_id, view, node) {
540 this._super(session, element_id, view, node);
541 this.template = "FormView.field.date";
545 openerp.base.FieldDatetime = openerp.base.Field.extend({
546 init: function(session, element_id, view, node) {
547 this._super(session, element_id, view, node);
548 this.template = "FormView.field.datetime";
552 openerp.base.FieldText = openerp.base.Field.extend({
553 init: function(session, element_id, view, node) {
554 this._super(session, element_id, view, node);
555 this.template = "FormView.field.text";
559 openerp.base.FieldTextXml = openerp.base.Field.extend({
560 // to replace view editor
563 openerp.base.FieldSelection = openerp.base.Field.extend({
564 init: function(session, element_id, view, node) {
565 this._super(session, element_id, view, node);
566 this.template = "FormView.field.selection";
570 openerp.base.FieldMany2One = openerp.base.Field.extend({
571 init: function(session, element_id, view, node) {
572 this._super(session, element_id, view, node);
573 this.template = "FormView.field.many2one";
577 openerp.base.FieldOne2Many = openerp.base.Field.extend({
578 init: function(session, element_id, view, node) {
579 this._super(session, element_id, view, node);
580 this.template = "FormView.field.one2many";
584 openerp.base.FieldMany2Many = openerp.base.Field.extend({
585 init: function(session, element_id, view, node) {
586 this._super(session, element_id, view, node);
587 this.template = "FormView.field.one2many";
591 openerp.base.FieldReference = openerp.base.Field.extend({
592 init: function(session, element_id, view, node) {
593 this._super(session, element_id, view, node);
594 this.template = "FormView.field.reference";
598 openerp.base.widgets = {
599 'group' : openerp.base.WidgetFrame,
600 'notebook' : openerp.base.WidgetNotebook,
601 'separator' : openerp.base.WidgetSeparator,
602 'label' : openerp.base.WidgetLabel,
603 'char' : openerp.base.FieldChar,
604 'email' : openerp.base.FieldEmail,
605 'date' : openerp.base.FieldDate,
606 'datetime' : openerp.base.FieldDatetime,
607 'text' : openerp.base.FieldText,
608 'selection' : openerp.base.FieldSelection,
609 'many2one' : openerp.base.FieldMany2One,
610 'one2many' : openerp.base.FieldOne2Many,
611 'reference' : openerp.base.FieldReference,
612 'boolean' : openerp.base.FieldBoolean,
613 'float' : openerp.base.FieldFloat,
614 'button' : openerp.base.WidgetButton
617 openerp.base.CalendarView = openerp.base.Controller.extend({
618 // Dhtmlx scheduler ?
621 openerp.base.GanttView = openerp.base.Controller.extend({
625 openerp.base.DiagramView = openerp.base.Controller.extend({
629 openerp.base.GraphView = openerp.base.Controller.extend({
632 openerp.base.ProcessView = openerp.base.Controller.extend({
635 openerp.base.HelpView = openerp.base.Controller.extend({
640 // DEBUG_RPC:rpc.request:('execute', 'addons-dsh-l10n_us', 1, '*', ('ir.filters', 'get_filters', u'res.partner'))
641 // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: