odoo.define('web_grid.GridView', function (require) { "use strict"; var AbstractView = require('web.AbstractView'); var config = require('web.config'); var core = require('web.core'); var GridModel = require('web_grid.GridModel'); var GridController = require('web_grid.GridController'); var GridRenderer = require('web_grid.GridRenderer'); var viewRegistry = require('web.view_registry'); var pyUtils = require('web.py_utils'); const RendererWrapper = require('web.RendererWrapper'); var _t = core._t; var _lt = core._lt; var GridView = AbstractView.extend({ display_name: _lt('Grid'), mobile_friendly: true, icon: 'fa fa-th', config: _.extend({}, AbstractView.prototype.config, { Model: GridModel, Controller: GridController, Renderer: GridRenderer, }), viewType: 'grid', init: function (viewInfo, params) { var self = this; this._super.apply(this, arguments); var arch = this.arch; var fields = this.fields; var rowFields = []; var sectionField, colField, cellField, ranges, cellComponent, cellComponentOptions, measureLabel, readonlyField; _.each(arch.children, function (child) { if (child.tag === 'field') { if (child.attrs.type === 'row') { if (child.attrs.section === '1' && !sectionField) { sectionField = child.attrs.name; } rowFields.push(child.attrs.name); } if (child.attrs.type === 'col') { colField = child.attrs.name; ranges = self._extract_ranges(child, params.context); } if (child.attrs.type === 'measure') { cellField = child.attrs.name; cellComponent = child.attrs.widget; if (child.attrs.options) { cellComponentOptions = JSON.parse(child.attrs.options.replace(/'/g, '"')); } measureLabel = child.attrs.string; } if (child.attrs.type === 'readonly') { readonlyField = child.attrs.name; } } }); // model this.loadParams.ranges = ranges; let default_range_name = config.device.isMobile ? 'day' : ''; ranges.forEach(range => { if (range['name'] === 'week' && !config.device.isMobile) { default_range_name = range['name']; } }) let contextRangeName = params.context.grid_range || default_range_name; var contextRange = contextRangeName && _.findWhere(ranges, {name: contextRangeName}); this.loadParams.fields = this.fields; this.loadParams.currentRange = contextRange || ranges[0]; this.loadParams.rowFields = rowFields; this.loadParams.sectionField = sectionField; this.loadParams.colField = colField; this.loadParams.cellField = cellField; this.loadParams.groupedBy = params.groupBy; this.loadParams.readonlyField = readonlyField; // renderer this.rendererParams.canCreate = this.controllerParams.activeActions.create; this.rendererParams.fields = fields; this.rendererParams.measureLabel = measureLabel; this.rendererParams.editableCells = !!(this.controllerParams.activeActions.edit && arch.attrs.adjustment); this.rendererParams.cellComponent = cellComponent; this.rendererParams.cellComponentOptions = cellComponentOptions; this.rendererParams.hideLineTotal = !!JSON.parse(arch.attrs.hide_line_total || '0'); this.rendererParams.hideColumnTotal = !!JSON.parse(arch.attrs.hide_column_total || '0'); this.rendererParams.hasBarChartTotal = !!JSON.parse(arch.attrs.barchart_total || '0'); this.rendererParams.createInline = !!JSON.parse(arch.attrs.create_inline || 'false'); this.rendererParams.displayEmpty = !!JSON.parse(arch.attrs.display_empty || 'false'); this.rendererParams.noContentHelp = (!this.rendererParams.displayEmpty && this.rendererParams.noContentHelp) || ""; // controller this.controllerParams.formViewID = false; this.controllerParams.listViewID = false; _.each(params.actionViews, function (view) { if (view.type === 'form') { self.controllerParams.formViewID = view.viewID; } if (view.type === 'list') { self.controllerParams.listViewID = view.viewID; } }); this.controllerParams.context = params.context; this.controllerParams.ranges = ranges; this.controllerParams.currentRange = this.loadParams.currentRange.name; this.controllerParams.navigationButtons = arch.children .filter(function (c) { return c.tag === 'button'; }) .map(function (c) { return c.attrs; }); this.controllerParams.adjustment = arch.attrs.adjustment; this.controllerParams.adjustName = arch.attrs.adjust_name; this.controllerParams.createInline = this.rendererParams.createInline; this.controllerParams.displayEmpty = this.rendererParams.displayEmpty; }, //-------------------------------------------------------------------------- // Public //-------------------------------------------------------------------------- /** * @override */ getRenderer(parent, state) { state = Object.assign({}, state, this.rendererParams); return new RendererWrapper(null, this.config.Renderer, state); }, //-------------------------------------------------------------------------- // Private //-------------------------------------------------------------------------- /** * Extract the range to display on the view, and filter * them according they should be visible or not (attribute 'invisible') * * @private * @param {node} col_node - the node of 'col' in grid view arch definition * @param {Object} context - the context used to instanciate the view * @returns {Array<{name: string, string: string, span: string, step: string}>} */ _extract_ranges: function(col_node, context) { let ranges = []; const pyevalContext = py.dict.fromJSON(context || {}); for (const range of col_node.children.map(node => node.attrs)) { if (range.invisible && pyUtils.py_eval(range.invisible, { 'context': pyevalContext })) { continue; } ranges.push(range); } if (config.device.isMobile && !ranges.find(r => r.name === 'day')) { ranges.unshift({ name: 'day', string: _t('Day'), span: 'day', step: 'day', }); } return ranges; }, }); viewRegistry.add('grid', GridView); return GridView; });