summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/widgets/progress_bar.js
diff options
context:
space:
mode:
authorMartin Geubelle <mge@odoo.com>2015-05-12 13:26:53 +0200
committerMartin Geubelle <mge@odoo.com>2015-05-12 17:16:19 +0200
commitcc6a6076dea4971259693cd27404a392164d34bd (patch)
tree691d804034788601292d66c2adda6ce0a88ede0f /addons/web/static/src/js/widgets/progress_bar.js
parenta86d6a7df980d55dd0af007f77c6bb039771525a (diff)
[ADD] web : progress bar widget + method for human readable big numbers
Diffstat (limited to 'addons/web/static/src/js/widgets/progress_bar.js')
-rw-r--r--addons/web/static/src/js/widgets/progress_bar.js128
1 files changed, 128 insertions, 0 deletions
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 class="o_progress_bar_edit" style="z-index:1"/>');
+ $div.css({
+ 'text-align': 'center',
+ 'position': 'absolute',
+ 'width': $(this).outerWidth() + 'px',
+ });
+ var $input = $('<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