diff --git a/src/components/side_panel/data_validation/dv_editor/dv_editor.ts b/src/components/side_panel/data_validation/dv_editor/dv_editor.ts index 343a3ed0c2..bc3d04d24e 100644 --- a/src/components/side_panel/data_validation/dv_editor/dv_editor.ts +++ b/src/components/side_panel/data_validation/dv_editor/dv_editor.ts @@ -10,6 +10,7 @@ import { DataValidationRule, DataValidationRuleData, SpreadsheetChildEnv, + UID, } from "../../../../types"; import { SelectionInput } from "../../../selection_input/selection_input"; import { Section } from "../../components/section/section"; @@ -39,14 +40,15 @@ export class DataValidationEditor extends Component }; state = useState({ rule: this.defaultDataValidationRule }); + private editingSheetId!: UID; setup() { + this.editingSheetId = this.env.model.getters.getActiveSheetId(); if (this.props.rule) { - const sheetId = this.env.model.getters.getActiveSheetId(); this.state.rule = { ...this.props.rule, ranges: this.props.rule.ranges.map((range) => - this.env.model.getters.getRangeString(range, sheetId) + this.env.model.getters.getRangeString(range, this.editingSheetId) ), }; this.state.rule.criterion.type = this.props.rule.criterion.type; @@ -90,7 +92,6 @@ export class DataValidationEditor extends Component const criterion = rule.criterion; const criterionEvaluator = dataValidationEvaluatorRegistry.get(criterion.type); - const sheetId = this.env.model.getters.getActiveSheetId(); const values = criterion.values .slice(0, criterionEvaluator.numberOfValues(criterion)) .map((value) => value?.trim()) @@ -98,9 +99,9 @@ export class DataValidationEditor extends Component .map((value) => canonicalizeContent(value, locale)); rule.criterion = { ...criterion, values }; return { - sheetId, + sheetId: this.editingSheetId, ranges: this.state.rule.ranges.map((xc) => - this.env.model.getters.getRangeDataFromXc(sheetId, xc) + this.env.model.getters.getRangeDataFromXc(this.editingSheetId, xc) ), rule, }; diff --git a/tests/data_validation/data_validation_generics_side_panel_component.test.ts b/tests/data_validation/data_validation_generics_side_panel_component.test.ts index 978139536c..dc88a7182d 100644 --- a/tests/data_validation/data_validation_generics_side_panel_component.test.ts +++ b/tests/data_validation/data_validation_generics_side_panel_component.test.ts @@ -1,7 +1,12 @@ import { Model } from "../../src"; import { DataValidationPanel } from "../../src/components/side_panel/data_validation/data_validation_panel"; import { UID } from "../../src/types"; -import { addDataValidation, updateLocale } from "../test_helpers/commands_helpers"; +import { + activateSheet, + addDataValidation, + createSheet, + updateLocale, +} from "../test_helpers/commands_helpers"; import { FR_LOCALE } from "../test_helpers/constants"; import { click, setInputValueAndTrigger, simulateClick } from "../test_helpers/dom_helper"; import { @@ -190,6 +195,29 @@ describe("data validation sidePanel component", () => { expect(getDataValidationRules(model, sheetId)).toMatchObject([{ id: "id1" }, { id: "id2" }]); }); + test("DV stays on original sheet when range is selected from another sheet and saved", async () => { + createSheet(model, { sheetId: "sh2" }); + + await simulateClick(".o-dv-add"); + await nextTick(); + setInputValueAndTrigger(".o-selection-input input", "A1:A5"); + await changeCriterionType("isValueInRange"); + + const rangeInput = fixture.querySelectorAll(".o-selection-input input")[1]; + activateSheet(model, "sh2"); + await setInputValueAndTrigger(rangeInput, "A1:A5"); + await simulateClick(".o-dv-save"); + + expect(getDataValidationRules(model, sheetId)).toEqual([ + { + id: expect.any(String), + criterion: { type: "isValueInRange", displayStyle: "arrow", values: ["A1:A5"] }, + ranges: ["A1:A5"], + }, + ]); + expect(getDataValidationRules(model, "sh2")).toHaveLength(0); + }); + describe("Locale", () => { test("Number preview is localized", async () => { updateLocale(model, FR_LOCALE);