[FIX] have page view force a return to the previous view if switched to with no record
[odoo/odoo.git] / addons / web / static / src / js / view_page.js
1 openerp.web.page = function (openerp) {
2     var _t = openerp.web._t,
3        _lt = openerp.web._lt;
4
5     openerp.web.views.add('page', 'openerp.web.PageView');
6     openerp.web.PageView = openerp.web.FormView.extend({
7         form_template: "PageView",
8         display_name: _lt('Page'),
9         init: function () {
10             this._super.apply(this, arguments);
11             this.registry = openerp.web.page.readonly;
12         },
13         reload: function () {
14             if (this.dataset.index == null) {
15                 this.do_prev_view();
16                 return $.Deferred().reject().promise();
17             }
18             return this._super();
19         },
20         on_loaded: function(data) {
21             this._super(data);
22             this.$form_header.find('button.oe_form_button_edit').click(this.on_button_edit);
23             this.$form_header.find('button.oe_form_button_create').click(this.on_button_create);
24             this.$form_header.find('button.oe_form_button_duplicate').click(this.on_button_duplicate);
25             this.$form_header.find('button.oe_form_button_delete').click(this.on_button_delete);
26         },
27         on_button_edit: function() {
28             return this.do_switch_view('form');
29         },
30         on_button_create: function() {
31             this.dataset.index = null;
32             return this.do_switch_view('form');
33         },
34         on_button_duplicate: function() {
35             var self = this;
36             var def = $.Deferred();
37             $.when(this.has_been_loaded).then(function() {
38                 self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) {
39                     return self.on_created({ result : new_id });
40                 }).then(function() {
41                     return self.do_switch_view('form');
42                 }).then(function() {
43                     def.resolve();
44                 });
45             });
46             return def.promise();
47         },
48         on_button_delete: function() {
49             var self = this;
50             var def = $.Deferred();
51             $.when(this.has_been_loaded).then(function() {
52                 if (self.datarecord.id && confirm(_t("Do you really want to delete this record?"))) {
53                     self.dataset.unlink([self.datarecord.id]).then(function() {
54                         self.on_pager_action('next');
55                         def.resolve();
56                     });
57                 } else {
58                     setTimeout(function () {
59                         def.reject();
60                     }, 0)
61                 }
62             });
63             return def.promise();
64         }
65     });
66
67     /** @namespace */
68     openerp.web.page = {};
69
70     openerp.web.page.WidgetFrameReadonly = openerp.web.form.WidgetFrame.extend({
71         template: 'WidgetFrame.readonly'
72     });
73     openerp.web.page.FieldReadonly = openerp.web.form.Field.extend({
74
75     });
76     openerp.web.page.FieldCharReadonly = openerp.web.page.FieldReadonly.extend({
77         template: 'FieldChar.readonly',
78         init: function(view, node) {
79             this._super(view, node);
80             this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1';
81         },
82         set_value: function (value) {
83             this._super.apply(this, arguments);
84             var show_value = openerp.web.format_value(value, this, '');
85             if (this.password) {
86                 show_value = new Array(show_value.length + 1).join('*');
87             }
88             this.$element.find('div').text(show_value);
89             return show_value;
90         }
91     });
92     openerp.web.page.FieldURIReadonly = openerp.web.page.FieldCharReadonly.extend({
93         template: 'FieldURI.readonly',
94         scheme: null,
95         set_value: function (value) {
96             var displayed = this._super.apply(this, arguments);
97             this.$element.find('a')
98                     .attr('href', this.scheme + ':' + displayed)
99                     .text(displayed);
100         }
101     });
102     openerp.web.page.FieldEmailReadonly = openerp.web.page.FieldURIReadonly.extend({
103         scheme: 'mailto'
104     });
105     openerp.web.page.FieldUrlReadonly = openerp.web.page.FieldURIReadonly.extend({
106         set_value: function (value) {
107             var s = /(\w+):(.+)/.exec(value);
108             if (!s || !(s[1] === 'http' || s[1] === 'https')) { return; }
109             this.scheme = s[1];
110             this._super(s[2]);
111         }
112     });
113     openerp.web.page.FieldBooleanReadonly = openerp.web.form.FieldBoolean.extend({
114         update_dom: function() {
115             this._super.apply(this, arguments);
116             this.$element.find('input').prop('disabled', true);
117         }
118     });
119     openerp.web.page.FieldSelectionReadonly = openerp.web.page.FieldReadonly.extend({
120         template: 'FieldChar.readonly',
121         init: function(view, node) {
122             // lifted straight from r/w version
123             var self = this;
124             this._super(view, node);
125             this.values = _.clone(this.field.selection);
126             _.each(this.values, function(v, i) {
127                 if (v[0] === false && v[1] === '') {
128                     self.values.splice(i, 1);
129                 }
130             });
131             this.values.unshift([false, '']);
132         },
133         set_value: function (value) {
134             value = value === null ? false : value;
135             value = value instanceof Array ? value[0] : value;
136             var option = _(this.values)
137                 .detect(function (record) { return record[0] === value; });
138             this._super(value);
139             this.$element.find('div').text(option ? option[1] : this.values[0][1]);
140         }
141     });
142     openerp.web.page.FieldMany2OneReadonly = openerp.web.page.FieldURIReadonly.extend({
143         set_value: function (value) {
144             value = value || null;
145             this.invalid = false;
146             var self = this;
147             this.value = value;
148             self.update_dom();
149             self.on_value_changed();
150             var real_set_value = function(rval) {
151                 self.value = rval;
152                 self.$element.find('a')
153                      .unbind('click')
154                      .text(rval ? rval[1] : '')
155                      .click(function () {
156                         self.do_action({
157                             type: 'ir.actions.act_window',
158                             res_model: self.field.relation,
159                             res_id: self.value[0],
160                             context: self.build_context(),
161                             views: [[false, 'page'], [false, 'form']],
162                             target: 'current'
163                         });
164                         return false;
165                      });
166             };
167             if (value && !(value instanceof Array)) {
168                 new openerp.web.DataSetStatic(
169                         this, this.field.relation, self.build_context())
170                     .name_get([value], function(data) {
171                         real_set_value(data[0]);
172                 });
173             } else {
174                 setTimeout(function() {real_set_value(value);}, 0);
175             }
176         },
177         get_value: function() {
178             if (!this.value) {
179                 return false;
180             } else if (this.value instanceof Array) {
181                 return this.value[0];
182             } else {
183                 return this.value;
184             }
185         }
186     });
187     openerp.web.page.FieldReferenceReadonly = openerp.web.page.FieldMany2OneReadonly.extend({
188         set_value: function (value) {
189             if (!value) {
190                 return this._super(null);
191             }
192             var reference = value.split(',');
193             this.field.relation = reference[0];
194             var id = parseInt(reference[1], 10);
195             return this._super(id);
196         },
197         get_value: function () {
198             if (!this.value) {
199                 return null;
200             }
201             return _.str.sprintf('%s,%d', this.field.relation, this.value[0]);
202         }
203     });
204
205     openerp.web.page.FieldMany2ManyReadonly = openerp.web.form.FieldMany2Many.extend({
206         force_readonly: true
207     });
208     openerp.web.page.FieldOne2ManyReadonly = openerp.web.form.FieldOne2Many.extend({
209         force_readonly: true
210     });
211     openerp.web.page.FieldBinaryFileReadonly = openerp.web.form.FieldBinary.extend({
212         template: 'FieldURI.readonly',
213         start: function() {
214             this._super.apply(this, arguments);
215             var self = this;
216             this.$element.find('a').click(function() {
217                 if (self.value) {
218                     self.on_save_as();
219                 }
220                 return false;
221             });
222         },
223         set_value: function(value) {
224             this._super.apply(this, arguments);
225             this.$element.find('a').show(!!value);
226             if (value) {
227                 var show_value = _t("Download") + " " + (this.view.datarecord[this.node.attrs.filename] || '');
228                 this.$element.find('a').text(show_value);
229             }
230         }
231     });
232     openerp.web.page.readonly = openerp.web.form.widgets.clone({
233         'frame': 'openerp.web.page.WidgetFrameReadonly',
234         'char': 'openerp.web.page.FieldCharReadonly',
235         'email': 'openerp.web.page.FieldEmailReadonly',
236         'url': 'openerp.web.page.FieldUrlReadonly',
237         'text': 'openerp.web.page.FieldCharReadonly',
238         'text_wiki' : 'openerp.web.page.FieldCharReadonly',
239         'date': 'openerp.web.page.FieldCharReadonly',
240         'datetime': 'openerp.web.page.FieldCharReadonly',
241         'selection' : 'openerp.web.page.FieldSelectionReadonly',
242         'many2one': 'openerp.web.page.FieldMany2OneReadonly',
243         'many2many' : 'openerp.web.page.FieldMany2ManyReadonly',
244         'one2many' : 'openerp.web.page.FieldOne2ManyReadonly',
245         'one2many_list' : 'openerp.web.page.FieldOne2ManyReadonly',
246         'reference': 'openerp.web.page.FieldReferenceReadonly',
247         'boolean': 'openerp.web.page.FieldBooleanReadonly',
248         'float': 'openerp.web.page.FieldCharReadonly',
249         'integer': 'openerp.web.page.FieldCharReadonly',
250         'float_time': 'openerp.web.page.FieldCharReadonly',
251         'binary': 'openerp.web.page.FieldBinaryFileReadonly',
252     });
253 };