diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js index c45d5eed4da..5a789856678 100644 --- a/addons/web/static/src/js/view_editor.js +++ b/addons/web/static/src/js/view_editor.js @@ -85,11 +85,11 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ var view_values = {}; var warn = false; _.each(self.create_view_widget, function(widget) { - if (widget.invalid) { + if (widget.is_invalid) { warn = true; return false; }; - if (widget.dirty && !widget.invalid) { + if (widget.dirty && !widget.is_invalid) { view_values[widget.name] = widget.get_value(); } }); @@ -111,7 +111,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ this.create_view_dialog.start().open(); var view_widget = [{'name': 'view_name', 'string':'View Name', 'type': 'char', 'required': true, 'value' : this.model + '.custom_' + Math.round(Math.random() * 1000)}, {'name': 'view_type', 'string': 'View Type', 'type': 'selection', 'required': true, 'value': 'Form', 'selection': [['',''],['tree', 'Tree'],['form', 'Form'],['graph', 'Graph'],['calendar', 'Calender']]}, - {'name': 'proirity', 'string': 'Priority', 'type': 'char', 'required': true, 'value':'16'}]; + {'name': 'proirity', 'string': 'Priority', 'type': 'float', 'required': true, 'value':'16'}]; this.create_view_dialog.$element.append('
'); this.create_view_widget = []; _.each(view_widget, function(widget) { @@ -120,6 +120,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ type_widget.selection = widget.selection; } type_widget.required = widget.required; + type_widget.type = widget.type; self.create_view_dialog.$element.find('table[id=create_view]').append('' + widget.string + ':' + type_widget.render()+''); var value = null; if (widget.value) { @@ -159,12 +160,12 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ on_valid_create_view: function() { var msg = ""; - self.do_warn("The following fields are invalid :", msg); + this.do_warn("The following fields are invalid :", msg); }, add_node_name : function(node) { if(node.tagName.toLowerCase() == "button" || node.tagName.toLowerCase() == "field"){ @@ -636,14 +637,23 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ height: 400, buttons: { "Update": function(){ + var warn = false; var update_values = []; _.each(self.edit_widget, function(widget) { - if (widget.dirty && !widget.invalid) { + if (widget.is_invalid) { + warn = true; + return false; + }; + if (widget.dirty && !widget.is_invalid) { update_values.push([widget.name, widget.get_value()]); } }); - self.do_save_update_arch(obj, view_id, view_xml_id, clicked_tr_id, clicked_tr_level, "update_node", update_values); - self.edit_node_dialog.close(); + if (warn) { + self.on_valid_create_view(); + } else { + self.do_save_update_arch(obj, view_id, view_xml_id, clicked_tr_id, clicked_tr_level, "update_node", update_values); + self.edit_node_dialog.close(); + } }, "Cancel": function(){ self.edit_node_dialog.close(); @@ -658,8 +668,8 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ 'readonly' : {'string': 'Readonly', 'type': 'boolean'}, 'domain' : {'string': 'Domain', 'type': 'char'}, 'context' : {'string': 'Context', 'type': 'char'}, - 'limit' : {'string': 'Limit', 'type': 'char'}, - 'min_rows' : {'string': 'Minimum rows', 'type': 'char'}, + 'limit' : {'string': 'Limit', 'type': 'float'}, + 'min_rows' : {'string': 'Minimum rows', 'type': 'float'}, 'date_start' : {'string': 'Start date', 'type': 'char'}, 'date_delay' : {'string': 'Delay date', 'type': 'char'}, 'day_length' : {'string': 'Day length', 'type': 'char'}, @@ -672,10 +682,10 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ 'confirm' : {'string': 'Confirm', 'type': 'char'}, 'style' : {'string': 'Style', 'type': 'selection', 'selection':[["",""],["1", "1"],["1-1", "1-1"],["1-2", "1-2"],["2-1", "2-1"],["1-1-1", "1-1-1"]]}, 'filename' : {'string': 'File Name', 'type': 'char'}, - 'width' : {'string': 'Width', 'type': 'char'}, - 'height' : {'string': 'Height', 'type': 'char'}, + 'width' : {'string': 'Width', 'type': 'float'}, + 'height' : {'string': 'Height', 'type': 'float'}, 'attrs' : {'string': 'Attrs', 'type': 'char'}, - 'col' : {'string': 'col', 'type': 'char'}, + 'col' : {'string': 'col', 'type': 'float'}, 'link' : {'string': 'Link', 'type': 'char'}, 'position' : {'string': 'Position', 'type': 'selection', 'selection': [['',''],['after', 'After'],['before', 'Before'],['inside', 'Inside'],['replace', 'Replace']]}, 'states' : {'string': 'states', 'type': 'char'}, @@ -684,8 +694,10 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ 'on_change' : {'string': 'On change', 'type': 'char'}, 'nolabel' : {'string': 'No label', 'type': 'boolean'}, 'completion' : {'string': 'Completion', 'type': 'boolean'}, - 'colspan' : {'string': 'Colspan', 'type': 'char'}, + 'colspan' : {'string': 'Colspan', 'type': 'float'}, 'widget' : {'string': 'widget', 'type': 'selection'}, + 'colors' : {'string': 'Colors', 'type': 'char'}, + 'editable' : {'string': 'Editable', 'type': 'selection', 'selection': [["",""],["top","Top"],["bottom", "Bottom"]]}, 'groups' : {'string': 'Groups', 'type': 'seleciton_multi'}, }; var widget = _.keys(self.property.map); @@ -704,6 +716,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ return _.include(res, property); }); type_widget.selection = _PROPERTIES_ATTRIBUTES[property].selection + type_widget.type = _PROPERTIES_ATTRIBUTES[property].type value = value instanceof Array ? value[1] : value; self.edit_node_dialog.$element.find('table[id=rec_table]').append('' + _PROPERTIES_ATTRIBUTES[property].string + ':' + type_widget.render() + ''); type_widget.start(); @@ -752,27 +765,36 @@ openerp.web.ViewEditor.Field = openerp.web.Class.extend({ this.dirty = false; this.name = name; this.required = false; - this.invalid = false; + this.is_invalid = false; }, start: function () { this.$element = this.$element.find("td[id="+ this.name+"]"); this.update_dom(); }, update_dom: function() { - this.$element.toggleClass('invalid', this.invalid); + this.$element.toggleClass('invalid', this.is_invalid); this.$element.toggleClass('required', this.required); }, on_ui_change: function() { + this.validate(); var value = this.get_value(); - value = value instanceof Array ? value[1] : value; - if (this.required && !value) { - this.invalid = true; + if (this.is_invalid) { + this.is_invalid = true; } else { - this.invalid = false; + this.is_invalid = false; } this.dirty = true; this.update_dom(); }, + validate: function() { + this.is_invalid = false; + try { + var value = openerp.web.parse_value(this.get_value(), this, ''); + this.is_invalid = this.required && value === ''; + } catch(e) { + this.is_invalid = true; + } + }, render: function() { return _.sprintf("%s", this.name, QWeb.render(this.template, {widget: this})) }, @@ -785,7 +807,6 @@ openerp.web.ViewEditor.FieldBoolean = openerp.web.ViewEditor.Field.extend({ this.$element.find("input").change(function() { self.on_ui_change(); }); - }, set_value: function(value) { if (value) { @@ -853,6 +874,10 @@ openerp.web.ViewEditor.FieldSelectMulti = openerp.web.ViewEditor.FieldSelect.ext }); } }); +openerp.web.ViewEditor.FieldFloat = openerp.web.ViewEditor.FieldChar.extend({ + +}); + var _PROPERTIES = { 'field' : ['name', 'string', 'required', 'readonly', 'domain', 'context', 'nolabel', 'completion', 'colspan', 'widget', 'eval', 'ref', 'on_change', 'attrs', 'groups'], @@ -904,5 +929,6 @@ openerp.web.ViewEditor.property_widget = new openerp.web.Registry({ 'seleciton_multi' : 'openerp.web.ViewEditor.FieldSelectMulti', 'selection' : 'openerp.web.ViewEditor.FieldSelect', 'char' : 'openerp.web.ViewEditor.FieldChar', + 'float' : 'openerp.web.ViewEditor.FieldFloat', }); };