[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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user