diff options
| author | niv-openerp <nicolas.vanhoren@openerp.com> | 2012-02-17 11:17:31 +0100 |
|---|---|---|
| committer | niv-openerp <nicolas.vanhoren@openerp.com> | 2012-02-17 11:17:31 +0100 |
| commit | 1e9380b8faf05aa5ccb7fdfaf7309c362b1963bb (patch) | |
| tree | e49a42e01b00a5e95522a93c720762d487b17fd8 /addons/web/static/src/js/view_form.js | |
| parent | affc2d4d04539d452ee207eef2c01238df72d1ef (diff) | |
| parent | 9f65e1565e785fd1c11fef65e7b49e78fba290ed (diff) | |
[merge]
bzr revid: nicolas.vanhoren@openerp.com-20120217101731-3g9hrhs65qb32pkv
Diffstat (limited to 'addons/web/static/src/js/view_form.js')
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 146 |
1 files changed, 127 insertions, 19 deletions
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index ca1c2c29e6e..3f576089e5b 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -121,6 +121,15 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# this.sidebar.attachments = new openerp.web.form.SidebarAttachments(this.sidebar, this); this.sidebar.add_toolbar(this.fields_view.toolbar); this.set_common_sidebar_sections(this.sidebar); + + this.sidebar.add_section(_t('Customize'), 'customize'); + this.sidebar.add_items('customize', [{ + label: _t('Set Default'), + form: this, + callback: function (item) { + item.form.open_defaults_dialog(); + } + }]); } this.has_been_loaded.resolve(); }, @@ -140,6 +149,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# do_show: function () { var self = this; this.$element.show().css('visibility', 'hidden'); + this.$element.removeClass('oe_form_dirty'); return this.has_been_loaded.pipe(function() { var result; if (self.dataset.index === null) { @@ -168,7 +178,8 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# on_record_loaded: function(record) { var self = this, set_values = []; if (!record) { - throw new Error("Form: No record received"); + this.do_warn("Form", "The record could not be found in the database.", true); + return $.Deferred().reject(); } this.datarecord = record; @@ -204,6 +215,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# if (record.id) { self.do_push_state({id:record.id}); } + self.$element.removeClass('oe_form_dirty'); }); }, on_form_changed: function() { @@ -216,6 +228,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# w.update_dom(); } }, + do_notify_change: function() { + this.$element.addClass('oe_form_dirty'); + }, on_pager_action: function(action) { if (this.can_be_discarded()) { switch (action) { @@ -437,7 +452,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# }); }, on_button_cancel: function() { - return this.do_prev_view({'default': 'page'}); + if (this.can_be_discarded()) { + return this.do_prev_view({'default': 'page'}); + } }, on_button_new: function() { var self = this; @@ -459,8 +476,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# return def.promise(); }, can_be_discarded: function() { - return true; // FIXME: Disabled until the page view and button refactoring is done - return !this.is_dirty() || confirm(_t("Warning, the record has been modified, your changes will be discarded.")); + return !this.$element.is('.oe_form_dirty') || confirm(_t("Warning, the record has been modified, your changes will be discarded.")); }, /** * Triggers saving the form's record. Chooses between creating a new @@ -559,10 +575,10 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# } else { this.datarecord.id = r.result; if (!prepend_on_create) { - this.dataset.ids.push(this.datarecord.id); + this.dataset.alter_ids(this.dataset.ids.concat([this.datarecord.id])); this.dataset.index = this.dataset.ids.length - 1; } else { - this.dataset.ids.unshift(this.datarecord.id); + this.dataset.alter_ids([this.datarecord.id].concat(this.dataset.ids)); this.dataset.index = 0; } this.do_update_pager(); @@ -631,6 +647,82 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# }, sidebar_context: function () { return this.do_save().pipe(_.bind(function() {return this.get_fields_values();}, this)); + }, + open_defaults_dialog: function () { + var self = this; + var fields = _.chain(this.fields) + .map(function (field, name) { + var value = field.get_value(); + // ignore fields which are empty, invisible, readonly, o2m + // or m2m + if (!value + || field.invisible + || field.readonly + || field.field.type === 'one2many' + || field.field.type === 'many2many') { + return false; + } + var displayed; + switch(field.field.type) { + case 'selection': + displayed = _(field.values).find(function (option) { + return option[0] === value; + })[1]; + break; + case 'many2one': + displayed = field.value[1] || value; + break; + default: + displayed = value; + } + + return { + name: name, + string: field.string, + value: value, + displayed: displayed, + // convert undefined to false + change_default: !!field.field.change_default + } + }) + .compact() + .sortBy(function (field) { return field.string; }) + .value(); + var conditions = _.chain(fields) + .filter(function (field) { return field.change_default; }) + .value(); + + var d = new openerp.web.Dialog(this, { + title: _t("Set Default"), + args: { + fields: fields, + conditions: conditions + }, + buttons: [ + {text: _t("Close"), click: function () { d.close(); }}, + {text: _t("Save default"), click: function () { + var $defaults = d.$element.find('#formview_default_fields'); + var field_to_set = $defaults.val(); + if (!field_to_set) { + $defaults.parent().addClass('invalid'); + return; + } + var condition = d.$element.find('#formview_default_conditions').val(), + all_users = d.$element.find('#formview_default_all').is(':checked'); + new openerp.web.DataSet(self, 'ir.values').call( + 'set_default', [ + self.dataset.model, + field_to_set, + self.fields[field_to_set].get_value(), + all_users, + false, + condition || false + ]).then(function () { d.close(); }); + }} + ] + }); + d.template = 'FormView.set_default'; + d.open(); } }); openerp.web.FormDialog = openerp.web.Dialog.extend({ @@ -831,7 +923,7 @@ openerp.web.form.Widget = openerp.web.OldWidget.extend(/** @lends openerp.web.fo }, stop: function() { this._super.apply(this, arguments); - $('div.tipsy').stop().remove(); + $.fn.tipsy.clear(); }, process_modifiers: function() { var compute_domain = openerp.web.form.compute_domain; @@ -861,7 +953,7 @@ openerp.web.form.Widget = openerp.web.OldWidget.extend(/** @lends openerp.web.fo debug: openerp.connection.debug, widget: widget })}, - gravity: $.fn.tipsy.autoBounds(50, 'n'), + gravity: $.fn.tipsy.autoBounds(50, 'nw'), html: true, opacity: 0.85, trigger: 'hover' @@ -1219,6 +1311,11 @@ openerp.web.form.WidgetLabel = openerp.web.form.Widget.extend({ this._super(view, node); + if (this.node.tag == 'label' && !this.string && this.node.children.length) { + this.string = this.node.children[0]; + this.align = 'left'; + } + if (this.node.tag == 'label' && (this.align === 'left' || this.node.attrs.colspan || (this.string && this.string.length > 32))) { this.form_template = "WidgetParagraph"; this.colspan = parseInt(this.node.attrs.colspan || 1, 10); @@ -1227,6 +1324,8 @@ openerp.web.form.WidgetLabel = openerp.web.form.Widget.extend({ if (isNaN(parseFloat(this.node.attrs.align))) { this.align = 'left'; } + + this.multilines = this.string && _.str.lines(this.string).length > 1; } else { this.colspan = 1; this.width = '1%'; @@ -1293,6 +1392,7 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f this._super.apply(this, arguments); if (this.field.translate) { this.view.translatable_fields.push(this); + this.$element.addClass('oe_form_field_translatable'); this.$element.find('.oe_field_translate').click(this.on_translate); } if (this.nolabel && openerp.connection.debug) { @@ -1344,7 +1444,8 @@ openerp.web.form.Field = openerp.web.form.Widget.extend(/** @lends openerp.web.f if (this.is_valid()) { this.set_value_from_ui(); this.view.do_onchange(this); - this.view.on_form_changed(); + this.view.on_form_changed(true); + this.view.do_notify_change(); } else { this.update_dom(true); } @@ -1389,7 +1490,7 @@ openerp.web.form.FieldChar = openerp.web.form.Field.extend({ }, update_dom: function() { this._super.apply(this, arguments); - this.$element.find('input').prop('disabled', this.readonly); + this.$element.find('input').prop('readonly', this.readonly); }, set_value_from_ui: function() { this.value = openerp.web.parse_value(this.$element.find('input').val(), this); @@ -1412,7 +1513,7 @@ openerp.web.form.FieldChar = openerp.web.form.Field.extend({ openerp.web.form.FieldID = openerp.web.form.FieldChar.extend({ update_dom: function() { this._super.apply(this, arguments); - this.$element.find('input').prop('disabled', true); + this.$element.find('input').prop('readonly', true); } }); @@ -1490,7 +1591,7 @@ openerp.web.DateTimeWidget = openerp.web.OldWidget.extend({ showButtonPanel: true }); this.$element.find('img.oe_datepicker_trigger').click(function() { - if (!self.readonly) { + if (!self.readonly && !self.picker('widget').is(':visible')) { self.picker('setDate', self.value ? openerp.web.auto_str_to_date(self.value) : new Date()); self.$input_picker.show(); self.picker('show'); @@ -1520,7 +1621,7 @@ openerp.web.DateTimeWidget = openerp.web.OldWidget.extend({ }, set_readonly: function(readonly) { this.readonly = readonly; - this.$input.prop('disabled', this.readonly); + this.$input.prop('readonly', this.readonly); this.$element.find('img.oe_datepicker_trigger').toggleClass('oe_input_icon_disabled', readonly); }, is_valid: function(required) { @@ -1609,7 +1710,7 @@ openerp.web.form.FieldText = openerp.web.form.Field.extend({ }, update_dom: function() { this._super.apply(this, arguments); - this.$element.find('textarea').prop('disabled', this.readonly); + this.$element.find('textarea').prop('readonly', this.readonly); }, set_value_from_ui: function() { this.value = openerp.web.parse_value(this.$element.find('textarea').val(), this); @@ -2126,7 +2227,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ }, update_dom: function() { this._super.apply(this, arguments); - this.$input.prop('disabled', this.readonly); + this.$input.prop('readonly', this.readonly); } }); @@ -2248,7 +2349,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({ this.viewmanager = new openerp.web.ViewManager(this, this.dataset, views, {}); this.viewmanager.template = 'One2Many.viewmanager'; - this.viewmanager.registry = openerp.web.views.clone({ + this.viewmanager.registry = openerp.web.views.extend({ list: 'openerp.web.form.One2ManyListView', form: 'openerp.web.form.One2ManyFormView', page: 'openerp.web.PageView' @@ -2326,13 +2427,13 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({ obj['id'] = _.uniqueId(self.dataset.virtual_id_prefix); obj.defaults = {}; self.dataset.to_create.push(obj); - self.dataset.cache.push(_.clone(obj)); + self.dataset.cache.push(_.extend(_.clone(obj), {values: _.clone(command[2])})); ids.push(obj.id); return; case commands.UPDATE: obj['id'] = command[1]; self.dataset.to_write.push(obj); - self.dataset.cache.push(_.clone(obj)); + self.dataset.cache.push(_.extend(_.clone(obj), {values: _.clone(command[2])})); ids.push(obj.id); return; case commands.DELETE: @@ -2539,6 +2640,13 @@ openerp.web.form.One2ManyFormView = openerp.web.FormView.extend({ this.$form_header.find('button.oe_form_button_create').click(function() { self.do_save().then(self.on_button_new); }); + }, + do_notify_change: function() { + if (this.dataset.parent_view) { + this.dataset.parent_view.do_notify_change(); + } else { + this._super.apply(this, arguments); + } } }); @@ -3151,7 +3259,7 @@ openerp.web.form.FieldBinaryFile = openerp.web.form.FieldBinary.extend({ update_dom: function() { this._super.apply(this, arguments); this.$element.find('.oe-binary-file-set, .oe-binary-file-clear').toggle(!this.readonly); - this.$element.find('input[type=text]').prop('disabled', this.readonly); + this.$element.find('input[type=text]').prop('readonly', this.readonly); }, set_value: function(value) { this._super.apply(this, arguments); |
