Skip to content

Commit 220b8d5

Browse files
committed
[FIX] DV: Allow use of cellPosition-related functions in rules
Currently, one cannot use the functions ROW() or COLUMN() in the rules of their data validations. This revision provides the required cell position to the formula evaluation context to support the evaluation of those functions. closes #8182 Task: 5868662 X-original-commit: 9342ebc Signed-off-by: Adrien Minne (adrm) <adrm@odoo.com> Signed-off-by: Rémi Rahir (rar) <rar@odoo.com>
1 parent 6186e06 commit 220b8d5

File tree

3 files changed

+51
-19
lines changed

3 files changed

+51
-19
lines changed

packages/o-spreadsheet-engine/src/plugins/ui_core_views/evaluation_data_validation.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,12 @@ export class EvaluationDataValidationPlugin extends CoreViewPlugin {
241241
const evaluator = criterionEvaluatorRegistry.get(criterion.type);
242242

243243
const offset = this.getCellOffsetInRule(cellPosition, rule);
244-
const evaluatedCriterionValues = this.getEvaluatedCriterionValues(sheetId, offset, criterion);
244+
const evaluatedCriterionValues = this.getEvaluatedCriterionValues(
245+
sheetId,
246+
cellPosition,
247+
offset,
248+
criterion
249+
);
245250
if (evaluatedCriterionValues.some(isMultipleElementMatrix)) {
246251
return undefined;
247252
}
@@ -283,6 +288,7 @@ export class EvaluationDataValidationPlugin extends CoreViewPlugin {
283288

284289
private getEvaluatedCriterionValues(
285290
sheetId: UID,
291+
cellPosition: CellPosition,
286292
offset: Offset,
287293
criterion: DataValidationCriterion
288294
): (CellValue | Matrix<CellValue>)[] {
@@ -299,7 +305,7 @@ export class EvaluationDataValidationPlugin extends CoreViewPlugin {
299305
formula
300306
);
301307

302-
return this.getters.evaluateFormula(sheetId, translatedFormula);
308+
return this.getters.evaluateFormula(sheetId, translatedFormula, cellPosition);
303309
});
304310
}
305311
}

tests/conditional_formatting/conditional_formatting_plugin.test.ts

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2340,17 +2340,13 @@ describe("conditional formats types", () => {
23402340
setCellContent(model, "B1", "2");
23412341
setCellContent(model, "B2", "4");
23422342

2343-
model.dispatch("ADD_CONDITIONAL_FORMAT", {
2344-
sheetId,
2345-
ranges: toRangesData(sheetId, "A1:B2"),
2346-
cf: {
2347-
id: "1",
2348-
rule: {
2349-
type: "CellIsRule",
2350-
operator: "isEqual",
2351-
values: ["=ROW()*COLUMN()"],
2352-
style: { fillColor: "#00FF00" },
2353-
},
2343+
addCf(model, "A1:B2", {
2344+
id: "1",
2345+
rule: {
2346+
type: "CellIsRule",
2347+
operator: "isEqual",
2348+
values: ["=ROW()*COLUMN()"],
2349+
style: { fillColor: "#00FF00" },
23542350
},
23552351
});
23562352
expect(getStyle(model, "A1")).toEqual({ fillColor: "#00FF00" });
@@ -2363,15 +2359,15 @@ describe("conditional formats types", () => {
23632359
setCellContent(model, "A1", "1");
23642360
setCellContent(model, "A2", "2");
23652361

2366-
model.dispatch("ADD_CONDITIONAL_FORMAT", {
2367-
sheetId,
2368-
ranges: toRangesData(sheetId, "A1:A2"),
2369-
cf: createColorScale(
2362+
addCf(
2363+
model,
2364+
"A1:B2",
2365+
createColorScale(
23702366
"1",
23712367
{ type: "formula", color: 0xff0000, value: "=ROW()+1" },
23722368
{ type: "formula", color: 0x0000ff, value: "=ROW()+2" }
2373-
),
2374-
});
2369+
)
2370+
);
23752371
expect(getStyle(model, "A1")).toEqual({});
23762372
expect(getStyle(model, "A2")).toEqual({});
23772373
});

tests/data_validation/evaluation_data_validation_plugin.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
setCellContent,
88
setFormat,
99
} from "../test_helpers/commands_helpers";
10+
import { setGrid, toCellPosition } from "../test_helpers/helpers";
1011

1112
describe("Data validation evaluation", () => {
1213
let model: Model;
@@ -221,4 +222,33 @@ describe("Data validation evaluation", () => {
221222
setFormat(model, "A2", "mm/dd/yyyy");
222223
expect(model.getters.isDataValidationInvalid(A1)).toEqual(false);
223224
});
225+
226+
test("DV evaluation can be based on position-related formulas", () => {
227+
const sheetId = model.getters.getActiveSheetId();
228+
//prettier-ignore
229+
setGrid(model, {
230+
A1: "1", A2: "5", A3: "3", A4: "4",
231+
B3: "3", B4: "2", B5: "4", B6: "6",
232+
});
233+
234+
addDataValidation(model, "A1:A4,B3:B6", "id", { type: "isEqual", values: ["=ROW()"] });
235+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "A1"))).toEqual(false);
236+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "A2"))).toEqual(true);
237+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "A3"))).toEqual(false);
238+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "A4"))).toEqual(false);
239+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "B3"))).toEqual(false);
240+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "B4"))).toEqual(true);
241+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "B5"))).toEqual(true);
242+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "B6"))).toEqual(false);
243+
244+
addDataValidation(model, "A1:B6", "id", { type: "isEqual", values: ["=ROW()"] });
245+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "A1"))).toEqual(false);
246+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "A2"))).toEqual(true);
247+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "A3"))).toEqual(false);
248+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "A4"))).toEqual(false);
249+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "B3"))).toEqual(false);
250+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "B4"))).toEqual(true);
251+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "B5"))).toEqual(true);
252+
expect(model.getters.isDataValidationInvalid(toCellPosition(sheetId, "B6"))).toEqual(false);
253+
});
224254
});

0 commit comments

Comments
 (0)