diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index e4b8885b1a1..5dc5f7d8cbf 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -25,6 +25,7 @@
display: none !important;
}
}
+
.openerp.openerp_webclient_container {
height: 100%;
position: relative;
@@ -473,6 +474,11 @@
max-width: 180px;
max-height: 180px;
}
+.openerp .oe_view_manager_current .accessactive{
+ text-decoration:underline;
+ text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
+ font-weight:bold;
+}
.openerp .oe_button.oe_link {
border: none;
padding: 0;
@@ -2561,12 +2567,6 @@
.openerp .oe_list.oe_list_editable td.oe_list_record_delete {
position: absolute;
}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_edition .oe_list_field_cell:not(.oe_readonly) {
- color: transparent;
-}
-.openerp .oe_list.oe_list_editable.oe_editing .oe_edition .oe_list_field_cell:not(.oe_readonly) * {
- visibility: hidden;
-}
.openerp .oe_list.oe_list_editable.oe_editing .oe_m2o_drop_down_button {
top: 5px;
}
@@ -2585,10 +2585,10 @@
}
.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_float input, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_view_integer input {
text-align: right;
- width: 100% !important;
+ width: 100%;
}
.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime > span, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date > span {
- width: 100% !important;
+ width: 100%;
}
.openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_datetime input.oe_datepicker_master, .openerp .oe_list.oe_list_editable.oe_editing .oe_form_field.oe_form_field_date input.oe_datepicker_master {
width: 100% !important;
@@ -2597,9 +2597,6 @@
min-width: 0 !important;
max-width: none !important;
}
-.openerp .oe_list_group_name {
- white-space: nowrap;
-}
.openerp .oe_form .oe_form_field_many2many > .oe_list .oe_list_pager_single_page {
display: none;
}
@@ -2659,17 +2656,14 @@
background: #eeeeee;
vertical-align: top;
}
+.openerp .oe_list_content > thead th {
+ position: relative;
+}
.openerp .oe_list_content td, .openerp .oe_list_content th {
padding: 3px 6px;
line-height: 18px;
}
-.openerp .oe_list_content th.oe_sortable, .openerp .oe_list_content th.oe_sortable div {
- cursor: pointer;
-}
-.openerp .oe_list_content th.oe_sortable div {
- position: relative;
-}
-.openerp .oe_list_content th.oe_sortable div:after {
+.openerp .oe_list_content th:after {
position: absolute;
right: 6px;
content: "";
@@ -2679,12 +2673,12 @@
border-color: black transparent;
visibility: hidden;
}
-.openerp .oe_list_content th.sortup div:after {
+.openerp .oe_list_content th.sortup:after {
visibility: visible;
filter: alpha(opacity=60);
opacity: 0.6;
}
-.openerp .oe_list_content th.sortdown div:after {
+.openerp .oe_list_content th.sortdown:after {
border-bottom: none;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index bc171ef1d6e..f43a4f10da2 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -125,9 +125,9 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
self.check_actual_mode();
self.on("change:actual_mode", self, self.init_pager);
self.init_pager();
+ self.widgetAccesskey();
});
self.on("load_record", self, self.load_record);
- this.on('view_loaded', self, self.load_form);
instance.web.bus.on('clear_uncommitted_changes', this, function(e) {
if (!this.can_be_discarded()) {
e.preventDefault();
@@ -144,13 +144,13 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
}
this._super();
},
- load_form: function(data) {
+ on_loaded: function(data) {
var self = this;
if (!data) {
throw new Error("No data provided.");
}
if (this.arch) {
- throw "Form view does not support multiple calls to load_form";
+ throw "Form view does not support multiple calls to on_loaded";
}
this.fields_order = [];
this.fields_view = data;
@@ -214,9 +214,19 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
e.stopPropagation();
}
});
- this.trigger('form_view_loaded', data);
+
return $.when();
},
+ widgetAccesskey:function(){
+ $(document).keydown(function(e){
+ if(e.keyCode === $.ui.keyCode.ALT) {
+ $("[accesskey] span").addClass('accessactive');
+ }
+ e.stopPropagation();
+ }).keyup(function(e){
+ $("[accesskey] span").removeClass('accessactive');
+ });
+ },
widgetFocused: function() {
// Clear click flag if used to focus a widget
this.__clicked_inside = false;
@@ -2153,20 +2163,6 @@ instance.web.form.AbstractField = instance.web.form.FormWidget.extend(instance.w
self.do_action(r);
});
},
-
- set_dimensions: function (height, width) {
- // remove width css property
- this.$el.css('width', '');
- // extract style (without width)
- var old_style = this.$el.attr('style');
- // jQuery doesn't understand/use !important
- var style = 'width:' + width + 'px !important;';
- if (old_style) {
- style += old_style
- }
- this.$el.attr('style', style);
- this.$el.css('minHeight', height);
- }
});
/**
@@ -2545,13 +2541,6 @@ instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.we
focus: function($el) {
this.$textarea.focus();
},
- set_dimensions: function (height, width) {
- this._super();
- this.$textarea.css({
- width: width,
- minHeight: height
- });
- },
});
/**
@@ -3172,9 +3161,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
return ! this.get("value");
},
focus: function () {
- if (!this.get('effective_readonly')) {
- this.$input.focus();
- }
+ this.$input.focus();
},
_quick_create: function() {
this.no_ed = true;
@@ -3351,23 +3338,6 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({
controller.on('edit:before', self, function (e) {
e.cancel = true;
});
- var has_handle = _(controller.columns).find(function (column) {
- if (!column instanceof instance.web.list.Handle) {
- return false;
- }
- column.modifiers.tree_invisible = true;
- column.invisible = '1';
- // remove from visibles
- controller.visible_columns.splice(
- controller.visible_columns.indexOf(column),
- 1);
- return true;
- });
- if (has_handle) {
- // recompute aggregates
- controller.aggregate_columns =
- _(controller.visible_columns).invoke('to_aggregate');
- }
}
} else if (view_type === "form") {
if (self.get("effective_readonly")) {
@@ -3603,7 +3573,6 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
_template: 'One2Many.listview',
init: function (parent, dataset, view_id, options) {
this._super(parent, dataset, view_id, _.extend(options || {}, {
- GroupsType: instance.web.form.One2ManyGroups,
ListType: instance.web.form.One2ManyList
}));
this.on('edit:before', this, this.proxy('_before_edit'));
@@ -3784,13 +3753,6 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({
});
}
});
-instance.web.form.One2ManyGroups = instance.web.ListView.Groups.extend({
- setup_resequence_rows: function () {
- if (!this.view.o2m.get('effective_readonly')) {
- this._super.apply(this, arguments);
- }
- }
-});
instance.web.form.One2ManyList = instance.web.ListView.List.extend({
pad_table_to: function (count) {
if (!this.view.is_action_enabled('create')) {
@@ -3851,7 +3813,7 @@ instance.web.form.One2ManyList = instance.web.ListView.List.extend({
instance.web.form.One2ManyFormView = instance.web.FormView.extend({
form_template: 'One2Many.formview',
- load_form: function(data) {
+ on_loaded: function(data) {
this._super(data);
var self = this;
this.$buttons.find('button.oe_form_button_create').click(function() {
@@ -4061,7 +4023,7 @@ instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({
}
this.list_view.m2m_field = this;
var loaded = $.Deferred();
- this.list_view.on("list_view_loaded", self, function() {
+ this.list_view.on_loaded.add_last(function() {
self.initial_is_loaded.resolve();
loaded.resolve();
});
@@ -4106,17 +4068,13 @@ instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends in
);
var self = this;
pop.on("elements_selected", self, function(element_ids) {
- var reload = false;
- _(element_ids).each(function (id) {
- if(! _.detect(self.dataset.ids, function(x) {return x == id;})) {
- self.dataset.set_ids(self.dataset.ids.concat([id]));
+ _.each(element_ids, function(one_id) {
+ if(! _.detect(self.dataset.ids, function(x) {return x == one_id;})) {
+ self.dataset.set_ids([].concat(self.dataset.ids, [one_id]));
self.m2m_field.dataset_changed();
- reload = true;
+ self.reload_content();
}
});
- if (reload) {
- self.reload_content();
- }
});
},
do_activate_record: function(index, id) {
@@ -4185,7 +4143,7 @@ instance.web.form.FieldMany2ManyKanban = instance.web.form.AbstractField.extend(
}
this.kanban_view.m2m = this;
var loaded = $.Deferred();
- this.kanban_view.on("kanban_view_loaded",self,function() {
+ this.kanban_view.on_loaded.add_last(function() {
self.initial_is_loaded.resolve();
loaded.resolve();
});
@@ -4409,7 +4367,7 @@ instance.web.form.AbstractFormPopup = instance.web.Widget.extend({
this.view_form.set_embedded_view(this.options.alternative_form_view);
}
this.view_form.appendTo(this.$el.find(".oe_popup_form"));
- this.view_form.on("form_view_loaded", self, function() {
+ this.view_form.on_loaded.add_last(function() {
var multi_select = self.row_id === null && ! self.options.disable_multiple_selection;
self.$buttonpane.html(QWeb.render("AbstractFormPopup.buttons", {
multi_select: multi_select,
@@ -4520,7 +4478,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
}
this.searchview = new instance.web.SearchView(this,
this.dataset, false, search_defaults);
- this.searchview.on('search_data', self, function(domains, contexts, groupbys) {
+ this.searchview.on_search.add(function(domains, contexts, groupbys) {
if (self.initial_ids) {
self.do_search(domains.concat([[["id", "in", self.initial_ids]], self.domain]),
contexts, groupbys);
@@ -4529,7 +4487,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
self.do_search(domains.concat([self.domain]), contexts.concat(self.context), groupbys);
}
});
- this.searchview.on("search_view_loaded", self, function() {
+ this.searchview.on_loaded.add_last(function () {
self.view_list = new instance.web.form.SelectCreateListView(self,
self.dataset, false,
_.extend({'deletable': false,
@@ -4546,7 +4504,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
}).pipe(function() {
self.searchview.do_search();
});
- self.view_list.on("list_view_loaded", self, function() {
+ self.view_list.on_loaded.add_last(function() {
self.$buttonpane.html(QWeb.render("SelectCreatePopup.search.buttons", {widget:self}));
var $cbutton = self.$buttonpane.find(".oe_selectcreatepopup-search-close");
$cbutton.click(function() {
@@ -4559,7 +4517,7 @@ instance.web.form.SelectCreatePopup = instance.web.form.AbstractFormPopup.extend
});
});
});
- this.searchview.appendTo($(".oe_popup_search", self.$el));
+ this.searchview.appendTo($(".oe_popup_list", self.$el));
},
do_search: function(domains, contexts, groupbys) {
var self = this;
@@ -4695,19 +4653,14 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
var self = this;
this._super(field_manager, node);
this.binary_value = false;
- this.useFileAPI = !!window.FileReader;
- if (!this.useFileAPI) {
- this.fileupload_id = _.uniqueId('oe_fileupload');
- $(window).on(this.fileupload_id, function() {
- var args = [].slice.call(arguments).slice(1);
- self.on_file_uploaded.apply(self, args);
- });
- }
+ this.fileupload_id = _.uniqueId('oe_fileupload');
+ $(window).on(this.fileupload_id, function() {
+ var args = [].slice.call(arguments).slice(1);
+ self.on_file_uploaded.apply(self, args);
+ });
},
stop: function() {
- if (!this.useFileAPI) {
- $(window).off(this.fileupload_id);
- }
+ $(window).off(this.fileupload_id);
this._super.apply(this, arguments);
},
initialize_content: function() {
@@ -4725,22 +4678,13 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
return size.toFixed(2) + ' ' + units[i];
},
on_file_change: function(e) {
- var self = this;
- var file_node = e.target;
- if ((this.useFileAPI && file_node.files.length) || (!this.useFileAPI && $(file_node).val() !== '')) {
- if (this.useFileAPI) {
- var file = file_node.files[0];
- var filereader = new FileReader();
- filereader.readAsDataURL(file);
- filereader.onloadend = function(upload) {
- var data = upload.target.result;
- data = data.split(',')[1];
- self.on_file_uploaded(file.size, file.name, file.type, data);
- };
- } else {
- this.$el.find('form.oe_form_binary_form input[name=session_id]').val(this.session.session_id);
- this.$el.find('form.oe_form_binary_form').submit();
- }
+ // TODO: on modern browsers, we could directly read the file locally on client ready to be used on image cropper
+ // http://www.html5rocks.com/tutorials/file/dndfiles/
+ // http://deepliquid.com/projects/Jcrop/demos.php?demo=handler
+
+ if ($(e.target).val() !== '') {
+ this.$el.find('form.oe_form_binary_form input[name=session_id]').val(this.session.session_id);
+ this.$el.find('form.oe_form_binary_form').submit();
this.$el.find('.oe_form_binary_progress').show();
this.$el.find('.oe_form_binary').hide();
}
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 899bd614f76..b543b31e75e 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -631,9 +631,9 @@
+