Number display formatting (#1556)
* number display formatting * - add tests
This commit is contained in:
@ -1,6 +1,6 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
import { formatNumber } from '~/utils/formatNumber';
|
import { formatNumber } from '~/utils/format/number';
|
||||||
|
|
||||||
const StyledTextInputDisplay = styled.div`
|
const StyledTextInputDisplay = styled.div`
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|||||||
@ -0,0 +1,22 @@
|
|||||||
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
|
import { formatNumber } from '~/utils/format/number';
|
||||||
|
|
||||||
|
const StyledNumberDisplay = styled.div`
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 100%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
type OwnProps = {
|
||||||
|
value: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export function NumberDisplay({ value }: OwnProps) {
|
||||||
|
return (
|
||||||
|
<StyledNumberDisplay>
|
||||||
|
{value && formatNumber(Number(value))}
|
||||||
|
</StyledNumberDisplay>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import { useContext } from 'react';
|
import { useContext } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { TextDisplay } from '@/ui/content-display/components/TextDisplay';
|
import { NumberDisplay } from '@/ui/content-display/components/NumberDisplay';
|
||||||
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
|
import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope';
|
||||||
|
|
||||||
import { EditableFieldDefinitionContext } from '../contexts/EditableFieldDefinitionContext';
|
import { EditableFieldDefinitionContext } from '../contexts/EditableFieldDefinitionContext';
|
||||||
@ -34,7 +34,7 @@ export function GenericEditableNumberField() {
|
|||||||
<EditableField
|
<EditableField
|
||||||
IconLabel={currentEditableFieldDefinition.Icon}
|
IconLabel={currentEditableFieldDefinition.Icon}
|
||||||
editModeContent={<GenericEditableNumberFieldEditMode />}
|
editModeContent={<GenericEditableNumberFieldEditMode />}
|
||||||
displayModeContent={<TextDisplay text={fieldValue} />}
|
displayModeContent={<NumberDisplay value={fieldValue} />}
|
||||||
isDisplayModeContentEmpty={!fieldValue}
|
isDisplayModeContentEmpty={!fieldValue}
|
||||||
/>
|
/>
|
||||||
</RecoilScope>
|
</RecoilScope>
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
|
||||||
import { TextDisplay } from '@/ui/content-display/components/TextDisplay';
|
import { NumberDisplay } from '@/ui/content-display/components/NumberDisplay';
|
||||||
import type { ViewFieldNumberMetadata } from '@/ui/editable-field/types/ViewField';
|
import type { ViewFieldNumberMetadata } from '@/ui/editable-field/types/ViewField';
|
||||||
import { EditableCell } from '@/ui/table/editable-cell/components/EditableCell';
|
import { EditableCell } from '@/ui/table/editable-cell/components/EditableCell';
|
||||||
import { useCurrentRowEntityId } from '@/ui/table/hooks/useCurrentEntityId';
|
import { useCurrentRowEntityId } from '@/ui/table/hooks/useCurrentEntityId';
|
||||||
@ -36,7 +36,7 @@ export function GenericEditableNumberCell({
|
|||||||
columnDefinition={columnDefinition}
|
columnDefinition={columnDefinition}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
nonEditModeContent={<TextDisplay text={fieldValue} />}
|
nonEditModeContent={<NumberDisplay value={fieldValue} />}
|
||||||
></EditableCell>
|
></EditableCell>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
17
front/src/utils/format/__tests__/number.test.ts
Normal file
17
front/src/utils/format/__tests__/number.test.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { formatNumber } from '../number';
|
||||||
|
|
||||||
|
// This tests the en-US locale by default
|
||||||
|
describe('formatNumber', () => {
|
||||||
|
it(`Should format 123 correctly`, () => {
|
||||||
|
expect(formatNumber(123)).toEqual('123');
|
||||||
|
});
|
||||||
|
it(`Should format decimal numbers correctly`, () => {
|
||||||
|
expect(formatNumber(123.92)).toEqual('123.92');
|
||||||
|
});
|
||||||
|
it(`Should format large numbers correctly`, () => {
|
||||||
|
expect(formatNumber(1234567)).toEqual('1,234,567');
|
||||||
|
});
|
||||||
|
it(`Should format large numbers with a decimal point correctly`, () => {
|
||||||
|
expect(formatNumber(7654321.89)).toEqual('7,654,321.89');
|
||||||
|
});
|
||||||
|
});
|
||||||
3
front/src/utils/format/number.ts
Normal file
3
front/src/utils/format/number.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export function formatNumber(value: number): string {
|
||||||
|
return value.toLocaleString();
|
||||||
|
}
|
||||||
@ -1,4 +0,0 @@
|
|||||||
export function formatNumber(value: number) {
|
|
||||||
// Formats the value to a string and add commas to it ex: 50,000 | 500,000
|
|
||||||
return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user