When the side panel of a pivot is opened while the side panel of another pivot is already open, the datasource of the first pivot is used instead of the datasource of the second pivot. This can lead to tracebacks, or to wrong data being displayed. closes odoo/odoo#138338 Task: 3463289 X-original-commit: b6df2d807f7ffe0f0f89d894307e31d779f138e2 Related: odoo/enterprise#48775 Signed-off-by: Lucas Lefèvre (lul) <lul@odoo.com> Signed-off-by: Adrien Minne (adrm) <adrm@odoo.com>
82 lines
2.5 KiB
JavaScript
82 lines
2.5 KiB
JavaScript
/** @odoo-module */
|
|
|
|
import { PivotArchParser } from "@web/views/pivot/pivot_arch_parser";
|
|
import { nextTick } from "@web/../tests/helpers/utils";
|
|
|
|
import PivotDataSource from "@spreadsheet/pivot/pivot_data_source";
|
|
import { getBasicServerData } from "./data";
|
|
import { createModelWithDataSource, waitForDataSourcesLoaded } from "./model";
|
|
|
|
/** @typedef {import("@spreadsheet/o_spreadsheet/o_spreadsheet").Model} Model */
|
|
|
|
/**
|
|
* @param {Model} model
|
|
* @param {object} params
|
|
* @param {string} params.arch
|
|
* @param {[number, number]} [params.anchor]
|
|
*/
|
|
export async function insertPivotInSpreadsheet(model, params) {
|
|
const archInfo = new PivotArchParser().parse(params.arch);
|
|
const definition = {
|
|
metaData: {
|
|
colGroupBys: archInfo.colGroupBys,
|
|
rowGroupBys: archInfo.rowGroupBys,
|
|
activeMeasures: archInfo.activeMeasures,
|
|
resModel: params.resModel || "partner",
|
|
},
|
|
searchParams: {
|
|
domain: [],
|
|
context: {},
|
|
groupBy: [],
|
|
orderBy: [],
|
|
},
|
|
name: "Partner Pivot",
|
|
};
|
|
const pivotId = model.getters.getNextPivotId();
|
|
const dataSourceId = model.getters.getPivotDataSourceId(pivotId);
|
|
const dataSource = model.config.custom.dataSources.add(
|
|
dataSourceId,
|
|
PivotDataSource,
|
|
definition
|
|
);
|
|
await dataSource.load();
|
|
const { cols, rows, measures, rowTitle } = dataSource.getTableStructure().export();
|
|
const table = {
|
|
cols,
|
|
rows,
|
|
measures,
|
|
rowTitle,
|
|
};
|
|
const [col, row] = params.anchor || [0, 0];
|
|
model.dispatch("INSERT_PIVOT", {
|
|
id: model.getters.getNextPivotId(),
|
|
sheetId: model.getters.getActiveSheetId(),
|
|
col,
|
|
row,
|
|
table,
|
|
definition,
|
|
});
|
|
await nextTick();
|
|
}
|
|
|
|
/**
|
|
* @param {object} params
|
|
* @param {string} [params.arch]
|
|
* @param {object} [params.serverData]
|
|
* @param {function} [params.mockRPC]
|
|
* @returns {Promise<{ model: Model, env: object}>}
|
|
*/
|
|
export async function createSpreadsheetWithPivot(params = {}) {
|
|
const serverData = params.serverData || getBasicServerData();
|
|
const model = await createModelWithDataSource({
|
|
mockRPC: params.mockRPC,
|
|
serverData: params.serverData,
|
|
});
|
|
const arch = params.arch || serverData.views["partner,false,pivot"];
|
|
await insertPivotInSpreadsheet(model, { arch });
|
|
const env = model.config.custom.env;
|
|
env.model = model;
|
|
await waitForDataSourcesLoaded(model);
|
|
return { model, env };
|
|
}
|