From 38638a48e6a798f5311994a391be175e8998a4d5 Mon Sep 17 00:00:00 2001 From: "Adrien Minne (adrm)" Date: Thu, 12 Sep 2024 14:37:53 +0200 Subject: [PATCH 1/2] [IMP] grid: add F9 shortcut This commit adds the F9 shortcut to the grid component to refresh the evaluation. Task: 4080797 --- src/components/grid/grid.ts | 1 + tests/grid/grid_component.test.ts | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/grid/grid.ts b/src/components/grid/grid.ts index 62d768062f..02d93d61ff 100644 --- a/src/components/grid/grid.ts +++ b/src/components/grid/grid.ts @@ -257,6 +257,7 @@ export class Grid extends Component { "Ctrl+Z": () => this.env.model.dispatch("REQUEST_UNDO"), "Ctrl+Y": () => this.env.model.dispatch("REQUEST_REDO"), F4: () => this.env.model.dispatch("REQUEST_REDO"), + F9: () => this.env.model.dispatch("EVALUATE_CELLS"), "Ctrl+B": () => this.env.model.dispatch("SET_FORMATTING", { sheetId: this.env.model.getters.getActiveSheetId(), diff --git a/tests/grid/grid_component.test.ts b/tests/grid/grid_component.test.ts index 87353cdfb9..dc459c584a 100644 --- a/tests/grid/grid_component.test.ts +++ b/tests/grid/grid_component.test.ts @@ -72,7 +72,13 @@ import { getSelectionAnchorCellXc, getStyle, } from "../test_helpers/getters_helpers"; -import { mockChart, mountSpreadsheet, nextTick, typeInComposerGrid } from "../test_helpers/helpers"; +import { + mockChart, + mountSpreadsheet, + nextTick, + spyModelDispatch, + typeInComposerGrid, +} from "../test_helpers/helpers"; import { mockGetBoundingClientRect } from "../test_helpers/mock_helpers"; jest.mock("../../src/components/composer/content_editable_helper", () => require("../__mocks__/content_editable_helper") @@ -785,6 +791,12 @@ describe("Grid component", () => { await simulateClick(".o-filter-icon"); expect(fixture.querySelectorAll(".o-filter-menu")).toHaveLength(1); }); + + test("F9 triggers a re-evaluation of the grid", () => { + const spyDispatch = spyModelDispatch(model); + keyDown({ key: "F9" }); + expect(spyDispatch).toHaveBeenCalledWith("EVALUATE_CELLS"); + }); }); describe("Grid Scroll", () => { From f7ad1e3b17367052d6057e8ae452f61440abd50e Mon Sep 17 00:00:00 2001 From: "Adrien Minne (adrm)" Date: Thu, 12 Sep 2024 15:45:41 +0200 Subject: [PATCH 2/2] [IMP] pivot: persist defer update Add the defer update option to the pivot core definition so it is persisted when re-opening the side panel. Task: 4080797 --- .../pivot_side_panel/pivot_side_panel_store.ts | 9 +++++++-- src/types/pivot.ts | 1 + .../spreadsheet_pivot_side_panel.test.ts | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/components/side_panel/pivot/pivot_side_panel/pivot_side_panel_store.ts b/src/components/side_panel/pivot/pivot_side_panel/pivot_side_panel_store.ts index 6a61831665..623f0e7fe9 100644 --- a/src/components/side_panel/pivot/pivot_side_panel/pivot_side_panel_store.ts +++ b/src/components/side_panel/pivot/pivot_side_panel/pivot_side_panel_store.ts @@ -17,10 +17,12 @@ import { export class PivotSidePanelStore extends SpreadsheetStore { mutators = ["reset", "deferUpdates", "applyUpdate", "discardPendingUpdate", "update"] as const; - private updatesAreDeferred: boolean = false; + private updatesAreDeferred: boolean; private draft: PivotCoreDefinition | null = null; constructor(get: Get, private pivotId: UID) { super(get); + this.updatesAreDeferred = + this.getters.getPivotCoreDefinition(this.pivotId).deferUpdates ?? false; } handle(cmd: Command) { @@ -121,10 +123,13 @@ export class PivotSidePanelStore extends SpreadsheetStore { } deferUpdates(shouldDefer: boolean) { - this.updatesAreDeferred = shouldDefer; if (shouldDefer === false && this.draft) { + this.draft.deferUpdates = false; this.applyUpdate(); + } else { + this.update({ deferUpdates: shouldDefer }); } + this.updatesAreDeferred = shouldDefer; } applyUpdate() { diff --git a/src/types/pivot.ts b/src/types/pivot.ts index 85bfa2f053..04aef104bd 100644 --- a/src/types/pivot.ts +++ b/src/types/pivot.ts @@ -52,6 +52,7 @@ export interface CommonPivotCoreDefinition { rows: PivotCoreDimension[]; measures: PivotCoreMeasure[]; name: string; + deferUpdates?: boolean; } export interface SpreadsheetPivotCoreDefinition extends CommonPivotCoreDefinition { diff --git a/tests/pivots/spreadsheet_pivot/spreadsheet_pivot_side_panel.test.ts b/tests/pivots/spreadsheet_pivot/spreadsheet_pivot_side_panel.test.ts index d3e2db2a97..73e3ff3396 100644 --- a/tests/pivots/spreadsheet_pivot/spreadsheet_pivot_side_panel.test.ts +++ b/tests/pivots/spreadsheet_pivot/spreadsheet_pivot_side_panel.test.ts @@ -305,6 +305,21 @@ describe("Spreadsheet pivot side panel", () => { expect(fixture.querySelectorAll(".pivot-dimension")).toHaveLength(0); }); + test("defer update option is persistent", async () => { + const pivotId = model.getters.getPivotIds()[0]; + expect(".pivot-defer-update input").toHaveValue(false); + expect(model.getters.getPivotCoreDefinition(pivotId).deferUpdates).toBeFalsy(); + + await click(fixture, ".pivot-defer-update input"); + expect(".pivot-defer-update input").toHaveValue(true); + expect(model.getters.getPivotCoreDefinition(pivotId).deferUpdates).toBeTruthy(); + + await click(fixture, ".o-sidePanelClose"); + env.openSidePanel("PivotSidePanel", { pivotId }); + await nextTick(); + expect(".pivot-defer-update input").toHaveValue(true); + }); + test("Measures have the correct default aggregator", async () => { setCellContent(model, "A1", "amount"); setCellContent(model, "A2", "10");