[DASHBOARDS] Add split multi-value fields setting for charts (#17907)

closes https://github.com/twentyhq/twenty/issues/17890



https://github.com/user-attachments/assets/dbf2ebe6-c2da-44d0-846e-d7fa9fac5f43
This commit is contained in:
nitin
2026-02-17 13:59:17 +05:30
committed by GitHub
parent c3d565f266
commit cfc4e0e343
37 changed files with 557 additions and 24 deletions
@@ -6,6 +6,7 @@ import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-m
export type GroupByRegularField = {
fieldMetadata: FlatFieldMetadata;
subFieldName?: string;
shouldUnnest?: boolean;
};
export type GroupByDateField = {
@@ -3,7 +3,10 @@ import {
ObjectRecordGroupByDateGranularity,
} from 'twenty-shared/types';
import { type GroupByDateField } from 'src/engine/api/common/common-query-runners/types/group-by-field.types';
import {
type GroupByDateField,
type GroupByRegularField,
} from 'src/engine/api/common/common-query-runners/types/group-by-field.types';
import { getGroupByExpression } from 'src/engine/api/common/common-query-runners/utils/get-group-by-expression.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
@@ -23,6 +26,16 @@ const buildGroupByDateField = (
...overrides,
});
const buildGroupByRegularField = (
overrides: Partial<GroupByRegularField> = {},
): GroupByRegularField => ({
fieldMetadata: {
type: FieldMetadataType.MULTI_SELECT,
name: 'tags',
} as FlatFieldMetadata,
...overrides,
});
describe('getGroupByExpression', () => {
const columnNameWithQuotes = '"company"."createdAt"';
@@ -126,4 +139,36 @@ describe('getGroupByExpression', () => {
expect(result).not.toContain('AT TIME ZONE');
});
});
describe('array unnest handling', () => {
const arrayColumnNameWithQuotes = '"company"."tags"';
it('should unnest array fields when split mode is enabled', () => {
const groupByField = buildGroupByRegularField({
shouldUnnest: true,
});
const result = getGroupByExpression({
groupByField,
columnNameWithQuotes: arrayColumnNameWithQuotes,
});
expect(result).toBe(
`UNNEST(CASE WHEN CARDINALITY(${arrayColumnNameWithQuotes}) > 0 THEN ${arrayColumnNameWithQuotes} ELSE ARRAY[${arrayColumnNameWithQuotes}[1]] END)`,
);
});
it('should keep plain column expression when split mode is disabled', () => {
const groupByField = buildGroupByRegularField({
shouldUnnest: false,
});
const result = getGroupByExpression({
groupByField,
columnNameWithQuotes: arrayColumnNameWithQuotes,
});
expect(result).toBe(arrayColumnNameWithQuotes);
});
});
});
@@ -30,6 +30,10 @@ export const getGroupByExpression = ({
if (
!(isGroupByDateField(groupByField) || isGroupByRelationField(groupByField))
) {
if ('shouldUnnest' in groupByField && groupByField.shouldUnnest) {
return `UNNEST(CASE WHEN CARDINALITY(${columnNameWithQuotes}) > 0 THEN ${columnNameWithQuotes} ELSE ARRAY[${columnNameWithQuotes}[1]] END)`;
}
return columnNameWithQuotes;
}