do_push_state: function(state) {
if (this.widget_parent && this.widget_parent.do_push_state) {
if (this.inner_action) {
+ state['model'] = this.inner_action.res_model;
if (this.inner_action.id) {
state['action_id'] = this.inner_action.id;
- } else {
- state['model'] = this.inner_action.res_model;
}
}
this.widget_parent.do_push_state(state);
}
},
- do_load_state: function(state) {
+ do_load_state: function(state, warm) {
var self = this,
action_loaded;
if (state.action_id) {
this.null_action();
action_loaded = this.do_action(state.action_id);
}
- }
- else if (state.model && state.id) {
+ } else if (state.model && state.id) {
// TODO handle context & domain ?
this.null_action();
var action = {
views: [[false, 'page'], [false, 'form']]
};
action_loaded = this.do_action(action);
- }
- else if (state.client_action) {
+ } else if (state.sa) {
+ // load session action
+ var self = this;
+ this.null_action();
+ action_loaded = this.rpc('/web/session/get_session_action', {key: state.sa}).pipe(function(action) {
+ if (action) {
+ return self.do_action(action);
+ }
+ });
+ } else if (state.client_action) {
this.null_action();
this.ir_actions_client(state.client_action);
}
$.when(action_loaded || null).then(function() {
if (self.inner_viewmanager) {
- self.inner_viewmanager.do_load_state(state);
+ self.inner_viewmanager.do_load_state(state, warm);
}
});
},
$.when(view_promise).then(function() {
self.on_controller_inited(view_type, controller);
if (self.searchview
- && self.flags.auto_search !== false
+ && self.flags.auto_search
&& view.controller.searchable !== false) {
self.searchview.ready.then(self.searchview.do_search);
}
});
} else if (this.searchview
- && self.flags.auto_search !== false
+ && self.flags.auto_search
&& view.controller.searchable !== false) {
this.searchview.ready.then(this.searchview.do_search);
}
* @returns {$.Deferred} switching end signal
*/
on_prev_view: function (options) {
+ options = options || {};
var current_view = this.views_history.pop();
var previous_view = this.views_history[this.views_history.length - 1] || options['default'];
if (options.created && current_view === 'form' && previous_view === 'list') {
var groupby = results.group_by.length
? results.group_by
: action_context.group_by;
+ if (_.isString(groupby)) {
+ groupby = [groupby];
+ }
controller.do_search(results.domain, results.context, groupby || []);
});
},
// do not have it yet (and we don't, because we've not called our own
// ``_super()``) rpc requests will blow up.
var flags = action.flags || {};
- flags.auto_search = !!action.auto_search;
+ if (!('auto_search' in flags)) {
+ flags.auto_search = action.auto_search !== false;
+ }
if (action.res_model == 'board.board' && action.view_mode === 'form') {
// Special case for Dashboards
_.extend(flags, {
width: '95%'}, $root).open();
});
break;
- case 'customize_object':
- this.rpc('/web/dataset/search_read', {
- model: 'ir.model',
- fields: ['id'],
- domain: [['model', '=', this.dataset.model]]
- }, function (result) {
- self.do_edit_resource('ir.model', result.ids[0], {
- name : _t("Customize Object") });
- });
- break;
case 'manage_views':
if (current_view.fields_view && current_view.fields_view.arch) {
var view_editor = new session.web.ViewEditor(current_view, current_view.$element, this.dataset, current_view.fields_view.arch);
this.widget_parent.do_push_state(state);
}
},
- do_load_state: function(state) {
+ do_load_state: function(state, warm) {
var self = this,
defs = [];
if (state.view_type && state.view_type !== this.active_view) {
}
$.when(defs).then(function() {
- self.views[self.active_view].controller.do_load_state(state);
+ self.views[self.active_view].controller.do_load_state(state, warm);
});
},
shortcut_check : function(view) {
var $logs_list = $logs.find('ul').empty();
$logs.toggleClass('oe-has-more', log_records.length > cutoff);
_(log_records.reverse()).each(function (record) {
+ var context = {};
+ if (record.context) {
+ try { context = py.eval(record.context).toJSON(); }
+ catch (e) { /* TODO: what do I do now? */ }
+ }
$(_.str.sprintf('<li><a href="#">%s</a></li>', record.name))
.appendTo($logs_list)
- .delegate('a', 'click', function (e) {
+ .delegate('a', 'click', function () {
self.do_action({
type: 'ir.actions.act_window',
res_model: record.res_model,
res_id: record.res_id,
// TODO: need to have an evaluated context here somehow
- //context: record.context,
- views: [[false, 'form']]
+ context: context,
+ views: [[context.view_id || false, 'form']]
});
return false;
});
}, {
label: _t("Export"),
callback: view.on_sidebar_export
- }, {
- label: _t("View Log"),
- callback: view.on_sidebar_view_log,
- classname: 'oe_hide oe_sidebar_view_log'
}
]);
},
}
return $section;
},
-
+ /**
+ * For each item added to the section:
+ *
+ * ``label``
+ * will be used as the item's name in the sidebar
+ *
+ * ``action``
+ * descriptor for the action which will be executed, ``action`` and
+ * ``callback`` should be exclusive
+ *
+ * ``callback``
+ * function to call when the item is clicked in the sidebar, called
+ * with the item descriptor as its first argument (so information
+ * can be stored as additional keys on the object passed to
+ * ``add_items``)
+ *
+ * ``classname`` (optional)
+ * ``@class`` set on the sidebar serialization of the item
+ *
+ * ``title`` (optional)
+ * will be set as the item's ``@title`` (tooltip)
+ *
+ * @param {String} section_code
+ * @param {Array<{label, action | callback[, classname][, title]}>} items
+ */
add_items: function(section_code, items) {
- // An item is a dictonary : {
- // label: label to be displayed for the link,
- // action: action to be launch when the link is clicked,
- // callback: a function to be executed when the link is clicked,
- // classname: optional dom class name for the line,
- // title: optional title for the link
- // }
- // Note: The item should have one action or/and a callback
- //
-
var self = this,
$section = this.add_section(_.str.titleize(section_code.replace('_', ' ')), section_code),
section_id = $section.attr('id');
// TODO fme: should add the language to fields_view_get because between the fields view get
// and the moment the user opens the translation dialog, the user language could have been changed
this.view_language = view.session.user_context.lang;
- this['on_button' + _t("Save")] = this.on_button_Save;
- this['on_button' + _t("Close")] = this.on_button_Close;
+ this['on_button_' + _t("Save")] = this.on_btn_save;
+ this['on_button_' + _t("Close")] = this.on_btn_close;
this._super(view, {
width: '80%',
height: '80%'
}
});
},
- on_button_Save: function() {
+ on_btn_save: function() {
var trads = {},
- self = this;
+ self = this,
+ trads_mutex = new $.Mutex();
self.$fields_form.find('.oe_trad_field.touched').each(function() {
var field = $(this).attr('name').split('-');
if (!trads[field[0]]) {
_.each(data, function(value, field) {
self.view.fields[field].set_value(value);
});
- } else {
- self.view.dataset.write(self.view.datarecord.id, data, { 'lang': code });
}
+ trads_mutex.exec(function() {
+ return self.view.dataset.write(self.view.datarecord.id, data, { context : { 'lang': code } });
+ });
});
this.close();
},
- on_button_Close: function() {
+ on_btn_close: function() {
this.close();
}
});
template: "EmptyComponent",
// name displayed in view switchers
display_name: '',
+ init: function(parent, dataset, view_id, options) {
+ this._super(parent);
+ this.dataset = dataset;
+ this.view_id = view_id;
+ this.set_default_options(options);
+ },
set_default_options: function(options) {
this.options = options || {};
_.defaults(this.options, {
this.widget_parent.do_push_state(state);
}
},
- do_load_state: function(state) {
+ do_load_state: function(state, warm) {
},
/**
* Switches to a specific view type
view_mode : "list"
});
},
- on_sidebar_view_log: function() {
- },
sidebar_context: function () {
return $.when();
},