Skip to content

Commit a84e0f1

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 #8095 Task: 5949522 X-original-commit: 8760b90 Signed-off-by: Lucas Lefèvre (lul) <lul@odoo.com> Signed-off-by: Marceline Thomas (matho) <matho@odoo.com>
1 parent 8dcb087 commit a84e0f1

File tree

3 files changed

+48
-4
lines changed

3 files changed

+48
-4
lines changed

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
@@ -257,8 +257,7 @@ export class PivotSidePanelStore extends SpreadsheetStore {
257257
for (const dimension of columnsWithGranularity.concat(rowsWithGranularity)) {
258258
const fieldType = fields[dimension.fieldName]?.type;
259259
if ((fieldType === "date" || fieldType === "datetime") && !dimension.granularity) {
260-
const granularity =
261-
unusedGranularities[dimension.fieldName]?.values().next().value || "year";
260+
const granularity = unusedGranularities[dimension.fieldName]?.values().next().value;
262261
unusedGranularities[dimension.fieldName]?.delete(granularity);
263262
dimension.granularity = granularity;
264263
}
@@ -291,7 +290,7 @@ export class PivotSidePanelStore extends SpreadsheetStore {
291290
);
292291
}
293292
for (const field of dateFields) {
294-
granularitiesPerFields[field.fieldName].delete(field.granularity || "month");
293+
granularitiesPerFields[field.fieldName].delete(field.granularity);
295294
}
296295
return granularitiesPerFields;
297296
}

src/helpers/pivot/pivot_registry.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,19 @@ const dateGranularities = [
5252
"day_of_week",
5353
];
5454

55+
export const datetimeGranularities = [
56+
...dateGranularities,
57+
"hour_number",
58+
"minute_number",
59+
"second_number",
60+
];
61+
5562
pivotRegistry.add("SPREADSHEET", {
5663
ui: SpreadsheetPivot,
5764
definition: SpreadsheetPivotRuntimeDefinition,
5865
dateGranularities: [...dateGranularities],
59-
datetimeGranularities: [...dateGranularities, "hour_number", "minute_number", "second_number"],
6066
isMeasureCandidate: (field: PivotField) => field.type !== "boolean",
67+
datetimeGranularities: [...datetimeGranularities],
6168
isGroupable: () => true,
6269
adaptRanges: (getters, definition, applyChange) => {
6370
if (definition.type !== "SPREADSHEET" || !definition.dataSet) {

tests/pivots/spreadsheet_pivot/spreadsheet_pivot_side_panel.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Model, PivotSortedColumn, SpreadsheetChildEnv } from "../../../src";
22
import { PIVOT_TABLE_CONFIG, PIVOT_TOKEN_COLOR } from "../../../src/constants";
33
import { toXC, toZone } from "../../../src/helpers";
4+
import { datetimeGranularities } from "../../../src/helpers/pivot/pivot_registry";
45
import { SpreadsheetPivot } from "../../../src/helpers/pivot/spreadsheet_pivot/spreadsheet_pivot";
56
import { topbarMenuRegistry } from "../../../src/registries/menus";
67
import { NotificationStore } from "../../../src/stores/notification_store";
@@ -563,6 +564,43 @@ describe("Spreadsheet pivot side panel", () => {
563564
]);
564565
});
565566

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

0 commit comments

Comments
 (0)