Skip to content

Commit 9342ebc

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 #7856 Task: 5868662 Signed-off-by: Adrien Minne (adrm) <adrm@odoo.com>
1 parent b87a972 commit 9342ebc

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

src/plugins/ui_core_views/evaluation_data_validation.ts

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

244244
const offset = this.getCellOffsetInRule(cellPosition, rule);
245-
const evaluatedCriterionValues = this.getEvaluatedCriterionValues(sheetId, offset, criterion);
245+
const evaluatedCriterionValues = this.getEvaluatedCriterionValues(
246+
sheetId,
247+
cellPosition,
248+
offset,
249+
criterion
250+
);
246251
if (evaluatedCriterionValues.some(isMultipleElementMatrix)) {
247252
return undefined;
248253
}
@@ -271,6 +276,7 @@ export class EvaluationDataValidationPlugin extends CoreViewPlugin {
271276

272277
private getEvaluatedCriterionValues(
273278
sheetId: UID,
279+
cellPosition: CellPosition,
274280
offset: Offset,
275281
criterion: DataValidationCriterion
276282
): (CellValue | Matrix<CellValue>)[] {
@@ -287,7 +293,7 @@ export class EvaluationDataValidationPlugin extends CoreViewPlugin {
287293
formula.tokens
288294
);
289295

290-
return this.getters.evaluateFormula(sheetId, translatedFormula);
296+
return this.getters.evaluateFormula(sheetId, translatedFormula, cellPosition);
291297
});
292298
}
293299
}

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)