You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
4.9 KiB
133 lines
4.9 KiB
/* global openerp, py, jQuery, _, _t, $ */
|
|
|
|
openerp.web_action_conditionable = function (instance) {
|
|
'use strict';
|
|
instance.web.View.include({
|
|
/**
|
|
* @override
|
|
*/
|
|
is_action_enabled: function(action) {
|
|
var attrs = this.fields_view.arch.attrs;
|
|
if (action in attrs) {
|
|
try {
|
|
return this._super(action);
|
|
} catch(error) {
|
|
var expr = attrs[action];
|
|
var expression = py.parse(py.tokenize(expr));
|
|
var cxt = new instance.web.CompoundContext(
|
|
this.get_fields_values && !_.isEmpty(this.fields)
|
|
// We're on a form that has loaded its fields
|
|
? this.get_fields_values()
|
|
// This always exists
|
|
: this.dataset.get_context().get_eval_context() ||
|
|
{}
|
|
).eval();
|
|
|
|
if (_.isEmpty(cxt) &&
|
|
this instanceof instance.web.FormView
|
|
) {
|
|
// Short circuit if there's nothing to eval for form
|
|
// views, as this is also called before any fields are
|
|
// loaded
|
|
return true;
|
|
}
|
|
|
|
this._is_action_enabled_eval_context(cxt);
|
|
|
|
return py.evaluate(expression, cxt).toJSON();
|
|
}
|
|
} else {
|
|
return true;
|
|
}
|
|
},
|
|
_is_action_enabled_eval_context: function(cxt) {
|
|
cxt._group_refs = instance.session.group_refs;
|
|
cxt._context = this.dataset.get_context().eval();
|
|
},
|
|
|
|
});
|
|
instance.web.form.Many2ManyListView.include({
|
|
is_action_enabled: function(action) {
|
|
if (action in this.fields_view.arch.attrs) {
|
|
return (new instance.web.View()).is_action_enabled.apply(
|
|
this, arguments
|
|
);
|
|
}
|
|
return true;
|
|
},
|
|
});
|
|
instance.web.FormView.include({
|
|
init: function() {
|
|
this._super.apply(this, arguments);
|
|
this.on(
|
|
'load_record', this, this._load_record_web_action_conditionable
|
|
);
|
|
},
|
|
_load_record_web_action_conditionable: function() {
|
|
var self = this;
|
|
// Set correct classes
|
|
this.$el.toggleClass(
|
|
'oe_cannot_create', !this.is_action_enabled('create')
|
|
);
|
|
this.$el.toggleClass(
|
|
'oe_cannot_edit', !this.is_action_enabled('edit')
|
|
);
|
|
this.$el.toggleClass(
|
|
'oe_cannot_delete', !this.is_action_enabled('delete')
|
|
);
|
|
var $footer = this.$buttons.find('footer');
|
|
this.$buttons = jQuery(
|
|
instance.web.qweb.render('FormView.buttons', {'widget': this})
|
|
);
|
|
this.$buttons.append($footer);
|
|
// Update buttons
|
|
if (this.options.$buttons) {
|
|
var $existing = this.options.$buttons.find('.oe_form_buttons');
|
|
if ($existing.length) {
|
|
$existing.remove();
|
|
this.options.$buttons.append(this.$buttons);
|
|
}
|
|
} else {
|
|
this.$('.oe_form_buttons').replaceWith(this.$buttons);
|
|
}
|
|
this.$buttons.on(
|
|
'click', '.oe_form_button_create',
|
|
this.guard_active(this.on_button_create)
|
|
);
|
|
this.$buttons.on(
|
|
'click', '.oe_form_button_edit',
|
|
this.guard_active(this.on_button_edit)
|
|
);
|
|
this.$buttons.on(
|
|
'click', '.oe_form_button_save',
|
|
this.guard_active(this.on_button_save)
|
|
);
|
|
this.$buttons.on(
|
|
'click', '.oe_form_button_cancel',
|
|
this.guard_active(this.on_button_cancel)
|
|
);
|
|
this.check_actual_mode();
|
|
// Update sidebar menu
|
|
if (this.sidebar) {
|
|
this.sidebar.items.other = _.filter(
|
|
this.sidebar.items.other, function(item) {
|
|
return (
|
|
item.callback !== self.on_button_delete &&
|
|
item.callback !== self.on_button_duplicate
|
|
);
|
|
}
|
|
);
|
|
this.sidebar.add_items('other', _.compact([
|
|
self.is_action_enabled('delete') && {
|
|
label: _t('Delete'),
|
|
callback: self.on_button_delete,
|
|
},
|
|
self.is_action_enabled('create') && {
|
|
label: _t('Duplicate'),
|
|
callback: self.on_button_duplicate,
|
|
},
|
|
]));
|
|
}
|
|
},
|
|
});
|
|
};
|