From cc6a6076dea4971259693cd27404a392164d34bd Mon Sep 17 00:00:00 2001 From: Martin Geubelle Date: Tue, 12 May 2015 13:26:53 +0200 Subject: [PATCH] [ADD] web : progress bar widget + method for human readable big numbers --- addons/web/static/src/js/framework/utils.js | 17 +++ .../web/static/src/js/widgets/progress_bar.js | 128 ++++++++++++++++++ addons/web/static/src/xml/base.xml | 16 +++ addons/web/views/webclient_templates.xml | 1 + 4 files changed, 162 insertions(+) create mode 100644 addons/web/static/src/js/widgets/progress_bar.js diff --git a/addons/web/static/src/js/framework/utils.js b/addons/web/static/src/js/framework/utils.js index 393f3766bed..a7852ce4442 100644 --- a/addons/web/static/src/js/framework/utils.js +++ b/addons/web/static/src/js/framework/utils.js @@ -291,6 +291,22 @@ function human_size (size) { return size.toFixed(2) + ' ' + units[i]; } +/** + * Returns a human readable number + * + * @param {Number} number + */ +function human_number (number) { + var units = _t(",k,M").split(','); + var i = 0; + while (number >= 1000) { + number /= 1000; + ++i; + } + // return number.toFixed(2) + ' ' + units[i]; + return parseInt(number) + ' ' + units[i]; +} + /** * performs a half up rounding with arbitrary precision, correcting for float loss of precision * See the corresponding float_round() in server/tools/float_utils.py for more info @@ -394,6 +410,7 @@ return { is_bin_size: is_bin_size, binary_to_binsize: binary_to_binsize, human_size: human_size, + human_number: human_number, round_precision: round_precision, round_decimals: round_decimals, float_is_zero: float_is_zero, diff --git a/addons/web/static/src/js/widgets/progress_bar.js b/addons/web/static/src/js/widgets/progress_bar.js new file mode 100644 index 00000000000..3e628d596fa --- /dev/null +++ b/addons/web/static/src/js/widgets/progress_bar.js @@ -0,0 +1,128 @@ +odoo.define('web.ProgressBar', function (require) { +"use strict"; + +var Widget = require('web.Widget'); +var core = require('web.core'); +var QWeb = core.qweb; +var kanban_common = require('web_kanban.common'); +var utils = require('web.utils'); +var AbstractField = kanban_common.AbstractField; +var fields_registry = kanban_common.registry; +var _t = core._t; + + +/** + * Kanban widgets: ProgressBar + * options + * - editable: boolean if current_value is editable + * - editable_value: if set, get the editable_value from the field that must be present in the view + * [default: current_value] + * - current_value: get the current_value from the field that must be present in the view + * - max_value: get the max_value from the field that must be present in the view + * - title: title of the gauge, displayed on top of the gauge + * - on_change: action to call when cliking and setting a value + * + */ + +var ProgressBar = AbstractField.extend({ + template: "ProgressBar", + + init: function (parent, field, node) { + this._super(parent, field, node); + var editable = this.options.editable; + var on_change = this.options.on_change; + var title = this.options.title; + var current_value = this.getParent().record[this.options.current_value].raw_value; + var editable_value = current_value; + if (editable && this.options.editable_value){ + editable_value = this.getParent().record[this.options.editable_value].raw_value; + } + var max_value = this.getParent().record[this.options.max_value].raw_value; + + this.state = { + editable: editable, + on_change: on_change, + title: title, + current_value: current_value, + max_value: max_value, + editable_value: editable_value, + width_complete : 0, + width_over : 0, + }; + + var current_value = this.state.current_value; + var max_value = this.state.max_value; + if (current_value <= max_value){ + this.state.width_complete = current_value/max_value * 100; + } + else { + this.state.width_complete = max_value/current_value * 100; + this.state.width_over = (current_value - max_value) / current_value * 100; + } + }, + + start: function () { + + var self = this; + + this.$el.click(function (event){ + var parent = self.getParent(); + var value = self.state.editable_value || self.state.current_value; + + event.stopPropagation(); + + if (!parent.view.is_action_enabled('edit')) { + return; + } + if (!self.state.editable) { + return; + } + + // add input + if (!self.$el.find(".o_progress_bar_edit").size()) { + var $div = $('
'); + $div.css({ + 'text-align': 'center', + 'position': 'absolute', + 'width': $(this).outerWidth() + 'px', + }); + var $input = $('').val(value); + $input.css({ + 'text-align': 'center', + 'margin': 'auto', + }); + $div.append($input); + $(this).prepend($div); + + $input.focus() + .keydown(function (event) { + event.stopPropagation(); + if(isNaN($input.val())){ + self.do_warn(_t("Wrong value entered!"), _t("Only Integer Value should be valid.")); + $div.remove(); + } else { + if (event.keyCode == 13 || event.keyCode == 9) { + if ($input.val() != value) { + parent.view.dataset.call(self.state.on_change, [parent.id, $input.val()]).then(function () { + parent.do_reload(); + }); + } else { + $div.remove(); + } + } + } + }) + } + }); + + return this._super(); + }, + + _format_number: function(number) { + return utils.human_number(number, this.type) + }, +}); + +fields_registry.add("progress", ProgressBar); + +}); \ No newline at end of file diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 89c87d0b8df..564e90c8db1 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1102,6 +1102,22 @@
+ +
+
+ : +
+
+
+
+
+
+
+
+ / +
+
+