[MERGE] forward port branch saas-12.4 up to 4a1321bc99

closes odoo/odoo#37127

Signed-off-by: Christophe Simonis <chs@odoo.com>
This commit is contained in:
Christophe Simonis
2019-09-20 14:33:54 +00:00
61 changed files with 1146 additions and 166 deletions
+66 -35
View File
@@ -2550,11 +2550,28 @@ var FieldProgressBar = AbstractField.extend({
if (this.recordData[this.nodeOptions.current_value]) {
this.value = this.recordData[this.nodeOptions.current_value];
}
this.max_value = this.recordData[this.nodeOptions.max_value] || 100;
// The few next lines determine if the widget can write on the record or not
this.editable_readonly = !!this.nodeOptions.editable_readonly;
// "hard" readonly
this.readonly = this.nodeOptions.readonly || !this.nodeOptions.editable;
this.edit_max_value = this.nodeOptions.edit_max_value || false;
this.canWrite = !this.readonly && (
this.mode === 'edit' ||
(this.editable_readonly && this.mode === 'readonly') ||
(this.viewType === 'kanban') // Keep behavior before commit
);
// Boolean to toggle if we edit the numerator (value) or the denominator (max_value)
this.edit_max_value = !!this.nodeOptions.edit_max_value;
this.max_value = this.recordData[this.nodeOptions.max_value] || 100;
this.title = _t(this.attrs.title || this.nodeOptions.title) || '';
this.edit_on_click = !this.nodeOptions.edit_max_value || false;
// Ability to edit the field through the bar
// /!\ this feature is disabled
this.enableBarAsInput = false;
this.edit_on_click = this.enableBarAsInput && this.mode === 'readonly' && !this.edit_max_value;
this.write_mode = false;
},
@@ -2562,19 +2579,19 @@ var FieldProgressBar = AbstractField.extend({
var self = this;
this._render_value();
if (!this.readonly) {
if (this.canWrite) {
if (this.edit_on_click) {
this.$el.on('click', '.o_progress', function (e) {
var $target = $(e.currentTarget);
self.value = Math.floor((e.pageX - $target.offset().left) / $target.outerWidth() * self.max_value);
var numValue = Math.floor((e.pageX - $target.offset().left) / $target.outerWidth() * self.max_value);
self.on_update(numValue);
self._render_value();
self.on_update(self.value);
});
} else {
this.$el.on('click', function () {
if (!self.write_mode) {
var $input = $('<input>', {type: 'text', class: 'o_progressbar_value o_input'});
$input.on('blur', _.bind(self.on_change_input, self));
$input.on('blur', self.on_change_input.bind(self));
self.$('.o_progressbar_value').replaceWith($input);
self.write_mode = true;
self._render_value();
@@ -2584,24 +2601,25 @@ var FieldProgressBar = AbstractField.extend({
}
return this._super();
},
/**
* Updates the widget with value
*
* @param {Number} value
*/
on_update: function (value) {
if (!isNaN(value)) {
if (this.edit_max_value) {
try {
this.max_value = this._parseValue(value);
this._isValid = true;
} catch (e) {
this._isValid = false;
}
var changes = {};
changes[this.nodeOptions.max_value] = this.max_value;
this.trigger_up('field_changed', {
dataPointID: this.dataPointID,
changes: changes,
});
} else {
this._setValue(value);
}
if (this.edit_max_value) {
this.max_value = value;
this._isValid = true;
var changes = {};
changes[this.nodeOptions.max_value] = this.max_value;
this.trigger_up('field_changed', {
dataPointID: this.dataPointID,
changes: changes,
});
} else {
// _setValues accepts string and will parse it
var formattedValue = this._formatValue(value);
this._setValue(formattedValue);
}
},
on_change_input: function (e) {
@@ -2609,29 +2627,42 @@ var FieldProgressBar = AbstractField.extend({
if (e.type === 'change' && !$input.is(':focus')) {
return;
}
if (isNaN($input.val())) {
this.do_warn(_t("Wrong value entered!"), _t("Only Integer Value should be valid."));
} else {
if (e.type === 'input') {
this._render_value($input.val());
if (parseFloat($input.val()) === 0) {
var parsedValue;
try {
// Cover all numbers with parseFloat
parsedValue = field_utils.parse.float($input.val());
} catch (error) {
this.do_warn(_t("Wrong value entered!"), _t("Only Integer or Float Value should be valid."));
}
if (parsedValue !== undefined) {
if (e.type === 'input') { // ensure what has just been typed in the input is a number
// returns NaN if not a number
this._render_value(parsedValue);
if (parsedValue === 0) {
$input.select();
}
} else {
} else { // Implicit type === 'blur': we commit the value
if (this.edit_max_value) {
this.max_value = $(e.target).val();
} else {
this.value = $(e.target).val() || 0;
parsedValue = parsedValue || 100;
}
var $div = $('<div>', {class: 'o_progressbar_value'});
this.$('.o_progressbar_value').replaceWith($div);
this.write_mode = false;
this.on_update(parsedValue);
this._render_value();
this.on_update(this.edit_max_value ? this.max_value : this.value);
}
}
},
/**
* Renders the value
*
* @private
* @param {Number} v
*/
_render_value: function (v) {
var value = this.value;
var max_value = this.max_value;