twenty / packages /twenty-server /src /modules /dashboard /chart-data /utils /format-dimension-value.util.ts
Jules
Initial clean CRM deployment with prebuilt assets
d9494a5
Raw
History Blame Contribute Delete
4.22 kB
import { t } from '@lingui/core/macro';
import { isNonEmptyString, isNumber } from '@sniptt/guards';
import {
FieldMetadataType,
type FirstDayOfTheWeek,
ObjectRecordGroupByDateGranularity,
} from 'twenty-shared/types';
import {
formatToShortNumber,
isDefined,
parseToPlainDateOrThrow,
} from 'twenty-shared/utils';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { GRAPH_DEFAULT_DATE_GRANULARITY } from 'src/modules/dashboard/chart-data/constants/graph-default-date-granularity.constant';
import { formatDateByGranularity } from 'src/modules/dashboard/chart-data/utils/format-date-by-granularity';
type FormatDimensionValueParams = {
value: unknown;
fieldMetadata: FlatFieldMetadata;
dateGranularity?: ObjectRecordGroupByDateGranularity;
subFieldName?: string;
userTimezone: string;
firstDayOfTheWeek: FirstDayOfTheWeek;
};
const normalizeMultiSelectValue = (value: unknown): unknown[] => {
if (Array.isArray(value)) {
return value;
}
if (typeof value !== 'string') {
return [value];
}
const trimmed = value.trim();
const isPostgresArrayFormat =
trimmed.startsWith('{') && trimmed.endsWith('}');
if (!isPostgresArrayFormat) {
return [value];
}
const content = trimmed.slice(1, -1);
return content ? content.split(',') : [];
};
export const formatDimensionValue = ({
value,
fieldMetadata,
dateGranularity,
subFieldName,
userTimezone,
firstDayOfTheWeek,
}: FormatDimensionValueParams): string => {
if (!isDefined(value)) {
return t`Not Set`;
}
const effectiveDateGranularity = (dateGranularity ??
GRAPH_DEFAULT_DATE_GRANULARITY) as ObjectRecordGroupByDateGranularity;
switch (fieldMetadata.type) {
case FieldMetadataType.SELECT: {
const selectedOption = fieldMetadata.options?.find(
(option) => option.value === value,
);
return selectedOption?.label ?? String(value);
}
case FieldMetadataType.MULTI_SELECT: {
const values = normalizeMultiSelectValue(value);
return values
.map((value) => {
const option = fieldMetadata.options?.find(
(option) => option.value === value,
);
return option?.label ?? String(value);
})
.join(', ');
}
case FieldMetadataType.BOOLEAN: {
return value === true ? t`Yes` : t`No`;
}
case FieldMetadataType.DATE:
case FieldMetadataType.DATE_TIME: {
if (
effectiveDateGranularity ===
ObjectRecordGroupByDateGranularity.DAY_OF_THE_WEEK ||
effectiveDateGranularity ===
ObjectRecordGroupByDateGranularity.MONTH_OF_THE_YEAR ||
effectiveDateGranularity ===
ObjectRecordGroupByDateGranularity.QUARTER_OF_THE_YEAR
) {
return String(value);
}
const parsedPlainDate = parseToPlainDateOrThrow(String(value));
return formatDateByGranularity(
parsedPlainDate,
effectiveDateGranularity,
userTimezone,
firstDayOfTheWeek,
);
}
case FieldMetadataType.RELATION: {
if (isDefined(dateGranularity)) {
const parsedDayString = String(value);
if (
dateGranularity ===
ObjectRecordGroupByDateGranularity.DAY_OF_THE_WEEK ||
dateGranularity ===
ObjectRecordGroupByDateGranularity.MONTH_OF_THE_YEAR ||
dateGranularity ===
ObjectRecordGroupByDateGranularity.QUARTER_OF_THE_YEAR
) {
return String(value);
}
return parsedDayString;
}
return String(value);
}
case FieldMetadataType.NUMBER:
case FieldMetadataType.CURRENCY: {
if (
fieldMetadata.type === FieldMetadataType.CURRENCY &&
subFieldName === 'currencyCode'
) {
if (!isNonEmptyString(value)) {
return t`Not Set`;
}
return String(value);
}
const numericValue = isNumber(value) ? value : Number(value);
if (isNaN(numericValue)) {
return String(value);
}
return formatToShortNumber(numericValue);
}
default:
return String(value);
}
};