diff options
Diffstat (limited to 'addons/web/static/src/js/views/pivot/pivot_view.js')
| -rw-r--r-- | addons/web/static/src/js/views/pivot/pivot_view.js | 263 |
1 files changed, 138 insertions, 125 deletions
diff --git a/addons/web/static/src/js/views/pivot/pivot_view.js b/addons/web/static/src/js/views/pivot/pivot_view.js index 1b878cf3530..17cc478ba9b 100644 --- a/addons/web/static/src/js/views/pivot/pivot_view.js +++ b/addons/web/static/src/js/views/pivot/pivot_view.js @@ -1,137 +1,150 @@ odoo.define('web.PivotView', function (require) { -"use strict"; - -/** - * The Pivot View is a view that represents data in a 'pivot grid' form. It - * aggregates data on 2 dimensions and displays the result, allows the user to - * 'zoom in' data. - */ - -var AbstractView = require('web.AbstractView'); -var config = require('web.config'); -var core = require('web.core'); -var PivotModel = require('web.PivotModel'); -var PivotController = require('web.PivotController'); -var PivotRenderer = require('web.PivotRenderer'); - -var _t = core._t; -var _lt = core._lt; - -var controlPanelViewParameters = require('web.controlPanelViewParameters'); -var GROUPABLE_TYPES = controlPanelViewParameters.GROUPABLE_TYPES; - -var PivotView = AbstractView.extend({ - display_name: _lt('Pivot'), - icon: 'fa-table', - config: _.extend({}, AbstractView.prototype.config,{ - Model: PivotModel, - Controller: PivotController, - Renderer: PivotRenderer, - }), - viewType: 'pivot', - searchMenuTypes: ['filter', 'groupBy', 'timeRange', 'favorite'], + "use strict"; /** - * @override - * @param {Object} params + * The Pivot View is a view that represents data in a 'pivot grid' form. It + * aggregates data on 2 dimensions and displays the result, allows the user to + * 'zoom in' data. */ - init: function (viewInfo, params) { - var self = this; - this._super.apply(this, arguments); - - var activeMeasures = []; - var colGroupBys = []; - var rowGroupBys = []; - - var measures = {}; - var groupableFields = {}; - var widgets = {}; - - this.fields.__count = {string: _t("Count"), type: "integer"}; - _.each(this.fields, function (field, name) { - if ((name !== 'id') && (field.store === true)) { - if (_.contains(['integer', 'float', 'monetary'], field.type) || - _.contains(params.additionalMeasures, name)) { + + const AbstractView = require('web.AbstractView'); + const config = require('web.config'); + const core = require('web.core'); + const PivotModel = require('web.PivotModel'); + const PivotController = require('web.PivotController'); + const PivotRenderer = require('web.PivotRenderer'); + const RendererWrapper = require('web.RendererWrapper'); + + const _t = core._t; + const _lt = core._lt; + + const controlPanelViewParameters = require('web.controlPanelViewParameters'); + const GROUPABLE_TYPES = controlPanelViewParameters.GROUPABLE_TYPES; + + const PivotView = AbstractView.extend({ + display_name: _lt('Pivot'), + icon: 'fa-table', + config: Object.assign({}, AbstractView.prototype.config, { + Model: PivotModel, + Controller: PivotController, + Renderer: PivotRenderer, + }), + viewType: 'pivot', + searchMenuTypes: ['filter', 'groupBy', 'timeRange', 'favorite'], + + /** + * @override + * @param {Object} params + * @param {Array} params.additionalMeasures + */ + init: function (viewInfo, params) { + this._super.apply(this, arguments); + + const activeMeasures = []; // Store the defined active measures + const colGroupBys = []; // Store the defined group_by used on cols + const rowGroupBys = []; // Store the defined group_by used on rows + const measures = {}; // All the available measures + const groupableFields = {}; // The fields which can be used to group data + const widgets = {}; // Wigdets defined in the arch + const additionalMeasures = params.additionalMeasures || []; + + this.fields.__count = { string: _t("Count"), type: "integer" }; + + //Compute the measures and the groupableFields + Object.keys(this.fields).forEach(name => { + const field = this.fields[name]; + if (name !== 'id' && field.store === true) { + if (['integer', 'float', 'monetary'].includes(field.type) || additionalMeasures.includes(name)) { measures[name] = field; + } + if (GROUPABLE_TYPES.includes(field.type)) { + groupableFields[name] = field; + } + } + }); + measures.__count = { string: _t("Count"), type: "integer" }; + + + this.arch.children.forEach(field => { + let name = field.attrs.name; + + // Remove invisible fields from the measures + if (field.attrs.invisible && py.eval(field.attrs.invisible)) { + delete measures[name]; + return; + } + if (field.attrs.interval) { + name += ':' + field.attrs.interval; + } + if (field.attrs.widget) { + widgets[name] = field.attrs.widget; + } + // add active measures to the measure list. This is very rarely + // necessary, but it can be useful if one is working with a + // functional field non stored, but in a model with an overrided + // read_group method. In this case, the pivot view could work, and + // the measure should be allowed. However, be careful if you define + // a measure in your pivot view: non stored functional fields will + // probably not work (their aggregate will always be 0). + if (field.attrs.type === 'measure' && !(name in measures)) { + measures[name] = this.fields[name]; + } + if (field.attrs.string) { + measures[name].string = field.attrs.string; + } + if (field.attrs.type === 'measure' || 'operator' in field.attrs) { + activeMeasures.push(name); + measures[name] = this.fields[name]; + } + if (field.attrs.type === 'col') { + colGroupBys.push(name); } - if (_.contains(GROUPABLE_TYPES, field.type)) { - groupableFields[name] = field; + if (field.attrs.type === 'row') { + rowGroupBys.push(name); } + }); + if ((!activeMeasures.length) || this.arch.attrs.display_quantity) { + activeMeasures.splice(0, 0, '__count'); } - }); - measures.__count = {string: _t("Count"), type: "integer"}; - this.arch.children.forEach(function (field) { - var name = field.attrs.name; - if (field.attrs.interval) { - name += ':' + field.attrs.interval; - } - if (field.attrs.widget) { - widgets[name] = field.attrs.widget; - } - if (field.attrs.invisible && py.eval(field.attrs.invisible)) { - delete measures[name]; - return; - } - // add active measures to the measure list. This is very rarely - // necessary, but it can be useful if one is working with a - // functional field non stored, but in a model with an overrided - // read_group method. In this case, the pivot view could work, and - // the measure should be allowed. However, be careful if you define - // a measure in your pivot view: non stored functional fields will - // probably not work (their aggregate will always be 0). - if (field.attrs.type === 'measure' && !(name in measures)) { - measures[name] = self.fields[name]; - } - if (field.attrs.string) { - measures[name].string = field.attrs.string; - } - if (field.attrs.type === 'measure' || 'operator' in field.attrs) { - activeMeasures.push(name); - measures[name] = self.fields[name]; + this.loadParams.measures = activeMeasures; + this.loadParams.colGroupBys = config.device.isMobile ? [] : colGroupBys; + this.loadParams.rowGroupBys = rowGroupBys; + this.loadParams.fields = this.fields; + this.loadParams.default_order = params.default_order || this.arch.attrs.default_order; + this.loadParams.groupableFields = groupableFields; + + this.rendererParams.widgets = widgets; + this.rendererParams.disableLinking = this.arch.attrs.disable_linking; + + this.controllerParams.title = params.title || this.arch.attrs.string || _t("Untitled"); + this.controllerParams.measures = measures; + + // retrieve form and list view ids from the action to open those views + // when a data cell of the pivot view is clicked + this.controllerParams.views = [ + _findView(params.actionViews, 'list'), + _findView(params.actionViews, 'form'), + ]; + + function _findView(views, viewType) { + const view = views.find(view => { + return view.type === viewType; + }); + return [view ? view.viewID : false, viewType]; } - if (field.attrs.type === 'col') { - colGroupBys.push(name); - } - if (field.attrs.type === 'row') { - rowGroupBys.push(name); - } - }); - if ((!activeMeasures.length) || this.arch.attrs.display_quantity) { - activeMeasures = ['__count'].concat(activeMeasures); - } - - this.loadParams.measures = activeMeasures; - this.loadParams.colGroupBys = colGroupBys; - this.loadParams.rowGroupBys = rowGroupBys; - this.loadParams.fields = this.fields; - this.loadParams.default_order = params.default_order || this.arch.attrs.default_order; - if (config.device.isMobile) { - this.loadParams.colGroupBys = []; - } - - - this.rendererParams.widgets = widgets; - this.rendererParams.enableLinking = !this.arch.attrs.disable_linking; - - this.controllerParams.title = params.title || this.arch.attrs.string || _t("Untitled"); - this.controllerParams.measures = measures; - this.controllerParams.groupableFields = groupableFields; - // retrieve form and list view ids from the action to open those views - // when a data cell of the pivot view is clicked - this.controllerParams.views = [ - _findView(params.actionViews, 'list'), - _findView(params.actionViews, 'form'), - ]; - function _findView(views, viewType) { - var view = _.find(views, function (view) { - return view.type === viewType; - }); - return [view ? view.viewID : false, viewType]; - } - }, -}); - -return PivotView; + }, + + /** + * + * @override + */ + getRenderer(parent, state) { + state = Object.assign(state || {}, this.rendererParams); + return new RendererWrapper(null, state, this.config.Renderer); + }, + }); + + return PivotView; }); |
