From f82821f150f5252c330acc838cb0b1175921f7d7 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Wed, 29 Jul 2020 14:02:48 +0200 Subject: [PATCH] [IMP] kpi_dashboard: set new widgets --- kpi_dashboard/__manifest__.py | 2 +- kpi_dashboard/models/kpi_kpi.py | 3 +- .../static/src/js/widget/counter_widget.js | 14 ++++ .../static/src/js/widget/integer_widget.js | 71 +++++++++++++++++++ .../static/src/js/widget/number_widget.js | 65 ++--------------- .../assets.xml} | 2 + 6 files changed, 97 insertions(+), 60 deletions(-) create mode 100644 kpi_dashboard/static/src/js/widget/counter_widget.js create mode 100644 kpi_dashboard/static/src/js/widget/integer_widget.js rename kpi_dashboard/{views/webclient_templates.xml => templates/assets.xml} (87%) diff --git a/kpi_dashboard/__manifest__.py b/kpi_dashboard/__manifest__.py index 78e2b972..6a02a035 100644 --- a/kpi_dashboard/__manifest__.py +++ b/kpi_dashboard/__manifest__.py @@ -15,8 +15,8 @@ "wizards/kpi_dashboard_menu.xml", "security/security.xml", "security/ir.model.access.csv", + "templates/assets.xml", "views/kpi_menu.xml", - "views/webclient_templates.xml", "views/kpi_kpi.xml", "views/kpi_dashboard.xml", ], diff --git a/kpi_dashboard/models/kpi_kpi.py b/kpi_dashboard/models/kpi_kpi.py index b67e506a..3a9506c0 100644 --- a/kpi_dashboard/models/kpi_kpi.py +++ b/kpi_dashboard/models/kpi_kpi.py @@ -29,7 +29,8 @@ class KpiKpi(models.Model): args = fields.Char() kwargs = fields.Char() widget = fields.Selection( - [("number", "Number"), ("meter", "Meter"), ("graph", "Graph")], + [('integer', 'Integer'), ("number", "Number"), ("meter", "Meter"), + ('counter', 'Counter'), ("graph", "Graph")], required=True, default="number", ) diff --git a/kpi_dashboard/static/src/js/widget/counter_widget.js b/kpi_dashboard/static/src/js/widget/counter_widget.js new file mode 100644 index 00000000..6005298f --- /dev/null +++ b/kpi_dashboard/static/src/js/widget/counter_widget.js @@ -0,0 +1,14 @@ +odoo.define('kpi_dashboard.CounterWidget', function (require) { + "use strict"; + + var IntegerWidget = require('kpi_dashboard.IntegerWidget'); + var registry = require('kpi_dashboard.widget_registry'); + var field_utils = require('web.field_utils'); + + var CounterWidget = IntegerWidget.extend({ + shortList: [], + }); + + registry.add('counter', CounterWidget); + return CounterWidget; +}); diff --git a/kpi_dashboard/static/src/js/widget/integer_widget.js b/kpi_dashboard/static/src/js/widget/integer_widget.js new file mode 100644 index 00000000..7b9354d6 --- /dev/null +++ b/kpi_dashboard/static/src/js/widget/integer_widget.js @@ -0,0 +1,71 @@ +odoo.define('kpi_dashboard.IntegerWidget', function (require) { + "use strict"; + + var AbstractWidget = require('kpi_dashboard.AbstractWidget'); + var registry = require('kpi_dashboard.widget_registry'); + var field_utils = require('web.field_utils'); + + + var IntegerWidget = AbstractWidget.extend({ + template: 'kpi_dashboard.number', + digits: [3, 0], + shortList: [ + [1000000000000, 'T', [3, 1]], + [1000000000, 'G', [3, 1]], + [1000000, 'M', [3, 1]], + [1000, 'K', [3, 1]] + ], + shortNumber: function (num) { + var suffix = ''; + var shortened = false; + var digits = this.digits; + _.each(this.shortList, function (shortItem) { + if (!shortened && Math.abs(num) >= shortItem[0]) { + shortened = true; + suffix = shortItem[1]; + num = num / shortItem[0]; + digits = shortItem[2]; + } + }); + return field_utils.format.float(num, false, { + digits: digits}) + suffix; + }, + fillWidget: function (values) { + var widget = this.$el; + var value = values.value.value; + if (value === undefined) { + value = 0; + } + var item = widget.find('[data-bind="value"]'); + if (item) { + item.text(this.shortNumber(value)); + } + var previous = values.value.previous; + + var $change_rate = widget.find('.change-rate'); + if (previous === undefined) { + $change_rate.toggleClass('active', false); + } else { + var difference = 0; + if (previous !== 0) { + difference = field_utils.format.integer( + (100 * value / previous) - 100) + '%'; + } + $change_rate.toggleClass('active', true); + var $difference = widget.find('[data-bind="difference"]'); + $difference.text(difference); + var $arrow = widget.find('[data-bind="arrow"]'); + if (value < previous) { + $arrow.toggleClass('fa-arrow-up', false); + $arrow.toggleClass('fa-arrow-down', true); + } else { + $arrow.toggleClass('fa-arrow-up', true); + $arrow.toggleClass('fa-arrow-down', false); + } + } + }, + }); + + registry.add('integer', IntegerWidget); + return IntegerWidget; +}); diff --git a/kpi_dashboard/static/src/js/widget/number_widget.js b/kpi_dashboard/static/src/js/widget/number_widget.js index 987c612e..569f8cf2 100644 --- a/kpi_dashboard/static/src/js/widget/number_widget.js +++ b/kpi_dashboard/static/src/js/widget/number_widget.js @@ -1,72 +1,21 @@ odoo.define('kpi_dashboard.NumberWidget', function (require) { "use strict"; - var AbstractWidget = require('kpi_dashboard.AbstractWidget'); + var IntegerWidget = require('kpi_dashboard.IntegerWidget'); var registry = require('kpi_dashboard.widget_registry'); var field_utils = require('web.field_utils'); - - var NumberWidget = AbstractWidget.extend({ - template: 'kpi_dashboard.number', + var NumberWidget = IntegerWidget.extend({ + digits: [3, 1], shortNumber: function (num) { - if (Math.abs(num) >= 1000000000000) { - return field_utils.format.integer(num / 1000000000000, false, { - digits: [3, 1]}) + 'T'; - } - if (Math.abs(num) >= 1000000000) { - return field_utils.format.integer(num / 1000000000, false, { - digits: [3,1]}) + 'G'; - } - if (Math.abs(num) >= 1000000) { - return field_utils.format.integer(num / 1000000, false, { - digits: [3, 1]}) + 'M'; - } - if (Math.abs(num) >= 1000) { - return field_utils.format.float(num / 1000, false, { - digits: [3, 1]}) + 'K'; - } - if (Math.abs(num) >= 10) { + if (Math.abs(num) < 10) { return field_utils.format.float(num, false, { - digits: [3, 1]}); - } - return field_utils.format.float(num, false, { - digits: [3, 2]}); - }, - fillWidget: function (values) { - var widget = this.$el; - var value = values.value.value; - if (value === undefined) { - value = 0; - } - var item = widget.find('[data-bind="value"]'); - if (item) { - item.text(this.shortNumber(value)); - } - var previous = values.value.previous; - - var $change_rate = widget.find('.change-rate'); - if (previous === undefined) { - $change_rate.toggleClass('active', false); - } else { - var difference = 0; - if (previous !== 0) { - difference = field_utils.format.integer( - (100 * value / previous) - 100) + '%'; - } - $change_rate.toggleClass('active', true); - var $difference = widget.find('[data-bind="difference"]'); - $difference.text(difference); - var $arrow = widget.find('[data-bind="arrow"]'); - if (value < previous) { - $arrow.toggleClass('fa-arrow-up', false); - $arrow.toggleClass('fa-arrow-down', true); - } else { - $arrow.toggleClass('fa-arrow-up', true); - $arrow.toggleClass('fa-arrow-down', false); - } + digits: [3, 2]}); } + return this._super.apply(this, arguments) }, }); + registry.add('number', NumberWidget); return NumberWidget; }); diff --git a/kpi_dashboard/views/webclient_templates.xml b/kpi_dashboard/templates/assets.xml similarity index 87% rename from kpi_dashboard/views/webclient_templates.xml rename to kpi_dashboard/templates/assets.xml index e4263077..87b5e141 100644 --- a/kpi_dashboard/views/webclient_templates.xml +++ b/kpi_dashboard/templates/assets.xml @@ -14,7 +14,9 @@