diff --git a/addons/web/static/src/views/graph/graph_arch_parser.js b/addons/web/static/src/views/graph/graph_arch_parser.js index a3f1180b5ec..fa128d5b658 100644 --- a/addons/web/static/src/views/graph/graph_arch_parser.js +++ b/addons/web/static/src/views/graph/graph_arch_parser.js @@ -5,15 +5,15 @@ import { GROUPABLE_TYPES } from "@web/search/utils/misc"; import { XMLParser } from "@web/core/utils/xml"; import { archParseBoolean } from "../helpers/utils"; -export const MODES = ["bar", "line", "pie"]; -export const ORDERS = ["ASC", "DESC", null]; +const MODES = ["bar", "line", "pie"]; +const ORDERS = ["ASC", "DESC", null]; export class GraphArchParser extends XMLParser { parse(arch, fields = {}) { const archInfo = { fields, fieldAttrs: {}, groupBy: [] }; this.visitXML(arch, (node) => { switch (node.tagName) { - case "graph": + case "graph": { if (node.hasAttribute("disable_linking")) { archInfo.disableLinking = archParseBoolean( node.getAttribute("disable_linking") @@ -35,7 +35,8 @@ export class GraphArchParser extends XMLParser { archInfo.title = title; } break; - case "field": + } + case "field": { let fieldName = node.getAttribute("name"); // exists (rng validation) if (fieldName === "id") { break; @@ -73,6 +74,7 @@ export class GraphArchParser extends XMLParser { } } break; + } } }); return archInfo; diff --git a/addons/web/static/src/views/graph/graph_renderer.js b/addons/web/static/src/views/graph/graph_renderer.js index e8a2d840372..3de2cac8d87 100644 --- a/addons/web/static/src/views/graph/graph_renderer.js +++ b/addons/web/static/src/views/graph/graph_renderer.js @@ -251,12 +251,11 @@ export class GraphRenderer extends Component { * @returns {Object} */ getLegendOptions() { - const { display, mode } = this.props.metaData; + const { mode } = this.props.metaData; const { data } = this.props; const refLength = mode === "pie" ? data.labels.length : data.datasets.length; - const displayLegend = "legend" in display ? display.legend : true; const legendOptions = { - display: refLength <= 20 && displayLegend, + display: refLength <= 20, position: "top", onHover: this.onlegendHover.bind(this), onLeave: this.onLegendLeave.bind(this), @@ -403,7 +402,7 @@ export class GraphRenderer extends Component { getScaleOptions() { const { allIntegers, - display, + displayScaleLabels, fields, groupBy, measure, @@ -413,7 +412,6 @@ export class GraphRenderer extends Component { if (mode === "pie") { return {}; } - const displayScaleLabels = "scaleLabels" in display ? display.scaleLabels : true; const xAxe = { type: "category", scaleLabel: { diff --git a/addons/web/static/src/views/graph/graph_view.js b/addons/web/static/src/views/graph/graph_view.js index 1f1f4636007..6e0d5ee0ee2 100644 --- a/addons/web/static/src/views/graph/graph_view.js +++ b/addons/web/static/src/views/graph/graph_view.js @@ -3,7 +3,7 @@ import { _lt } from "@web/core/l10n/translation"; import { ControlPanel } from "@web/search/control_panel/control_panel"; import { SearchPanel } from "@web/search/search_panel/search_panel"; -import { GraphArchParser, MODES, ORDERS } from "./graph_arch_parser"; +import { GraphArchParser } from "./graph_arch_parser"; import { GraphModel } from "./graph_model"; import { GraphRenderer } from "./graph_renderer"; import { GroupByMenu } from "@web/search/group_by_menu/group_by_menu"; @@ -17,37 +17,31 @@ const viewRegistry = registry.category("views"); const { Component } = owl; -const KEYS = [ - "additionalMeasures", - "disableLinking", - "display", - "fields", - "fieldAttrs", - "groupBy", - "measure", - "mode", - "order", - "resModel", - "stacked", - "title", -]; - export class GraphView extends Component { setup() { this.actionService = useService("action"); let modelParams; - if (this.props.state && this.props.state.metaData) { - // check this (dashboard testss) + if (this.props.state) { modelParams = this.props.state.metaData; } else { const { arch, fields } = this.props; const parser = new this.constructor.ArchParser(); const archInfo = parser.parse(arch, fields); - modelParams = {}; - for (const key of KEYS) { - modelParams[key] = key in archInfo ? archInfo[key] : this.props[key]; - } + modelParams = { + additionalMeasures: this.props.additionalMeasures, + disableLinking: Boolean(archInfo.disableLinking), + displayScaleLabels: this.props.displayScaleLabels, + fieldAttrs: archInfo.fieldAttrs, + fields: this.props.fields, + groupBy: archInfo.groupBy, + measure: archInfo.measure || "__count", + mode: archInfo.mode || "bar", + order: archInfo.order || null, + resModel: this.props.resModel, + stacked: "stacked" in archInfo ? archInfo.stacked : true, + title: archInfo.title || this.env._t("Untitled"), + }; } this.model = useModel(this.constructor.Model, modelParams); @@ -142,24 +136,15 @@ GraphView.components = { ControlPanel, GroupByMenu, Renderer: GraphRenderer, Sea GraphView.defaultProps = { additionalMeasures: [], - disableLinking: false, - display: {}, - measure: "__count", - mode: "bar", - order: null, - stacked: true, + displayGroupByMenu: false, + displayScaleLabels: true, }; GraphView.props = { ...standardViewProps, additionalMeasures: { type: Array, elements: String, optional: true }, - disableLinking: { type: Boolean, optional: true }, - display: { type: Object, optional: true }, - measure: { type: String, optional: true }, - mode: { validate: (m) => MODES.includes(m), optional: true }, - order: { validate: (o) => ORDERS.includes(o), optional: true }, - stacked: { type: Boolean, optional: true }, - title: { type: String, optional: true }, + displayGroupByMenu: { type: Boolean, optional: true }, + displayScaleLabels: { type: Boolean, optional: true }, }; GraphView.type = "graph"; diff --git a/addons/web/static/src/views/graph/graph_view.xml b/addons/web/static/src/views/graph/graph_view.xml index dcd4f870bca..16e4d8ef03b 100644 --- a/addons/web/static/src/views/graph/graph_view.xml +++ b/addons/web/static/src/views/graph/graph_view.xml @@ -8,7 +8,7 @@ - + diff --git a/addons/web/static/src/views/pivot/pivot_view.js b/addons/web/static/src/views/pivot/pivot_view.js index 898b98c1c04..4b647a2aad9 100644 --- a/addons/web/static/src/views/pivot/pivot_view.js +++ b/addons/web/static/src/views/pivot/pivot_view.js @@ -45,7 +45,7 @@ export class PivotView extends Component { fieldAttrs: archInfo.fieldAttrs, resModel: this.props.resModel, rowGroupBys: archInfo.rowGroupBys, - title: this.props.title || archInfo.title || this.env._t("Untitled"), + title: archInfo.title || this.env._t("Untitled"), widgets: archInfo.widgets, }; } @@ -162,12 +162,9 @@ PivotView.components = { ControlPanel, SearchPanel, Renderer: PivotRenderer }; PivotView.props = { ...standardViewProps, additionalMeasures: { type: Array, elements: String, optional: 1 }, - display: { type: Object, optional: 1 }, - title: { type: String, optional: 1 }, }; PivotView.defaultProps = { additionalMeasures: [], - display: {}, }; PivotView.Model = PivotModel; diff --git a/addons/web/static/src/views/view.js b/addons/web/static/src/views/view.js index 345a817ff90..2a7bb73c24f 100644 --- a/addons/web/static/src/views/view.js +++ b/addons/web/static/src/views/view.js @@ -87,6 +87,7 @@ const STANDARD_PROPS = new Set([ "noContentHelp", "breadcrumbs", + "display", "viewSwitcherEntries", "globalState", diff --git a/addons/web/static/tests/views/graph_view_tests.js b/addons/web/static/tests/views/graph_view_tests.js index f938b9f0562..696b6ea6f38 100644 --- a/addons/web/static/tests/views/graph_view_tests.js +++ b/addons/web/static/tests/views/graph_view_tests.js @@ -1,16 +1,17 @@ /** @odoo-module **/ import { BORDER_WHITE, DEFAULT_BG } from "@web/views/graph/colors"; -import { click, makeDeferred, nextTick, triggerEvent } from "@web/../tests/helpers/utils"; -import { createWebClient, doAction } from "@web/../tests/webclient/helpers"; import { dialogService } from "@web/core/dialog/dialog_service"; import { GraphArchParser } from "@web/views/graph/graph_arch_parser"; -import { makeView } from "./helpers"; import { registry } from "@web/core/registry"; -import { setupControlPanelServiceRegistry } from "@web/../tests/search/helpers"; +import { makeView } from "./helpers"; +import { click, makeDeferred, nextTick, triggerEvent } from "@web/../tests/helpers/utils"; +import { makeFakeLocalizationService } from "@web/../tests/helpers/mock_services"; +import { createWebClient, doAction } from "@web/../tests/webclient/helpers"; import { editFavoriteName, saveFavorite, + setupControlPanelServiceRegistry, switchView, toggleFavoriteMenu, toggleFilterMenu, @@ -2066,7 +2067,7 @@ QUnit.module("Views", (hooks) => { type: "graph", resModel: "foo", arch: ` - + `, @@ -2864,6 +2865,7 @@ QUnit.module("Views", (hooks) => { QUnit.test('graph view with attribute disable_linking="1"', async function (assert) { assert.expect(4); + serviceRegistry.add("localization", makeFakeLocalizationService()); serviceRegistry.add( "action", { diff --git a/addons/web/static/tests/views/pivot_view_tests.js b/addons/web/static/tests/views/pivot_view_tests.js index 6a3f7ffebfc..2e19d60e9ae 100644 --- a/addons/web/static/tests/views/pivot_view_tests.js +++ b/addons/web/static/tests/views/pivot_view_tests.js @@ -398,7 +398,6 @@ QUnit.module("Views", (hooks) => { patchWithCleanup(session, { user_context: { userContextKey: true }, }); - const fakeActionService = { start() { return { @@ -432,12 +431,11 @@ QUnit.module("Views", (hooks) => { resModel: "partner", serverData, arch: ` - + `, context: { someKey: true, search_default_test: 3 }, - title: "Partners", // FIXME props ignored views: [ [2, "form"], [5, "kanban"], @@ -666,7 +664,6 @@ QUnit.module("Views", (hooks) => { `, context: { search_default_date_filter: true }, - title: "Partners", }); assert.hasClass( @@ -715,7 +712,6 @@ QUnit.module("Views", (hooks) => { `, context: { search_default_date_filter: true }, - title: "Partners", }); await toggleComparisonMenu(pivot);