209 lines
5.8 KiB
JavaScript
209 lines
5.8 KiB
JavaScript
|
/** @odoo-module */
|
||
|
|
||
|
import * as spreadsheet from "@odoo/o-spreadsheet";
|
||
|
import { waitForDataSourcesLoaded } from "@spreadsheet/../tests/utils/model";
|
||
|
|
||
|
const { toCartesian, toZone, lettersToNumber } = spreadsheet.helpers;
|
||
|
|
||
|
/**
|
||
|
* @typedef {import("@spreadsheet/global_filters/plugins/global_filters_core_plugin").GlobalFilter} GlobalFilter
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Select a cell
|
||
|
*/
|
||
|
export function selectCell(model, xc, sheetId = model.getters.getActiveSheetId()) {
|
||
|
const { col, row } = toCartesian(xc);
|
||
|
if (sheetId !== model.getters.getActiveSheetId()) {
|
||
|
model.dispatch("ACTIVATE_SHEET", { sheetIdTo: sheetId });
|
||
|
}
|
||
|
return model.selection.selectCell(col, row);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add a global filter and ensure the data sources are completely reloaded
|
||
|
* @param {Model} model
|
||
|
* @param {{filter: GlobalFilter}} filter
|
||
|
*/
|
||
|
export async function addGlobalFilter(model, filter, fieldMatchings = {}) {
|
||
|
const result = model.dispatch("ADD_GLOBAL_FILTER", { filter, ...fieldMatchings });
|
||
|
await waitForDataSourcesLoaded(model);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Remove a global filter and ensure the data sources are completely reloaded
|
||
|
*/
|
||
|
export async function removeGlobalFilter(model, id) {
|
||
|
const result = model.dispatch("REMOVE_GLOBAL_FILTER", { id });
|
||
|
await waitForDataSourcesLoaded(model);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Edit a global filter and ensure the data sources are completely reloaded
|
||
|
*/
|
||
|
export async function editGlobalFilter(model, filter) {
|
||
|
const result = model.dispatch("EDIT_GLOBAL_FILTER", { filter });
|
||
|
await waitForDataSourcesLoaded(model);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the value of a global filter and ensure the data sources are completely
|
||
|
* reloaded
|
||
|
*/
|
||
|
export async function setGlobalFilterValue(model, payload) {
|
||
|
const result = model.dispatch("SET_GLOBAL_FILTER_VALUE", payload);
|
||
|
await waitForDataSourcesLoaded(model);
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
export function moveGlobalFilter(model, id, delta) {
|
||
|
return model.dispatch("MOVE_GLOBAL_FILTER", { id, delta });
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the selection
|
||
|
*/
|
||
|
export function setSelection(model, xc) {
|
||
|
const zone = toZone(xc);
|
||
|
model.selection.selectZone({ cell: { col: zone.left, row: zone.top }, zone });
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Autofill from a zone to a cell
|
||
|
*/
|
||
|
export function autofill(model, from, to) {
|
||
|
setSelection(model, from);
|
||
|
model.dispatch("AUTOFILL_SELECT", toCartesian(to));
|
||
|
model.dispatch("AUTOFILL");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the content of a cell
|
||
|
*/
|
||
|
export function setCellContent(model, xc, content, sheetId = model.getters.getActiveSheetId()) {
|
||
|
model.dispatch("UPDATE_CELL", { ...toCartesian(xc), sheetId, content });
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the format of a cell
|
||
|
*/
|
||
|
export function setCellFormat(model, xc, format, sheetId = model.getters.getActiveSheetId()) {
|
||
|
model.dispatch("UPDATE_CELL", { ...toCartesian(xc), sheetId, format });
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the style of a cell
|
||
|
*/
|
||
|
export function setCellStyle(model, xc, style, sheetId = model.getters.getActiveSheetId()) {
|
||
|
model.dispatch("UPDATE_CELL", { ...toCartesian(xc), sheetId, style });
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Add columns
|
||
|
* @param {Model} model
|
||
|
* @param {"before"|"after"} position
|
||
|
* @param {string} column
|
||
|
* @param {number} quantity
|
||
|
* @param {UID} sheetId
|
||
|
*/
|
||
|
export function addColumns(
|
||
|
model,
|
||
|
position,
|
||
|
column,
|
||
|
quantity,
|
||
|
sheetId = model.getters.getActiveSheetId()
|
||
|
) {
|
||
|
return model.dispatch("ADD_COLUMNS_ROWS", {
|
||
|
sheetId,
|
||
|
dimension: "COL",
|
||
|
position,
|
||
|
base: lettersToNumber(column),
|
||
|
quantity,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delete columns
|
||
|
* @param {Model} model
|
||
|
* @param {string[]} columns
|
||
|
* @param {UID} sheetId
|
||
|
*/
|
||
|
export function deleteColumns(model, columns, sheetId = model.getters.getActiveSheetId()) {
|
||
|
return model.dispatch("REMOVE_COLUMNS_ROWS", {
|
||
|
sheetId,
|
||
|
dimension: "COL",
|
||
|
elements: columns.map(lettersToNumber),
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/** Create a test chart in the active sheet*/
|
||
|
export function createBasicChart(model, chartId, sheetId = model.getters.getActiveSheetId()) {
|
||
|
model.dispatch("CREATE_CHART", {
|
||
|
id: chartId,
|
||
|
position: { x: 0, y: 0 },
|
||
|
sheetId: sheetId,
|
||
|
definition: {
|
||
|
title: "test",
|
||
|
dataSets: ["A1"],
|
||
|
type: "bar",
|
||
|
background: "#fff",
|
||
|
verticalAxisPosition: "left",
|
||
|
legendPosition: "top",
|
||
|
stackedBar: false,
|
||
|
},
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/** Create a test scorecard chart in the active sheet*/
|
||
|
export function createScorecardChart(model, chartId, sheetId = model.getters.getActiveSheetId()) {
|
||
|
model.dispatch("CREATE_CHART", {
|
||
|
id: chartId,
|
||
|
position: { x: 0, y: 0 },
|
||
|
sheetId: sheetId,
|
||
|
definition: {
|
||
|
title: "test",
|
||
|
keyValue: "A1",
|
||
|
type: "scorecard",
|
||
|
background: "#fff",
|
||
|
baselineColorDown: "#DC6965",
|
||
|
baselineColorUp: "#00A04A",
|
||
|
baselineMode: "absolute",
|
||
|
},
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/** Create a test scorecard chart in the active sheet*/
|
||
|
export function createGaugeChart(model, chartId, sheetId = model.getters.getActiveSheetId()) {
|
||
|
model.dispatch("CREATE_CHART", {
|
||
|
id: chartId,
|
||
|
position: { x: 0, y: 0 },
|
||
|
sheetId: sheetId,
|
||
|
definition: {
|
||
|
title: "test",
|
||
|
type: "gauge",
|
||
|
background: "#fff",
|
||
|
dataRange: "A1",
|
||
|
sectionRule: {
|
||
|
rangeMin: "0",
|
||
|
rangeMax: "100",
|
||
|
colors: {
|
||
|
lowerColor: "#112233",
|
||
|
middleColor: "#445566",
|
||
|
upperColor: "#778899",
|
||
|
},
|
||
|
lowerInflectionPoint: {
|
||
|
type: "number",
|
||
|
value: "25",
|
||
|
},
|
||
|
upperInflectionPoint: {
|
||
|
type: "number",
|
||
|
value: "85",
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
});
|
||
|
}
|