c266e5dc89b7355ff60f15b3b0afa332d194949b
[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         do_show: function() {
28             if (this.dataset.index === null) {
29                 this.dataset.index = this.previous_index || this.dataset.ids.length - 1;
30             }
31             this._super.apply(this, arguments);
32         },
33         on_button_edit: function() {
34             return this.do_switch_view('form');
35         },
36         on_button_create: function() {
37             this.previous_index = this.dataset.index;
38             this.dataset.index = null;
39             return this.do_switch_view('form');
40         },
41         on_button_duplicate: function() {
42             var self = this;
43             var def = $.Deferred();
44             $.when(this.has_been_loaded).then(function() {
45                 self.dataset.call('copy', [self.datarecord.id, {}, self.dataset.context]).then(function(new_id) {
46                     return self.on_created({ result : new_id });
47                 }).then(function() {
48                     return self.do_switch_view('form');
49                 }).then(function() {
50                     def.resolve();
51                 });
52             });
53             return def.promise();
54         },
55         on_button_delete: function() {
56             var self = this;
57             var def = $.Deferred();
58             $.when(this.has_been_loaded).then(function() {
59                 if (self.datarecord.id && confirm(_t("Do you really want to delete this record?"))) {
60                     self.dataset.unlink([self.datarecord.id]).then(function() {
61                         self.on_pager_action('next');
62                         def.resolve();
63                     });
64                 } else {
65                     $.async_when().then(function () {
66                         def.reject();
67                     })
68                 }
69             });
70             return def.promise();
71         }
72     });
73
74     /** @namespace */
75     openerp.web.page = {};
76
77     openerp.web.page.WidgetFrameReadonly = openerp.web.form.WidgetFrame.extend({
78         template: 'WidgetFrame.readonly'
79     });
80     openerp.web.page.FieldReadonly = openerp.web.form.Field.extend({
81
82     });
83     openerp.web.page.FieldCharReadonly = openerp.web.page.FieldReadonly.extend({
84         template: 'FieldChar.readonly',
85         init: function(view, node) {
86             this._super(view, node);
87             this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1';
88         },
89         set_value: function (value) {
90             this._super.apply(this, arguments);
91             var show_value = openerp.web.format_value(value, this, '');
92             if (this.password) {
93                 show_value = new Array(show_value.length + 1).join('*');
94             }
95             this.$element.find('div').text(show_value);
96             return show_value;
97         }
98     });
99     openerp.web.page.FieldFloatReadonly = openerp.web.page.FieldCharReadonly.extend({
100         init: function (view, node) {
101             this._super(view, node);
102             if (node.attrs.digits) {
103                 this.digits = py.eval(node.attrs.digits).toJSON();
104             } else {
105                 this.digits = view.fields_view.fields[node.attrs.name].digits;
106             }
107         }
108     });
109     openerp.web.page.FieldURIReadonly = openerp.web.page.FieldCharReadonly.extend({
110         template: 'FieldURI.readonly',
111         scheme: null,
112         format_value: function (value) {
113             return value;
114         },
115         set_value: function (value) {
116             if (!value) {
117                 this.$element.find('a').text('').attr('href', '#');
118                 return;
119             }
120             this.$element.find('a')
121                     .attr('href', this.scheme + ':' + value)
122                     .text(this.format_value(value));
123         }
124     });
125     openerp.web.page.FieldEmailReadonly = openerp.web.page.FieldURIReadonly.extend({
126         scheme: 'mailto'
127     });
128     openerp.web.page.FieldUrlReadonly = openerp.web.page.FieldURIReadonly.extend({
129         set_value: function (value) {
130             if (!value) {
131                 this.$element.find('a').text('').attr('href', '#');
132                 return;
133             }
134             var s = /(\w+):(.+)/.exec(value);
135             if (!s) {
136                 value = "http://" + value;
137             }
138             this.$element.find('a').attr('href', value).text(value);
139         }
140     });
141     openerp.web.page.FieldBooleanReadonly = openerp.web.form.FieldBoolean.extend({
142         update_dom: function() {
143             this._super.apply(this, arguments);
144             this.$element.find('input').prop('disabled', true);
145         }
146     });
147     openerp.web.page.FieldSelectionReadonly = openerp.web.page.FieldReadonly.extend({
148         template: 'FieldChar.readonly',
149         init: function(view, node) {
150             // lifted straight from r/w version
151             var self = this;
152             this._super(view, node);
153             this.values = _.clone(this.field.selection);
154             _.each(this.values, function(v, i) {
155                 if (v[0] === false && v[1] === '') {
156                     self.values.splice(i, 1);
157                 }
158             });
159             this.values.unshift([false, '']);
160         },
161         set_value: function (value) {
162             value = value === null ? false : value;
163             value = value instanceof Array ? value[0] : value;
164             var option = _(this.values)
165                 .detect(function (record) { return record[0] === value; });
166             this._super(value);
167             this.$element.find('div').text(option ? option[1] : this.values[0][1]);
168         }
169     });
170     openerp.web.page.FieldMany2OneReadonly = openerp.web.page.FieldURIReadonly.extend({
171         set_value: function (value) {
172             value = value || null;
173             this.invalid = false;
174             var self = this;
175             this.value = value;
176             self.update_dom();
177             self.on_value_changed();
178             var real_set_value = function(rval) {
179                 self.value = rval;
180                 self.$element.find('a')
181                      .unbind('click')
182                      .text(rval ? rval[1] : '')
183                      .click(function () {
184                         self.do_action({
185                             type: 'ir.actions.act_window',
186                             res_model: self.field.relation,
187                             res_id: self.value[0],
188                             context: self.build_context(),
189                             views: [[false, 'page'], [false, 'form']],
190                             target: 'current'
191                         });
192                         return false;
193                      });
194             };
195             if (value && !(value instanceof Array)) {
196                 new openerp.web.DataSetStatic(
197                         this, this.field.relation, self.build_context())
198                     .name_get([value], function(data) {
199                         real_set_value(data[0]);
200                 });
201             } else {
202                 $.async_when().then(function() {real_set_value(value);});
203             }
204         },
205         get_value: function() {
206             if (!this.value) {
207                 return false;
208             } else if (this.value instanceof Array) {
209                 return this.value[0];
210             } else {
211                 return this.value;
212             }
213         }
214     });
215     openerp.web.page.FieldReferenceReadonly = openerp.web.page.FieldMany2OneReadonly.extend({
216         set_value: function (value) {
217             if (!value) {
218                 return this._super(null);
219             }
220             var reference = value.split(',');
221             this.field.relation = reference[0];
222             var id = parseInt(reference[1], 10);
223             return this._super(id);
224         },
225         get_value: function () {
226             if (!this.value) {
227                 return null;
228             }
229             var id;
230             if (typeof this.value === 'number') {
231                 // name_get has not run yet
232                 id = this.value;
233             } else {
234                 id = this.value[0];
235             }
236             return _.str.sprintf('%s,%d', this.field.relation, id);
237         }
238     });
239
240     openerp.web.page.FieldMany2ManyReadonly = openerp.web.form.FieldMany2Many.extend({
241         force_readonly: true
242     });
243     openerp.web.page.FieldOne2ManyReadonly = openerp.web.form.FieldOne2Many.extend({
244         force_readonly: true
245     });
246     openerp.web.page.FieldBinaryImageReaonly = openerp.web.form.FieldBinaryImage.extend({
247         update_dom: function() {
248             this._super.apply(this, arguments);
249             this.$element.find('.oe-binary').hide();
250         }
251     });
252     openerp.web.page.FieldBinaryFileReadonly = openerp.web.form.FieldBinary.extend({
253         template: 'FieldURI.readonly',
254         start: function() {
255             this._super.apply(this, arguments);
256             var self = this;
257             this.$element.find('a').click(function() {
258                 if (self.value) {
259                     self.on_save_as();
260                 }
261                 return false;
262             });
263         },
264         set_value: function(value) {
265             this._super.apply(this, arguments);
266             this.$element.find('a').show(!!value);
267             if (value) {
268                 var show_value = _t("Download") + " " + (this.view.datarecord[this.node.attrs.filename] || '');
269                 this.$element.find('a').text(show_value);
270             }
271         }
272     });
273     openerp.web.page.readonly = openerp.web.form.widgets.extend({
274         'frame': 'openerp.web.page.WidgetFrameReadonly',
275         'char': 'openerp.web.page.FieldCharReadonly',
276         'id': 'openerp.web.page.FieldCharReadonly',
277         'email': 'openerp.web.page.FieldEmailReadonly',
278         'url': 'openerp.web.page.FieldUrlReadonly',
279         'text': 'openerp.web.page.FieldCharReadonly',
280         'date': 'openerp.web.page.FieldCharReadonly',
281         'datetime': 'openerp.web.page.FieldCharReadonly',
282         'selection' : 'openerp.web.page.FieldSelectionReadonly',
283         'many2one': 'openerp.web.page.FieldMany2OneReadonly',
284         'many2many' : 'openerp.web.page.FieldMany2ManyReadonly',
285         'one2many' : 'openerp.web.page.FieldOne2ManyReadonly',
286         'one2many_list' : 'openerp.web.page.FieldOne2ManyReadonly',
287         'reference': 'openerp.web.page.FieldReferenceReadonly',
288         'boolean': 'openerp.web.page.FieldBooleanReadonly',
289         'float': 'openerp.web.page.FieldFloatReadonly',
290         'integer': 'openerp.web.page.FieldCharReadonly',
291         'float_time': 'openerp.web.page.FieldCharReadonly',
292         'binary': 'openerp.web.page.FieldBinaryFileReadonly',
293         'image': 'openerp.web.page.FieldBinaryImageReaonly'
294     });
295 };