[MERGE] Dirty form notification
bzr revid: fme@openerp.com-20120906151443-52a4ifdfe0dfwu5n
This commit is contained in:
commit
90e82478a4
|
@ -731,6 +731,8 @@ instance.web.Menu = instance.web.Widget.extend({
|
|||
* @param {Number} id database id of the terminal menu to select
|
||||
*/
|
||||
open_menu: function (id) {
|
||||
this.current_menu = id;
|
||||
this.session.active_id = id;
|
||||
var $clicked_menu, $sub_menu, $main_menu;
|
||||
$clicked_menu = this.$el.add(this.$secondary_menus).find('a[data-menu=' + id + ']');
|
||||
this.trigger('open_menu', id, $clicked_menu);
|
||||
|
@ -803,16 +805,15 @@ instance.web.Menu = instance.web.Widget.extend({
|
|||
}
|
||||
}
|
||||
}
|
||||
this.open_menu(id);
|
||||
this.current_menu = id;
|
||||
this.session.active_id = id;
|
||||
if (action_id) {
|
||||
this.trigger('menu_click', {
|
||||
action_id: action_id,
|
||||
needaction: needaction,
|
||||
id: id
|
||||
id: id,
|
||||
previous_menu_id: this.current_menu // Here we don't know if action will fail (in which case we have to revert menu)
|
||||
}, $item);
|
||||
}
|
||||
this.open_menu(id);
|
||||
},
|
||||
/**
|
||||
* Jquery event handler for menu click
|
||||
|
@ -870,10 +871,12 @@ instance.web.UserMenu = instance.web.Widget.extend({
|
|||
},
|
||||
on_menu_settings: function() {
|
||||
var self = this;
|
||||
self.rpc("/web/action/load", { action_id: "base.action_res_users_my" }, function(result) {
|
||||
result.result.res_id = instance.session.uid;
|
||||
self.getParent().action_manager.do_action(result.result);
|
||||
});
|
||||
if (!this.getParent().has_uncommitted_changes()) {
|
||||
self.rpc("/web/action/load", { action_id: "base.action_res_users_my" }, function(result) {
|
||||
result.result.res_id = instance.session.uid;
|
||||
self.getParent().action_manager.do_action(result.result);
|
||||
});
|
||||
}
|
||||
},
|
||||
on_menu_about: function() {
|
||||
var self = this;
|
||||
|
@ -951,7 +954,10 @@ instance.web.Client = instance.web.Widget.extend({
|
|||
},
|
||||
toggle_bars: function(value) {
|
||||
this.$('tr:has(td.oe_topbar),.oe_leftbar').toggle(value);
|
||||
}
|
||||
},
|
||||
has_uncommitted_changes: function() {
|
||||
return false;
|
||||
},
|
||||
});
|
||||
|
||||
instance.web.WebClient = instance.web.Client.extend({
|
||||
|
@ -963,6 +969,9 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
start: function() {
|
||||
var self = this;
|
||||
return $.when(this._super()).pipe(function() {
|
||||
self.$el.on('click', '.oe_logo', function() {
|
||||
self.action_manager.do_action('home');
|
||||
});
|
||||
if (jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined) {
|
||||
$("body").addClass("kitten-mode-activated");
|
||||
if ($.blockUI) {
|
||||
|
@ -1048,11 +1057,13 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
},
|
||||
on_logout: function() {
|
||||
var self = this;
|
||||
this.session.session_logout().then(function () {
|
||||
$(window).unbind('hashchange', self.on_hashchange);
|
||||
self.do_push_state({});
|
||||
window.location.reload();
|
||||
});
|
||||
if (!this.has_uncommitted_changes()) {
|
||||
this.session.session_logout().then(function () {
|
||||
$(window).unbind('hashchange', self.on_hashchange);
|
||||
self.do_push_state({});
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
},
|
||||
bind_hashchange: function() {
|
||||
var self = this;
|
||||
|
@ -1095,14 +1106,15 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
},
|
||||
on_menu_action: function(options) {
|
||||
var self = this;
|
||||
this.rpc("/web/action/load", { action_id: options.action_id })
|
||||
.then(function (result) {
|
||||
return this.rpc("/web/action/load", { action_id: options.action_id })
|
||||
.pipe(function (result) {
|
||||
var action = result.result;
|
||||
if (options.needaction) {
|
||||
action.context.search_default_needaction_pending = true;
|
||||
}
|
||||
self.action_manager.clear_breadcrumbs();
|
||||
self.action_manager.do_action(action);
|
||||
return $.when(self.action_manager.do_action(action, null, true)).fail(function() {
|
||||
self.menu.open_menu(options.previous_menu_id);
|
||||
});
|
||||
});
|
||||
},
|
||||
do_action: function(action) {
|
||||
|
@ -1122,7 +1134,16 @@ instance.web.WebClient = instance.web.Client.extend({
|
|||
$(".oe_webclient", this.$el).removeClass("oe_content_full_screen");
|
||||
$("body").css({'overflow-y':'scroll'});
|
||||
}
|
||||
}
|
||||
},
|
||||
has_uncommitted_changes: function() {
|
||||
var $e = $.Event('clear_uncommitted_changes');
|
||||
instance.web.bus.trigger('clear_uncommitted_changes', $e);
|
||||
if ($e.isDefaultPrevented()) {
|
||||
return true;
|
||||
} else {
|
||||
return this._super.apply(this, arguments);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
instance.web.EmbeddedClient = instance.web.Client.extend({
|
||||
|
|
|
@ -92,6 +92,11 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
self.on("change:actual_mode", self, self.init_pager);
|
||||
self.init_pager();
|
||||
});
|
||||
instance.web.bus.on('clear_uncommitted_changes', this, function(e) {
|
||||
if (!this.can_be_discarded()) {
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
},
|
||||
destroy: function() {
|
||||
_.each(this.get_widgets(), function(w) {
|
||||
|
@ -748,7 +753,13 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
|
|||
return def.promise();
|
||||
},
|
||||
can_be_discarded: function() {
|
||||
return !this.$el.is('.oe_form_dirty') || confirm(_t("Warning, the record has been modified, your changes will be discarded."));
|
||||
if (this.$el.is('.oe_form_dirty')) {
|
||||
if (!confirm(_t("Warning, the record has been modified, your changes will be discarded.\n\nAre you sure you want to leave this page ?"))) {
|
||||
return false;
|
||||
}
|
||||
this.$el.removeClass('oe_form_dirty');
|
||||
}
|
||||
return true;
|
||||
},
|
||||
/**
|
||||
* Triggers saving the form's record. Chooses between creating a new
|
||||
|
|
|
@ -101,7 +101,9 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
select_breadcrumb: function(index, subindex) {
|
||||
for (var i = this.breadcrumbs.length - 1; i >= 0; i--) {
|
||||
if (i > index) {
|
||||
this.remove_breadcrumb(i);
|
||||
if (this.remove_breadcrumb(i) === false) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
var item = this.breadcrumbs[index];
|
||||
|
@ -110,8 +112,10 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
return true;
|
||||
},
|
||||
clear_breadcrumbs: function() {
|
||||
while (this.breadcrumbs.length) {
|
||||
this.remove_breadcrumb(0);
|
||||
for (var i = this.breadcrumbs.length - 1; i >= 0; i--) {
|
||||
if (this.remove_breadcrumb(0) === false) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
remove_breadcrumb: function(index) {
|
||||
|
@ -121,9 +125,17 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
return item.widget === it.widget;
|
||||
});
|
||||
if (!dups.length) {
|
||||
item.destroy();
|
||||
if (this.getParent().has_uncommitted_changes()) {
|
||||
this.inner_widget = item.widget;
|
||||
this.breadcrumbs.splice(index, 0, item);
|
||||
return false;
|
||||
} else {
|
||||
item.destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
var last_widget = this.breadcrumbs.slice(-1)[0];
|
||||
this.inner_widget = last_widget && last_widget.widget;
|
||||
},
|
||||
get_title: function() {
|
||||
var titles = [];
|
||||
|
@ -208,19 +220,19 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
}
|
||||
});
|
||||
},
|
||||
do_action: function(action, on_close) {
|
||||
do_action: function(action, on_close, clear_breadcrumbs) {
|
||||
if (_.isString(action) && instance.web.client_actions.contains(action)) {
|
||||
var action_client = { type: "ir.actions.client", tag: action };
|
||||
return this.do_action(action_client);
|
||||
return this.do_action(action_client, on_close, clear_breadcrumbs);
|
||||
} else if (_.isNumber(action) || _.isString(action)) {
|
||||
var self = this;
|
||||
return self.rpc("/web/action/load", { action_id: action }, function(result) {
|
||||
self.do_action(result.result, on_close);
|
||||
return self.rpc("/web/action/load", { action_id: action }).pipe(function(result) {
|
||||
return self.do_action(result.result, on_close, clear_breadcrumbs);
|
||||
});
|
||||
}
|
||||
if (!action.type) {
|
||||
console.error("No type for action", action);
|
||||
return null;
|
||||
return $.Deferred().reject();
|
||||
}
|
||||
var type = action.type.replace(/\./g,'_');
|
||||
var popup = action.target === 'new';
|
||||
|
@ -235,16 +247,23 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
}, action.flags || {});
|
||||
if (!(type in this)) {
|
||||
console.error("Action manager can't handle action of type " + action.type, action);
|
||||
return null;
|
||||
return $.Deferred().reject();
|
||||
}
|
||||
return this[type](action, on_close);
|
||||
return this[type](action, on_close, clear_breadcrumbs);
|
||||
},
|
||||
null_action: function() {
|
||||
this.dialog_stop();
|
||||
this.clear_breadcrumbs();
|
||||
},
|
||||
ir_actions_common: function(action, on_close) {
|
||||
ir_actions_common: function(action, on_close, clear_breadcrumbs) {
|
||||
var self = this, klass, widget, post_process;
|
||||
if (this.inner_widget && (action.type === 'ir.actions.client' || action.target !== 'new')) {
|
||||
if (this.getParent().has_uncommitted_changes()) {
|
||||
return $.Deferred().reject();
|
||||
} else if (clear_breadcrumbs) {
|
||||
this.clear_breadcrumbs();
|
||||
}
|
||||
}
|
||||
if (action.type === 'ir.actions.client') {
|
||||
var ClientWidget = instance.web.client_actions.get_object(action.tag);
|
||||
widget = new ClientWidget(this, action.params);
|
||||
|
@ -287,17 +306,17 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
this.inner_widget.appendTo(this.$el);
|
||||
}
|
||||
},
|
||||
ir_actions_act_window: function (action, on_close) {
|
||||
ir_actions_act_window: function (action, on_close, clear_breadcrumbs) {
|
||||
var self = this;
|
||||
if (action.target !== 'new') {
|
||||
if(action.menu_id) {
|
||||
this.dialog_stop();
|
||||
return this.getParent().do_action(action, function () {
|
||||
instance.webclient.menu.open_menu(action.menu_id);
|
||||
});
|
||||
}, clear_breadcrumbs);
|
||||
}
|
||||
}
|
||||
return this.ir_actions_common(action, on_close);
|
||||
return this.ir_actions_common(action, on_close, clear_breadcrumbs);
|
||||
},
|
||||
ir_actions_client: function (action, on_close) {
|
||||
return this.ir_actions_common(action, on_close);
|
||||
|
@ -314,7 +333,7 @@ instance.web.ActionManager = instance.web.Widget.extend({
|
|||
action_id: action.id,
|
||||
context: action.context || {}
|
||||
}).then(function (action) {
|
||||
self.do_action(action, on_closed)
|
||||
self.do_action(action, on_closed, clear_breadcrumbs)
|
||||
});
|
||||
},
|
||||
ir_actions_report_xml: function(action, on_closed) {
|
||||
|
@ -412,8 +431,10 @@ instance.web.ViewManager = instance.web.Widget.extend({
|
|||
var self = this;
|
||||
var view = this.views[view_type];
|
||||
var view_promise;
|
||||
if(!view)
|
||||
var form = this.views['form'];
|
||||
if (!view || (form && form.controller && !form.controller.can_be_discarded())) {
|
||||
return $.Deferred().reject();
|
||||
}
|
||||
|
||||
if (!no_store) {
|
||||
this.views_history.push(view_type);
|
||||
|
|
|
@ -79,7 +79,7 @@
|
|||
</form>
|
||||
<div class="oe_login_footer">
|
||||
<a href="#" class="oe_login_manage_db">Manage Databases</a> |
|
||||
<a href="http://www.openerp.com">Powered by <span>OpenERP</span></a>
|
||||
<a href="http://www.openerp.com" target="_blank">Powered by <span>OpenERP</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -404,13 +404,10 @@
|
|||
</tr>
|
||||
<tr>
|
||||
<td class="oe_leftbar" valign="top">
|
||||
<t t-js="d">
|
||||
d.url = '/' + (window.location.search || '');
|
||||
</t>
|
||||
<a t-att-href="url" class="oe_logo"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
|
||||
<a class="oe_logo" href="#"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
|
||||
<div class="oe_secondary_menus_container"/>
|
||||
<div class="oe_footer">
|
||||
Powered by <a href="http://www.openerp.com"><span>Open</span>ERP</a>
|
||||
Powered by <a href="http://www.openerp.com" target="_blank"><span>Open</span>ERP</a>
|
||||
</div>
|
||||
</td>
|
||||
<td class="oe_application">
|
||||
|
|
Loading…
Reference in New Issue