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 @@
+ t-attf-class="oe_list_header_#{column.widget or column.type} #{((options.sortable and column.tag !== 'button') ? 'oe_sortable' : null)}"> -
+
@@ -730,15 +730,15 @@
- +
+ type="button" class="oe_button oe_form_button_create" accesskey="C">Create
- + or - Discard + Discard @@ -1297,8 +1297,7 @@
+ contenteditable="true"/>