feat: ability to switch currency format (#12542)

Fixes #11927

I have added 'format' in the zod schema of currency, and for using it, I
am separately passing 'format' to 'currencyDisplay.'
The feature is working correctly.

---------

Co-authored-by: prastoin <paul@twenty.com>
Co-authored-by: Paul Rastoin <45004772+prastoin@users.noreply.github.com>
This commit is contained in:
Mohit Agrawal
2025-06-24 13:58:50 +05:30
committed by GitHub
parent 6651abae18
commit d0126e22ee
13 changed files with 122 additions and 33 deletions

View File

@ -1,9 +1,9 @@
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { FieldCurrencyValue } from '@/object-record/record-field/types/FieldMetadata';
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { isDefined } from 'twenty-shared/utils';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { convertCurrencyMicrosToCurrencyAmount } from '~/utils/convertCurrencyToCurrencyMicros';
import { isDefined } from 'twenty-shared/utils';
export const useExportProcessRecordsForCSV = (objectNameSingular: string) => {
const { objectMetadataItem } = useObjectMetadataItem({

View File

@ -2,7 +2,12 @@ import { useCurrencyFieldDisplay } from '@/object-record/record-field/meta-types
import { CurrencyDisplay } from '@/ui/field/display/components/CurrencyDisplay';
export const CurrencyFieldDisplay = () => {
const { fieldValue } = useCurrencyFieldDisplay();
const { fieldValue, fieldDefinition } = useCurrencyFieldDisplay();
return <CurrencyDisplay currencyValue={fieldValue} />;
return (
<CurrencyDisplay
currencyValue={fieldValue}
fieldDefinition={fieldDefinition}
/>
);
};

View File

@ -2,12 +2,21 @@ import { useContext } from 'react';
import { useRecordFieldValue } from '@/object-record/record-store/contexts/RecordFieldValueSelectorContext';
import { assertFieldMetadata } from '@/object-record/record-field/types/guards/assertFieldMetadata';
import { isFieldCurrency } from '@/object-record/record-field/types/guards/isFieldCurrency';
import { FieldMetadataType } from 'twenty-shared/types';
import { FieldContext } from '../../contexts/FieldContext';
import { FieldCurrencyValue } from '../../types/FieldMetadata';
export const useCurrencyFieldDisplay = () => {
const { recordId, fieldDefinition } = useContext(FieldContext);
assertFieldMetadata(
FieldMetadataType.CURRENCY,
isFieldCurrency,
fieldDefinition,
);
const fieldName = fieldDefinition.metadata.fieldName;
const fieldValue = useRecordFieldValue<FieldCurrencyValue | undefined>(

View File

@ -84,7 +84,9 @@ export type FieldLinksMetadata = BaseFieldMetadata & {
export type FieldCurrencyMetadata = BaseFieldMetadata & {
placeHolder: string;
isPositive?: boolean;
settings?: null;
settings?: {
format: FieldCurrencyFormat | null;
};
};
export type FieldFullNameMetadata = BaseFieldMetadata & {
@ -211,6 +213,9 @@ export type FieldLinksValue = {
primaryLinkUrl: string | null;
secondaryLinks?: { label: string | null; url: string | null }[] | null;
};
export const fieldMetadataCurrencyFormat = ['short', 'full'] as const;
export type FieldCurrencyFormat = (typeof fieldMetadataCurrencyFormat)[number];
export type FieldCurrencyValue = {
currencyCode: CurrencyCode;
amountMicros: number | null;

View File

@ -0,0 +1,6 @@
import { fieldMetadataCurrencyFormat } from '@/object-record/record-field/types/FieldMetadata';
import { z } from 'zod';
export const currencyFieldSettingsSchema = z.object({
format: z.enum(fieldMetadataCurrencyFormat),
});

View File

@ -1,9 +1,9 @@
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { FieldCurrencyValue } from '@/object-record/record-field/types/FieldMetadata';
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { isDefined } from 'twenty-shared/utils';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import { convertCurrencyMicrosToCurrencyAmount } from '~/utils/convertCurrencyToCurrencyMicros';
import { isDefined } from 'twenty-shared/utils';
export const useExportProcessRecordsForCSV = (objectNameSingular: string) => {
const { objectMetadataItem } = useObjectMetadataItem({