From 1d78508b616a3f275833427afd42e18c73fb9079 Mon Sep 17 00:00:00 2001 From: dufresnedavid Date: Mon, 25 Jul 2016 12:18:39 -0400 Subject: [PATCH] Add web_graph_sort --- web_graph_sort/README.rst | 57 +++++++++ web_graph_sort/__init__.py | 4 + web_graph_sort/__openerp__.py | 22 ++++ web_graph_sort/static/description/icon.png | Bin 0 -> 8355 bytes .../static/src/css/web_graph_sort.css | 29 +++++ .../static/src/js/web_graph_sort.js | 112 ++++++++++++++++++ web_graph_sort/views/web_graph_sort.xml | 10 ++ 7 files changed, 234 insertions(+) create mode 100644 web_graph_sort/README.rst create mode 100644 web_graph_sort/__init__.py create mode 100644 web_graph_sort/__openerp__.py create mode 100644 web_graph_sort/static/description/icon.png create mode 100644 web_graph_sort/static/src/css/web_graph_sort.css create mode 100644 web_graph_sort/static/src/js/web_graph_sort.js create mode 100644 web_graph_sort/views/web_graph_sort.xml diff --git a/web_graph_sort/README.rst b/web_graph_sort/README.rst new file mode 100644 index 00000000..cfbfa110 --- /dev/null +++ b/web_graph_sort/README.rst @@ -0,0 +1,57 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============== +Web Graph Sort +============== + +This module allows to sort pivot tables. + +Usage +===== + +To use this module, you need to: + +#. Go to ... + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/web/8.0 + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* NDP Systèmes +* David Dufresne + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/web_graph_sort/__init__.py b/web_graph_sort/__init__.py new file mode 100644 index 00000000..e855da69 --- /dev/null +++ b/web_graph_sort/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# © 2015 NDP Systèmes (). +# © 2016 Savoir-faire Linux +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). diff --git a/web_graph_sort/__openerp__.py b/web_graph_sort/__openerp__.py new file mode 100644 index 00000000..96f6614c --- /dev/null +++ b/web_graph_sort/__openerp__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# © 2015 NDP Systèmes (). +# © 2016 Savoir-faire Linux +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': "Web Graph Sort", + 'version': '8.0.1.0.0', + 'author': ( + "NDP Systèmes, " + "Savoir-faire Linux, " + "Odoo Community Association (OCA)" + ), + 'license': 'AGPL-3', + 'category': 'Technical', + 'depends': ['web_graph'], + 'data': [ + 'views/web_graph_sort.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/web_graph_sort/static/description/icon.png b/web_graph_sort/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..243a194d7a4004b554eac576da04e86b36be22a3 GIT binary patch literal 8355 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. + © 2016 Savoir-faire Linux + License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +*/ + +openerp.web_graph_sort = function(instance) { + var _lt = openerp.web._lt; + var _t = openerp.web._t; + + var graph_events = instance.web_graph.Graph.events; + + instance.web_graph.Graph.include({ + + init: function(){ + this.events['click thead th.oe_sortable[data-id]'] = 'sort_by_column'; + this._super.apply(this, arguments); + }, + + draw_measure_row: function (measure_row) { + var $row = $('').append(''); + var self = this; + _.each(measure_row, function (cell) { + _.each(self.measure_list,function(item){ + if(item.string === cell.text) { + var data_id; + if ( + self.pivot.sort !== null && + self.pivot.sort[0].indexOf(item.field) >= 0 && + self.pivot.sort[0].indexOf('-') === -1 + ){ + data_id = "-" + item.field; + } + else { + data_id = item.field; + } + + var $cell = $('') + .addClass('measure_row') + .addClass('oe_sortable') + .attr('data-id', data_id) + .append("
" + cell.text + "
"); + + if (cell.is_bold) { + $cell.css('font-weight', 'bold'); + } + if (self.pivot.sort !== null && self.pivot.sort[0].indexOf(item.field) >= 0) { + $cell.addClass((self.pivot.sort[0].indexOf('-') === -1) ? "sortdown":"sortup"); + } + $row.append($cell); + } + }); + }); + this.$thead.append($row); + }, + + sort_by_column: function (e) { + e.stopPropagation(); + var $column = $(e.currentTarget); + var col_name = $column.data('id'); + this.pivot.sort = [col_name]; + this.pivot.update_data().then(this.proxy('display_data')); + } + }); + + instance.web_graph.PivotTable.include({ + sort : null, + get_groups: function (groupbys, fields, domain) { + var self = this; + var result = this.model.query(_.without(fields, '__count')); + if(this.sort !== null) { + result=result.order_by(this.sort); + } + return result.filter(domain) + .context(this.context) + .lazy(false) + .group_by(groupbys) + .then(function (groups) { + return groups.filter(function (group) { + return group.attributes.length > 0; + }).map(function (group) { + var attrs = group.attributes, + grouped_on = attrs.grouped_on instanceof Array ? attrs.grouped_on : [attrs.grouped_on], + raw_grouped_on = grouped_on.map(function (f) { + return self.raw_field(f); + }); + if (grouped_on.length === 1) { + attrs.value = [attrs.value]; + } + attrs.value = _.range(grouped_on.length).map(function (i) { + var grp = grouped_on[i], + field = self.fields[grp]; + + // This part was modified from original function in the web_graph module. + if (attrs.value[i] === false) { + return _t('Undefined'); + } else if (attrs.value[i] instanceof Array) { + return attrs.value[i][1]; + } else if (field && field.type === 'selection') { + var selected = _.where(field.selection, {0: attrs.value[i]})[0]; + return selected ? selected[1] : attrs.value[i]; + } + return attrs.value[i]; + }); + attrs.aggregates.__count = group.attributes.length; + attrs.grouped_on = raw_grouped_on; + return group; + }); + }); + } + }); +}; diff --git a/web_graph_sort/views/web_graph_sort.xml b/web_graph_sort/views/web_graph_sort.xml new file mode 100644 index 00000000..431624dd --- /dev/null +++ b/web_graph_sort/views/web_graph_sort.xml @@ -0,0 +1,10 @@ + + + + +