diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js
index 0e889cc429d..841ca4ba81c 100644
--- a/addons/web/static/src/js/view_editor.js
+++ b/addons/web/static/src/js/view_editor.js
@@ -44,7 +44,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
height: 500,
buttons: {
"Create": function(){
- //to do
+ self.on_create_view();
},
"Edit": function(){
self.xml_element_id = 0;
@@ -73,6 +73,80 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
});
});
},
+ on_create_view: function() {
+ var self = this;
+ this.create_view_dialog = new openerp.web.Dialog(this,{
+ modal: true,
+ title: _.sprintf("Create a view (%s)", self.model),
+ width: 500,
+ height: 400,
+ buttons: {
+ "Save": function(){
+ var view_values = {};
+ _.each(self.create_view_widget, function(widget) {
+ if (widget.dirty && !widget.invalid) {
+ view_values[widget.name] = widget.get_value();
+ }
+ });
+ $.when(self.do_save_view(view_values)).then(function() {
+ self.create_view_dialog.close();
+ var controller = self.action_manager.inner_viewmanager.views[self.action_manager.inner_viewmanager.active_view].controller;
+ controller.reload_content();
+ });
+ },
+ "Cancel": function(){
+ self.create_view_dialog.close();
+ }
+ }
+ });
+ this.create_view_dialog.start().open();
+ var view_widget = [{'name': 'view_name', 'type': 'char', 'required': true, 'value' : this.model + '.custom_' + Math.round(Math.random() * 1000)},
+ {'name': 'view_type', 'type': 'selection', 'required': true, 'value': 'Form', 'selection': [['',''],['tree', 'Tree'],['form', 'Form'],['graph', 'Graph'],['calendar', 'Calender']]},
+ {'name': 'pririty', 'type': 'char', 'required': true, 'value':'16'}];
+ this.create_view_dialog.$element.append('
');
+ this.create_view_widget = [];
+ _.each(view_widget, function(widget) {
+ var type_widget = new (self.property.get_any([widget.type])) (self.create_view_dialog, widget.name);
+ if (widget.selection) {
+ type_widget.selection = widget.selection;
+ }
+ type_widget.required = widget.required;
+ self.create_view_dialog.$element.find('table[id=create_view]').append('| ' + widget.name + ': | ' + type_widget.render()+' |
');
+ var value = null;
+ if (widget.value) {
+ value = [widget.name, widget.value];
+ type_widget.dirty = true;
+ }
+ type_widget.start();
+ type_widget.set_value(value)
+ self.create_view_widget.push(type_widget);
+ });
+ },
+ do_save_view: function(values) {
+ def = $.Deferred();
+ var field_dataset = new openerp.web.DataSetSearch(this, this.model, null, null);
+ var model_dataset = new openerp.web.DataSetSearch(this, 'ir.model', null, null);
+ var view_string = "", field_name = false, self = this;
+ field_dataset.call( 'fields_get', [], function(fields) {
+ _.each(['name', 'x_name'], function(value) {
+ if (_.include(_.keys(fields), value)) {
+ field_name = value;
+ return false;
+ }
+ });
+ if (field_name) {
+ model_dataset.read_slice(['name','field_id'], {"domain": [['model','=',self.model]]}, function(records) {
+ if (records) {view_string = records[0].name;}
+ var arch = _.sprintf("\n<%s string='%s'>\n\t\n%s>", values.view_type, view_string, field_name, values.view_type);
+ var vals = {'model': self.model, 'name': values.view_name, 'priority': values.priority, 'type': values.view_type, 'arch': arch};
+ self.dataset.create(vals, function(suc) {
+ def.resolve();
+ });
+ });
+ }
+ });
+ return def.promise();
+ },
add_node_name : function(node) {
if(node.tagName.toLowerCase() == "button" || node.tagName.toLowerCase() == "field"){
return (node.getAttribute('name'))?
@@ -541,8 +615,8 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({
"Update": function(){
var update_values = [];
_.each(self.edit_widget, function(widget) {
- if (widget.dirty) {
- update_values.push(widget.get_value());
+ if (widget.dirty && !widget.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);
@@ -617,9 +691,26 @@ openerp.web.ViewEditor.Field = openerp.web.Class.extend({
this.$element = view.$element;
this.dirty = false;
this.name = id;
+ this.required = false;
+ this.invalid = false;
+ },
+ start: function () {
+ this.update_dom();
+ },
+ update_dom: function() {
+ this.$element.find("td[id="+ this.name+"]").toggleClass('invalid', this.invalid);
+ this.$element.find("td[id="+ this.name+"]").toggleClass('required', this.required);
},
on_ui_change: function() {
+ var value = this.get_value();
+ value = value instanceof Array ? value[1] : value;
+ if (this.required && !value) {
+ this.invalid = true;
+ } else {
+ this.invalid = false;
+ }
this.dirty = true;
+ this.update_dom();
},
render: function() {
return QWeb.render(this.template, {widget: this});
@@ -632,6 +723,7 @@ openerp.web.ViewEditor.FieldBoolean = openerp.web.ViewEditor.Field.extend({
this.$element.find("input[id="+ self.name+"]").change(function() {
self.on_ui_change();
});
+ this._super();
},
set_value: function(value) {
if (value) {
@@ -640,7 +732,7 @@ openerp.web.ViewEditor.FieldBoolean = openerp.web.ViewEditor.Field.extend({
},
get_value: function() {
var value = this.$element.find("input[id=" + this.name + "]").is(':checked');
- return value ? [this.name, value] : [this.name, null];
+ return value ? value: null;
}
});
openerp.web.ViewEditor.FieldChar = openerp.web.ViewEditor.Field.extend({
@@ -650,22 +742,28 @@ openerp.web.ViewEditor.FieldChar = openerp.web.ViewEditor.Field.extend({
this.$element.find("input[id="+ this.name+"]").css('width','100%').change(function() {
self.on_ui_change();
});
+ this._super();
},
set_value: function(value) {
value ? this.$element.find("input[id=" + this.name + "]").val(value[1]): this.$element.find("tr[id=" + this.name + "] input").val();
},
get_value: function() {
var value= this.$element.find("input[id=" + this.name + "]").val();
- return value ? [this.name, value] : [this.name, ""];
+ return value ? value: "";
}
});
openerp.web.ViewEditor.FieldSelect = openerp.web.ViewEditor.Field.extend({
template : "vieweditor_selection",
+ init: function(view, id) {
+ this._super(view, id);
+ this.selection = false;
+ },
start: function () {
var self = this;
this.$element.find("select[id=" + this.name + "]").css('width', '100%').change(function() {
self.on_ui_change();
});
+ this._super();
},
set_value: function(value) {
value = value === null ? false : value;
@@ -678,7 +776,7 @@ openerp.web.ViewEditor.FieldSelect = openerp.web.ViewEditor.Field.extend({
},
get_value: function() {
var value = this.$element.find("select[id=" + this.name + "]").val();
- return value ? [this.name, value] : [this.name, ""];
+ return value ? value: "";
}
});
openerp.web.ViewEditor.WidgetProperty = openerp.web.ViewEditor.FieldSelect.extend({
@@ -735,6 +833,7 @@ openerp.web.ViewEditor.GroupsProperty = openerp.web.ViewEditor.FieldSelect.exten
start: function () {
this._super();
this.$element.find("select[id=" + this.name + "]").css('height', '100px').attr("multiple",true);
+ this._super();
},
set_value: function(value) {
var self = this;
@@ -800,11 +899,13 @@ openerp.web.ViewEditor.property_widget = new openerp.web.Registry({
'completion' : 'openerp.web.ViewEditor.FieldBoolean',
'widget' : 'openerp.web.ViewEditor.WidgetProperty',
'groups' : 'openerp.web.ViewEditor.GroupsProperty',
- 'position': 'openerp.web.ViewEditor.PositionProperty',
- 'icon': 'openerp.web.ViewEditor.IconProperty',
- 'align': 'openerp.web.ViewEditor.AlignProperty',
- 'special': 'openerp.web.ViewEditor.ButtonSpecialProperty',
- 'type': 'openerp.web.ViewEditor.ButtonTypeProperty',
- 'target': 'openerp.web.ViewEditor.ButtonTargetProperty'
+ 'position' : 'openerp.web.ViewEditor.PositionProperty',
+ 'icon' : 'openerp.web.ViewEditor.IconProperty',
+ 'align' : 'openerp.web.ViewEditor.AlignProperty',
+ 'special' : 'openerp.web.ViewEditor.ButtonSpecialProperty',
+ 'type' : 'openerp.web.ViewEditor.ButtonTypeProperty',
+ 'target' : 'openerp.web.ViewEditor.ButtonTargetProperty',
+ 'selection' : 'openerp.web.ViewEditor.FieldSelect',
+ 'char' : 'openerp.web.ViewEditor.FieldChar',
});
};