Skip to content

Commit 51e20f8

Browse files
committed
[FIX] pivot: can add the same granularity
we can add multiple time the same date granularity it shouldn't be possible closes #8098 Task: 5949522 X-original-commit: b8f8da3 Signed-off-by: Lucas Lefèvre (lul) <lul@odoo.com> Signed-off-by: Marceline Thomas (matho) <matho@odoo.com>
1 parent dad9584 commit 51e20f8

File tree

3 files changed

+49
-5
lines changed

3 files changed

+49
-5
lines changed

packages/o-spreadsheet-engine/src/helpers/pivot/pivot_registry.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,19 @@ const dateGranularities = [
5757
"day_of_week",
5858
];
5959

60+
export const datetimeGranularities = [
61+
...dateGranularities,
62+
"hour_number",
63+
"minute_number",
64+
"second_number",
65+
];
66+
6067
pivotRegistry.add("SPREADSHEET", {
6168
ui: SpreadsheetPivot,
6269
definition: SpreadsheetPivotRuntimeDefinition,
6370
dateGranularities: [...dateGranularities],
64-
datetimeGranularities: [...dateGranularities, "hour_number", "minute_number", "second_number"],
6571
isMeasureCandidate: (field: PivotField) => field.type !== "boolean",
72+
datetimeGranularities: [...datetimeGranularities],
6673
isGroupable: () => true,
6774
canHaveCustomGroup: (field: PivotField) => field.type === "char" && !field.isCustomField,
6875
isPivotUnused: () => true,

src/components/side_panel/pivot/pivot_side_panel/pivot_side_panel_store.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,7 @@ export class PivotSidePanelStore extends SpreadsheetStore {
280280
for (const dimension of columnsWithGranularity.concat(rowsWithGranularity)) {
281281
const fieldType = fields[dimension.fieldName]?.type;
282282
if ((fieldType === "date" || fieldType === "datetime") && !dimension.granularity) {
283-
const granularity =
284-
unusedGranularities[dimension.fieldName]?.values().next().value || "year";
283+
const granularity = unusedGranularities[dimension.fieldName]?.values().next().value;
285284
unusedGranularities[dimension.fieldName]?.delete(granularity);
286285
dimension.granularity = granularity;
287286
}
@@ -314,7 +313,7 @@ export class PivotSidePanelStore extends SpreadsheetStore {
314313
);
315314
}
316315
for (const field of dateFields) {
317-
granularitiesPerFields[field.fieldName].delete(field.granularity || "month");
316+
granularitiesPerFields[field.fieldName].delete(field.granularity);
318317
}
319318
return granularitiesPerFields;
320319
}

tests/pivots/spreadsheet_pivot/spreadsheet_pivot_side_panel.test.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import {
44
PIVOT_INSERT_TABLE_STYLE_ID,
55
PIVOT_TOKEN_COLOR,
66
} from "@odoo/o-spreadsheet-engine/constants";
7+
import { datetimeGranularities } from "@odoo/o-spreadsheet-engine/helpers/pivot/pivot_registry";
78
import { SpreadsheetPivot } from "@odoo/o-spreadsheet-engine/helpers/pivot/spreadsheet_pivot/spreadsheet_pivot";
89
import { SpreadsheetChildEnv } from "@odoo/o-spreadsheet-engine/types/spreadsheet_env";
910
import { Model, PivotSortedColumn, SpreadsheetPivotTable } from "../../../src";
1011
import { SidePanels } from "../../../src/components/side_panel/side_panels/side_panels";
1112
import { toXC, toZone } from "../../../src/helpers";
12-
import { topbarMenuRegistry } from "../../../src/registries/menus";
13+
import { topbarMenuRegistry } from "../../../src/registries/menus/topbar_menu_registry";
1314
import { NotificationStore } from "../../../src/stores/notification_store";
1415
import {
1516
activateSheet,
@@ -575,6 +576,43 @@ describe("Spreadsheet pivot side panel", () => {
575576
]);
576577
});
577578

579+
test("All granularities are displayed in order and not more than once", async () => {
580+
setCellContent(model, "G1", "=PIVOT(1)"); // TODO: remove once task 4781740 is done
581+
setCellContent(model, "A1", "Date");
582+
setCellContent(model, "A2", "2023-01-01");
583+
setCellContent(model, "A3", "2023-01-02");
584+
updatePivot(model, "1", {
585+
columns: [],
586+
measures: [{ id: "Amount:sum", fieldName: "Amount", aggregator: "sum" }],
587+
});
588+
await nextTick();
589+
590+
for (let i = 0; i < datetimeGranularities.length; i++) {
591+
await click(fixture.querySelector(".add-dimension")!);
592+
await click(fixture.querySelectorAll(".o-autocomplete-value")[0]);
593+
}
594+
595+
expect(model.getters.getPivotCoreDefinition("1").columns).toMatchObject([
596+
{ fieldName: "Date", granularity: "year" },
597+
{ fieldName: "Date", granularity: "quarter_number" },
598+
{ fieldName: "Date", granularity: "month_number" },
599+
{ fieldName: "Date", granularity: "month" },
600+
{ fieldName: "Date", granularity: "iso_week_number" },
601+
{ fieldName: "Date", granularity: "day_of_month" },
602+
{ fieldName: "Date", granularity: "day" },
603+
{ fieldName: "Date", granularity: "day_of_week" },
604+
{ fieldName: "Date", granularity: "hour_number" },
605+
{ fieldName: "Date", granularity: "minute_number" },
606+
{ fieldName: "Date", granularity: "second_number" },
607+
]);
608+
609+
await click(fixture.querySelector(".add-dimension")!);
610+
const availableFields = [...fixture.querySelectorAll(".o-autocomplete-value")].map(
611+
(el) => el.textContent
612+
);
613+
expect(availableFields).not.toContain("Date");
614+
});
615+
578616
test("Date dimensions with undefined granularity is correctly displayed as month", async () => {
579617
setCellContent(model, "G1", "=PIVOT(1)"); // TODO: remove once task 4781740 is done
580618
setCellContent(model, "A1", "Date");

0 commit comments

Comments
 (0)