Skip to content

Commit ce7412e

Browse files
committed
[REV][FIX] side_panel: cf rule range bugs
This reverts commit 4a956f3. the task was not fixing bugs (in the sens of tracebacks or corrupted behaviour) but rather seemingly backporting a feture introduced in later versions. Since the implementation was not accounting for every case and that it' not fixing any behaviour, just improving the user experience, it's better to cancel it. closes #3449 Signed-off-by: Rémi Rahir (rar) <rar@odoo.com>
1 parent e5adfb7 commit ce7412e

File tree

5 files changed

+21
-59
lines changed

5 files changed

+21
-59
lines changed

src/components/selection_input/selection_input.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export class SelectionInput extends Component<Props, SpreadsheetChildEnv> {
103103
: [];
104104
return ranges.map((range) => ({
105105
...range,
106-
isValidRange: range.xc !== "" && this.env.model.getters.isRangeValid(range.xc),
106+
isValidRange: range.xc === "" || this.env.model.getters.isRangeValid(range.xc),
107107
}));
108108
}
109109

src/components/side_panel/conditional_formatting/conditional_formatting.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Component, onWillUpdateProps, useExternalListener, useState } from "@odoo/owl";
22
import { DEFAULT_COLOR_SCALE_MIDPOINT_COLOR } from "../../../constants";
3-
import { colorNumberString } from "../../../helpers/index";
3+
import { colorNumberString, rangeReference } from "../../../helpers/index";
44
import { _t } from "../../../translation";
55
import {
66
CancelledReason,
@@ -381,6 +381,10 @@ export class ConditionalFormattingPanel extends Component<Props, SpreadsheetChil
381381
return this.env.model.getters.getConditionalFormats(this.env.model.getters.getActiveSheetId());
382382
}
383383

384+
get isRangeValid(): boolean {
385+
return this.state.errors.includes(CommandResult.EmptyRange);
386+
}
387+
384388
errorMessage(error: CancelledReason): string {
385389
return CfTerms.Errors[error] || CfTerms.Errors.Unexpected;
386390
}
@@ -442,10 +446,9 @@ export class ConditionalFormattingPanel extends Component<Props, SpreadsheetChil
442446

443447
saveConditionalFormat() {
444448
if (this.state.currentCF) {
445-
if (
446-
this.state.errors.includes(CommandResult.EmptyRange) ||
447-
this.state.errors.includes(CommandResult.InvalidRange)
448-
) {
449+
const invalidRanges = this.state.currentCF.ranges.some((xc) => !xc.match(rangeReference));
450+
if (invalidRanges) {
451+
this.state.errors = [CommandResult.InvalidRange];
449452
return;
450453
}
451454
const sheetId = this.env.model.getters.getActiveSheetId();
@@ -592,15 +595,6 @@ export class ConditionalFormattingPanel extends Component<Props, SpreadsheetChil
592595
}
593596

594597
onRangesChanged(ranges: string[]) {
595-
if (ranges.length === 0) {
596-
this.state.errors = [CommandResult.EmptyRange];
597-
return;
598-
}
599-
if (ranges.some((xc) => !this.env.model.getters.isRangeValid(xc))) {
600-
this.state.errors = [CommandResult.InvalidRange];
601-
return;
602-
}
603-
this.state.errors = [];
604598
if (this.state.currentCF) {
605599
this.state.currentCF.ranges = ranges;
606600
}

src/components/side_panel/conditional_formatting/conditional_formatting.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
<SelectionInput
3838
ranges="state.currentCF.ranges"
3939
class="'o-range'"
40+
isInvalid="isRangeValid"
4041
onSelectionChanged="(ranges) => this.onRangesChanged(ranges)"
4142
required="true"
4243
/>

tests/components/conditional_formatting.test.ts

Lines changed: 7 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@ import {
99
paste,
1010
setSelection,
1111
} from "../test_helpers/commands_helpers";
12-
import {
13-
setInputValueAndTrigger,
14-
simulateClick,
15-
triggerMouseEvent,
16-
} from "../test_helpers/dom_helper";
12+
import { setInputValueAndTrigger, triggerMouseEvent } from "../test_helpers/dom_helper";
1713
import {
1814
createColorScale,
1915
createEqualCF,
@@ -354,47 +350,20 @@ describe("UI of conditional formats", () => {
354350
});
355351

356352
test("cannot create a new CF with invalid range", async () => {
357-
await simulateClick(selectors.buttonAdd);
353+
triggerMouseEvent(selectors.buttonAdd, "click");
354+
await nextTick();
358355
await nextTick();
359356

360357
setInputValueAndTrigger(selectors.ruleEditor.range, "hello", "change");
361358

362359
const dispatch = spyDispatch(parent);
363360
// click save
364-
await simulateClick(selectors.buttonSave);
365-
expect(dispatch).not.toHaveBeenCalledWith("ADD_CONDITIONAL_FORMAT");
366-
const errorString = document.querySelector(selectors.error);
367-
expect(errorString!.textContent).toBe("The range is invalid");
368-
369-
setInputValueAndTrigger(selectors.ruleEditor.range, "s!A1", "change");
370-
await simulateClick(selectors.buttonSave);
371-
expect(dispatch).not.toHaveBeenCalledWith("ADD_CONDITIONAL_FORMAT");
372-
const errorString2 = document.querySelector(selectors.error);
373-
expect(errorString2!.textContent).toBe("The range is invalid");
374-
});
375-
376-
test("display error message if and only if invalid range", async () => {
377-
await simulateClick(selectors.buttonAdd);
361+
triggerMouseEvent(selectors.buttonSave, "click");
378362
await nextTick();
379-
const dispatch = spyDispatch(parent);
380-
381-
setInputValueAndTrigger(selectors.ruleEditor.range, "", "change");
382-
await simulateClick(selectors.buttonSave);
383363
expect(dispatch).not.toHaveBeenCalledWith("ADD_CONDITIONAL_FORMAT");
384364
const errorString = document.querySelector(selectors.error);
385-
expect(errorString!.textContent).toBe("A range needs to be defined");
386-
387-
setInputValueAndTrigger(selectors.ruleEditor.range, "A1", "change");
388-
await nextTick();
389-
expect(document.querySelector(selectors.error)).toBe(null);
390-
391-
setInputValueAndTrigger(selectors.ruleEditor.range, "s!A1", "change");
392-
await simulateClick(selectors.buttonSave);
393-
expect(dispatch).not.toHaveBeenCalledWith("ADD_CONDITIONAL_FORMAT");
394-
const errorString1 = document.querySelector(selectors.error);
395-
expect(errorString1!.textContent).toBe("The range is invalid");
365+
expect(errorString!.textContent).toBe("The range is invalid");
396366
});
397-
398367
test("displayed range is updated if range changes", async () => {
399368
const previews = document.querySelectorAll(selectors.listPreview);
400369
expect(previews[0].querySelector(selectors.description.range)!.textContent).toBe("A1:A2");
@@ -775,6 +744,8 @@ describe("UI of conditional formats", () => {
775744
await nextTick();
776745
setInputValueAndTrigger(selectors.ruleEditor.range, "", "change");
777746
await nextTick();
747+
triggerMouseEvent(selectors.buttonSave, "click");
748+
await nextTick();
778749
expect(errorMessages()).toEqual(["A range needs to be defined"]);
779750
expect(fixture.querySelector(selectors.ruleEditor.range)?.className).toContain("o-invalid");
780751
});

tests/components/selection_input.test.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -343,14 +343,10 @@ describe("Selection Input", () => {
343343
expect(fixture.querySelectorAll("input")[0].value).toBe("B1");
344344
expect(fixture.querySelectorAll("input")[0].getAttribute("style")).not.toBe("color: #000;");
345345
expect(fixture.querySelectorAll("input")[0].classList).not.toContain("o-invalid");
346-
await writeInput(0, "");
347-
expect(fixture.querySelectorAll("input")[0].value).toBe("");
348-
expect(fixture.querySelectorAll("input")[0].getAttribute("style")).toBe("color: #000;");
349-
expect(fixture.querySelectorAll("input")[0].classList).toContain("o-invalid");
350-
await writeInput(0, "s!A1");
351-
expect(fixture.querySelectorAll("input")[0].value).toBe("s!A1");
352-
expect(fixture.querySelectorAll("input")[0].getAttribute("style")).toBe("color: #000;");
353-
expect(fixture.querySelectorAll("input")[0].classList).toContain("o-invalid");
346+
});
347+
test("don't show red border initially", async () => {
348+
await createSelectionInput();
349+
expect(fixture.querySelectorAll("input")[0].classList).not.toContain("o-invalid");
354350
});
355351

356352
test("pressing and releasing control has no effect on future clicks", async () => {

0 commit comments

Comments
 (0)