diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index a629e559d4c..13294819f6b 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -923,7 +923,7 @@ label.error { height: 15px; } .openerp td.required input, .openerp td.required select { - background-color: #D2D2FF; + background-color: #D2D2FF !important; } .openerp td.invalid input, .openerp td.invalid select, .openerp td.invalid textarea { background-color: #F66 !important; diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index bbf7a4e5f31..0afdee26cf2 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1506,7 +1506,6 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ var dataset = new openerp.base.DataSetStatic(self, self.field.relation, self.build_context()); dataset.name_get([element_ids[0]], function(data) { self._change_int_ext_value(data[0]); - pop.stop(); }); }); }, @@ -1842,16 +1841,16 @@ openerp.base.form.One2ManyListView = openerp.base.ListView.extend({ pop.select_element(self.o2m.field.relation,{ initial_view: "form", alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined, - auto_create: false, + create_function: function(data) { + return self.o2m.dataset.create(data, function(r) { + self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result])); + self.o2m.dataset.on_change(); + }); + }, parent_view: self.o2m.view }, self.o2m.build_domain(), self.o2m.build_context()); - pop.on_create.add(function(data) { - self.o2m.dataset.create(data, function(r) { - self.o2m.dataset.set_ids(self.o2m.dataset.ids.concat([r.result])); - self.o2m.dataset.on_change(); - pop.stop(); - self.o2m.reload_current_view(); - }); + pop.on_select_elements.add_last(function() { + self.o2m.reload_current_view(); }); } }, @@ -1946,7 +1945,6 @@ openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({ self.reload_content(); } }); - pop.stop(); }); }, do_activate_record: function(index, id) { @@ -1968,16 +1966,22 @@ openerp.base.form.SelectCreatePopup = openerp.base.OldWidget.extend({ * - initial_view: form or search (default search) * - disable_multiple_selection * - alternative_form_view - * - auto_create (default true) + * - create_function (defaults to a naive saving behavior) * - parent_view */ select_element: function(model, options, domain, context) { + var self = this; this.model = model; this.domain = domain || []; this.context = context || {}; - this.options = _.defaults(options || {}, {"initial_view": "search", "auto_create": true}); + this.options = _.defaults(options || {}, {"initial_view": "search", "create_function": function() { + return self.create_row.apply(self, arguments); + }}); this.initial_ids = this.options.initial_ids; - openerp.base.form.dialog(this.render()); + this.created_elements = []; + openerp.base.form.dialog(this.render(), {close:function() { + self.check_exit(); + }}); this.start(); }, start: function() { @@ -2023,6 +2027,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.OldWidget.extend({ } $sbutton.click(function() { self.on_select_elements(self.selected_ids); + self.stop(); }); self.view_list = new openerp.base.form.SelectCreateListView(self, self.element_id + "_view_list", self.dataset, false, @@ -2035,15 +2040,11 @@ openerp.base.form.SelectCreatePopup = openerp.base.OldWidget.extend({ }); this.searchview.start(); }, - on_create: function(data) { - if (!this.options.auto_create) - return; + create_row: function(data) { var self = this; var wdataset = new openerp.base.DataSetSearch(this, this.model, this.context, this.domain); wdataset.parent_view = this.options.parent_view; - wdataset.create(data, function(r) { - self.on_select_elements([r.result]); - }); + return wdataset.create(data); }, on_select_elements: function(element_ids) { }, @@ -2071,18 +2072,43 @@ openerp.base.form.SelectCreatePopup = openerp.base.OldWidget.extend({ this.view_form.start(); this.view_form.on_loaded.add_last(function() { var $buttons = self.view_form.$element.find(".oe_form_buttons"); - $buttons.html(QWeb.render("SelectCreatePopup.form.buttons")); + $buttons.html(QWeb.render("SelectCreatePopup.form.buttons", {widget:self})); + var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save-new"); + $nbutton.click(function() { + self._created = $.Deferred().then(function() { + self._created = undefined; + self.view_form.on_button_new(); + }); + self.view_form.do_save(); + }); var $nbutton = $buttons.find(".oe_selectcreatepopup-form-save"); $nbutton.click(function() { + self._created = $.Deferred().then(function() { + self._created = undefined; + self.check_exit(); + }); self.view_form.do_save(); }); var $cbutton = $buttons.find(".oe_selectcreatepopup-form-close"); $cbutton.click(function() { - self.stop(); + self.check_exit(); + }); + }); + this.dataset.on_create.add(function(data) { + self.options.create_function(data).then(function(r) { + self.created_elements.push(r.result); + if (self._created) { + self._created.resolve(); + } }); }); - this.dataset.on_create.add(this.on_create); this.view_form.do_show(); + }, + check_exit: function() { + if (this.created_elements.length > 0) { + this.on_select_elements(this.created_elements); + } + this.stop(); } }); @@ -2092,6 +2118,7 @@ openerp.base.form.SelectCreateListView = openerp.base.ListView.extend({ }, select_record: function(index) { this.popup.on_select_elements([this.dataset.ids[index]]); + this.popup.stop(); }, do_select: function(ids, records) { this._super(ids, records); diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index e7abfdfaf0f..3032e702a73 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -352,8 +352,9 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi * Reloads the list view based on the current settings (dataset & al) * * @param {Boolean} [grouped] Should the list be displayed grouped + * @param {Object} [context] context to send the server while loading the view */ - reload_view: function (grouped) { + reload_view: function (grouped, context) { var self = this; var callback = function (field_view_get) { self.on_loaded(field_view_get, grouped); @@ -364,7 +365,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi return this.rpc('/base/listview/load', { model: this.model, view_id: this.view_id, - context: this.dataset.get_context(), + context: this.dataset.get_context(context), toolbar: this.options.sidebar }, callback); } @@ -411,7 +412,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi results.group_by = null; } - this.reload_view(!!results.group_by).then( + this.reload_view(!!results.group_by, results.context).then( $.proxy(this, 'reload_content')); }, /** diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index 661e0d650b8..e88e31ebba0 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -361,7 +361,6 @@ openerp.base.search.fields = new openerp.base.Registry({ 'selection': 'openerp.base.search.SelectionField', 'datetime': 'openerp.base.search.DateTimeField', 'date': 'openerp.base.search.DateField', - 'one2many': 'openerp.base.search.OneToManyField', 'many2one': 'openerp.base.search.ManyToOneField', 'many2many': 'openerp.base.search.ManyToManyField' }); @@ -796,6 +795,12 @@ openerp.base.search.ManyToOneField = openerp.base.search.CharField.extend({ return this._super(); } }); +/** + * m2m search field behaves pretty much exactly like a char field + * + * @class + */ +openerp.base.search.ManyToManyField = openerp.base.search.CharField.extend({}); openerp.base.search.ExtendedSearch = openerp.base.OldWidget.extend({ template: 'SearchView.extended_search', diff --git a/addons/base/static/src/js/view_tree.js b/addons/base/static/src/js/view_tree.js index da426080574..5c3c7457e1c 100644 --- a/addons/base/static/src/js/view_tree.js +++ b/addons/base/static/src/js/view_tree.js @@ -176,7 +176,6 @@ openerp.base.TreeView = openerp.base.View.extend({ }, function (actions) { if (!actions.length) { return; } var action = actions[0][2]; - action.flags.new_window = true; self.do_action(action); }); }, diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 78615a7667c..8cf30c42fdb 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -39,7 +39,6 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ var type = action.type.replace(/\./g,'_'); var popup = action.target === 'new'; action.flags = _.extend({ - popup: popup, views_switcher : !popup, search_view : !popup, action_buttons : !popup, @@ -53,7 +52,7 @@ openerp.base.ActionManager = openerp.base.Widget.extend({ this[type](action, on_closed); }, ir_actions_act_window: function (action, on_close) { - if (action.flags.popup) { + if (action.target === 'new') { if (this.dialog == null) { this.dialog = new openerp.base.Dialog(this, { title: action.name, width: '80%' }); if(on_close) @@ -252,13 +251,15 @@ openerp.base.ViewManager = openerp.base.Widget.extend({ openerp.base.ViewManagerAction = openerp.base.ViewManager.extend({ init: function(parent, action) { this.session = parent.session; + this.action = action; var dataset; if (!action.res_id) { dataset = new openerp.base.DataSetSearch(this, action.res_model, action.context, action.domain); } else { + this.action.flags.search_view = false; dataset = new openerp.base.DataSetStatic(this, action.res_model, action.context, [action.res_id]); + dataset.index = 0; } - this.action = action; this._super(parent, dataset, action.views); this.action = action; this.flags = this.action.flags || {}; diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 4e581e8c175..f9ec63dd69c 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -1114,11 +1114,17 @@ - + - - + + + + + + + +
@@ -1127,7 +1133,7 @@ - + diff --git a/addons/base_calendar/static/src/js/calendar.js b/addons/base_calendar/static/src/js/calendar.js index b53ed9ba900..22088493e16 100644 --- a/addons/base_calendar/static/src/js/calendar.js +++ b/addons/base_calendar/static/src/js/calendar.js @@ -17,10 +17,15 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ this.context = this.dataset.context || {}; this.has_been_loaded = $.Deferred(); this.creating_event_id = null; + this.dataset_events = []; if (this.options.action_views_ids.form) { this.form_dialog = new openerp.base_calendar.CalendarFormDialog(this, {}, this.options.action_views_ids.form, dataset); this.form_dialog.start(); } + this.COLOR_PALETTE = ['#f57900', '#cc0000', '#d400a8', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400', + '#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f', + '#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00', + '#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900' ]; }, start: function() { this.rpc("/base_calendar/calendarview/load", {"model": this.model, "view_id": this.view_id, 'toolbar': true}, this.on_loaded); @@ -99,7 +104,8 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ scheduler.config.multi_day = true; //Multi day events are not rendered in daily and weekly views scheduler.config.start_on_monday = true; scheduler.config.scroll_hour = 8; - scheduler.config.drag_resize = scheduler.config.drag_create = !!this.date_stop; + scheduler.config.drag_resize = true; + scheduler.config.drag_create = true; // Initialize Sceduler this.mode = this.mode || 'month'; @@ -110,6 +116,7 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ scheduler.attachEvent('onEventDeleted', this.do_delete_event); scheduler.attachEvent('onEventChanged', this.do_save_event); scheduler.attachEvent('onDblClick', this.do_edit_event); + scheduler.attachEvent('onBeforeLightbox', this.do_edit_event); this.mini_calendar = scheduler.renderCalendar({ container: this.sidebar.navigator.element_id, @@ -129,23 +136,11 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ reload_event: function(id) { this.dataset.read_ids([id], _.keys(this.fields), this.on_events_loaded); }, - load_scheduler: function() { - var self = this; - this.dataset.read_slice({}, function(events) { - if (self.session.locale_code) { - // TODO: replace $LAB - $LAB.setOptions({AlwaysPreserveOrder: true}).script([ - '/base_calendar/static/lib/dhtmlxScheduler/sources/locale_' + self.session.locale_code + '.js', - '/base_calendar/static/lib/dhtmlxScheduler/sources/locale_recurring_' + self.session.locale_code + '.js' - ]).wait(function() { - self.on_events_loaded(events); - }); - } else { - self.on_events_loaded(events); - } - }); + get_color: function(index) { + index = index % this.COLOR_PALETTE.length; + return this.COLOR_PALETTE[index]; }, - on_events_loaded: function(events) { + on_events_loaded: function(events, fn_filter, no_filter_reload) { var self = this; //To parse Events we have to convert date Format @@ -159,111 +154,81 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ break; } + if (this.color_field) { + var filter = evt[this.color_field]; + if (filter) { + var filter_item = { + value: (typeof filter === 'object') ? filter[0] : filter, + label: (typeof filter === 'object') ? filter[1] : filter + } + if (typeof(fn_filter) === 'function' && !fn_filter(filter_item.value)) { + continue; + } + var filter_index = _.indexOf(sidebar_ids, filter_item.value); + if (filter_index === -1) { + evt.color = filter_item.color = this.get_color(sidebar_ids.length); + sidebar_items.push(filter_item); + sidebar_ids.push(filter_item.value); + } else { + evt.color = this.get_color(filter_index); + } + evt.textColor = '#ffffff'; + } + } + if (this.fields[this.date_start]['type'] == 'date') { evt[this.date_start] = openerp.base.parse_date(evt[this.date_start]).set({hour: 9}).toString('yyyy-MM-dd HH:mm:ss'); } if (this.date_stop && evt[this.date_stop] && this.fields[this.date_stop]['type'] == 'date') { evt[this.date_stop] = openerp.base.parse_date(evt[this.date_stop]).set({hour: 17}).toString('yyyy-MM-dd HH:mm:ss'); } - if (this.color_field) { - var user = evt[this.color_field]; - if (user) { - if (_.indexOf(sidebar_ids, user[0]) === -1) { - sidebar_items.push({ - id: user[0], - name: user[1], - // TODO: use color table - color: '#dddddd' - }); - sidebar_ids.push(user[0]); - } - } - } res_events.push(this.convert_event(evt)); } scheduler.parse(res_events, 'json'); this.refresh_scheduler(); this.refresh_minical(); - this.sidebar.responsible.on_events_loaded(sidebar_items); + if (!no_filter_reload) { + this.sidebar.responsible.on_events_loaded(sidebar_items); + } }, - convert_event: function(event) { - var starts = event[this.date_start], - ends = event[this.date_delay] || 1, - span = 0, + convert_event: function(evt) { + var date_start = openerp.base.parse_datetime(evt[this.date_start]), + date_stop = this.date_stop ? openerp.base.parse_datetime(evt[this.date_stop]) : null, + date_delay = evt[this.date_delay] || null, res_text = '', res_description = []; - var parse_start_date = openerp.base.parse_datetime(starts); - if (event[this.date_stop]) { - var parse_end_date = openerp.base.parse_datetime(event[this.date_stop]); - } if (this.info_fields) { - var fld = event[this.info_fields[0]]; - - if (typeof fld == 'object') { - res_text = fld[fld.length -1]; - } else { - res_text = fld; - } + var fld = evt[this.info_fields[0]]; + res_text = (typeof fld == 'object') ? fld[fld.length -1] : res_text = fld; var sliced_info_fields = this.info_fields.slice(1); - for (sl_fld in sliced_info_fields) { - var slc_fld = event[sliced_info_fields[sl_fld]]; - + for (var sl_fld in sliced_info_fields) { + var slc_fld = evt[sliced_info_fields[sl_fld]]; if (typeof slc_fld == 'object') { res_description.push(slc_fld[slc_fld.length - 1]); - } else { - if(slc_fld) res_description.push(slc_fld); + } else if (slc_fld) { + res_description.push(slc_fld); } } } - - if (starts && ends) { - var n = 0, - h = ends; - if (ends == this.day_length) { - span = 1; - } else if (ends > this.day_length) { - n = ends / this.day_length; - h = ends % this.day_length; - n = parseInt(Math.floor(n)); - - if (h > 0) { - span = n + 1; - } else { - span = n; - } - } - var start = parse_start_date.setTime((parse_start_date.getTime() + (h * 60 * 60) + (n * 24 * 60 * 60))); - ends = parse_start_date; + if (!date_stop && date_delay) { + date_stop = date_start.clone().addHours(date_delay); } - - if (starts && this.date_stop) { - ends = parse_end_date; - if (event[this.date_stop] == undefined) { - var start = parse_start_date.setTime((parse_start_date.getTime() + (h * 60 * 60) + (n * 24 * 60 * 60))); - ends = parse_start_date; - } - var tds = parse_start_date.getTime(), - tde = parse_end_date.getTime(); - - if (tds >= tde) { - tde = tds + 60 * 60; - parse_end_date.setTime(tde); - ends = parse_end_date; - } - n = (tde - tds) / (60 * 60); - if (n >= this.day_length) { - span = Math.ceil(n / 24); - } - } - return { - 'start_date': parse_start_date.toString('yyyy-MM-dd HH:mm:ss'), - 'end_date': ends.toString('yyyy-MM-dd HH:mm:ss'), + var r = { + 'start_date': date_start.toString('yyyy-MM-dd HH:mm:ss'), + 'end_date': date_stop.toString('yyyy-MM-dd HH:mm:ss'), 'text': res_text, - 'id': event['id'], + 'id': evt.id, 'title': res_description.join() } + if (evt.color) { + r.color = evt.color; + } + if (evt.textColor) { + r.textColor = evt.textColor; + } + return r; }, do_create_event: function(event_id, event_obj) { var self = this, @@ -304,9 +269,9 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ this.dataset.index = index; this.form_dialog.form.do_show(); this.form_dialog.open(); - } else { - this.notification.warn("Edit event", "Could not find event #" + event_id); + return false; } + return true; }, get_event_data: function(event_obj) { var data = { @@ -317,20 +282,14 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ data[this.date_stop] = openerp.base.format_datetime(event_obj.end_date); } if (this.date_delay) { - var tds = (event_obj.start_date.getOrdinalNumber() / 1e3 >> 0) - (event_obj.start_date.getOrdinalNumber() < 0); - var tde = (event_obj.end_date.getOrdinalNumber() / 1e3 >> 0) - (event_obj.end_date.getOrdinalNumber() < 0); - var n = (tde - tds) / (60 * 60); - if (n > this.day_length) { - var d = Math.floor(n / 24), - h = n % 24; - n = d * this.day_length + h; - } - data[this.date_delay] = n; + var diff_seconds = Math.round((event_obj.end_date.getTime() - event_obj.start_date.getTime()) / 1000); + data[this.date_delay] = diff_seconds / 3600; } return data; }, do_search: function(domains, contexts, groupbys) { var self = this; + scheduler.clearAll(); $.when(this.has_been_loaded).then(function() { self.rpc('/base/session/eval_domain_and_context', { domains: domains, @@ -344,7 +303,11 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ fields: _.keys(self.fields), offset:0, limit: self.limit - }, self.on_events_loaded); + }, function(events) { + self.dataset_events = events; + self.on_events_loaded(events); + } + ); }); }); }, @@ -362,54 +325,6 @@ openerp.base_calendar.CalendarView = openerp.base.View.extend({ if (this.sidebar) { this.sidebar.$element.hide(); } - }, - popup_event: function(event_id) { - var self = this; - if (event_id) event_id = parseInt(event_id, 10); - var action = { - res_model: this.dataset.model, - res_id: event_id, - views: [[false, 'form']], - type: 'ir.actions.act_window', - view_type: 'form', - view_mode: 'form', - flags : { - search_view: false, - sidebar : false, - views_switcher : false, - action_buttons : false, - pager: false - } - } - var element_id = _.uniqueId("act_window_dialog"); - var dialog = $('
', { - 'id': element_id - }).dialog({ - modal: true, - width: 'auto', - height: 'auto', - buttons: { - Cancel: function() { - $(this).dialog("destroy"); - }, - Save: function() { - var view_manager = action_manager.viewmanager; - var _dialog = this; - view_manager.views[view_manager.active_view].controller.do_save(function(r) { - $(_dialog).dialog("destroy"); - // self.start(); - self.load_scheduler(); - }) - } - } - }); - var action_manager = new openerp.base.ActionManager(this, element_id); - action_manager.start(); - action_manager.do_action(action); - //Default_get - if (!event_id) { - this.dataset.index = null; - } } }); @@ -451,10 +366,25 @@ openerp.base_calendar.SidebarResponsible = openerp.base.Widget.extend({ init: function(parent, element_id, view) { this._super(parent, element_id); this.view = view; + this.$element.delegate('input:checkbox', 'change', this.on_filter_click); }, - on_events_loaded: function(users) { - this.$element.html(QWeb.render('CalendarView.sidebar.responsible', { users : users })); - // TODO: bind checkboxes reload sheduler + on_events_loaded: function(filters) { + this.$element.html(QWeb.render('CalendarView.sidebar.responsible', { filters: filters })); + }, + on_filter_click: function(e) { + var responsibles = [], + $e = $(e.target); + this.$element.find('div.oe_calendar_responsible input:checked').each(function() { + responsibles.push($(this).val()); + }); + scheduler.clearAll(); + if (responsibles.length) { + this.view.on_events_loaded(this.view.dataset_events, function(filter_value) { + return _.indexOf(responsibles, filter_value.toString()) > -1; + }, true); + } else { + this.view.on_events_loaded(this.view.dataset_events, false, true); + } } }); @@ -466,7 +396,6 @@ openerp.base_calendar.SidebarNavigator = openerp.base.Widget.extend({ on_events_loaded: function(events) { } }); - }; // DEBUG_RPC:rpc.request:('execute', 'addons-dsh-l10n_us', 1, '*', ('ir.filters', 'get_filters', u'res.partner')) diff --git a/addons/base_calendar/static/src/xml/base_calendar.xml b/addons/base_calendar/static/src/xml/base_calendar.xml index d5350ec9046..299f3ba0f3c 100644 --- a/addons/base_calendar/static/src/xml/base_calendar.xml +++ b/addons/base_calendar/static/src/xml/base_calendar.xml @@ -18,9 +18,9 @@
-
- - +
+ +